10 #ifndef ROOT_Minuit2_MnRefCountedPointer 
   11 #define ROOT_Minuit2_MnRefCountedPointer 
   20 template<
class T> 
class MnRefCountedPointer {
 
   25   MnRefCountedPointer() : fPtr(0), fCounter(0) {}
 
   27   MnRefCountedPointer(T* pt) :
 
   28     fPtr(pt), fCounter(new MnReferenceCounter()) {AddReference();}
 
   30   MnRefCountedPointer(
const MnRefCountedPointer<T>& other) :
 
   31     fPtr(other.fPtr), fCounter(other.fCounter) {AddReference();}
 
   33   ~MnRefCountedPointer() {
 
   41     if(References() != 0) RemoveReference();
 
   44   bool IsValid()
 const {
return fPtr != 0;}
 
   46   MnRefCountedPointer& operator=(
const MnRefCountedPointer<T>& other) {
 
   47     if(
this != &other && fPtr != other.fPtr) {
 
   50       fCounter = other.fCounter;
 
   56   MnRefCountedPointer& operator=(T* ptr) {
 
   59       fCounter = 
new MnReferenceCounter();
 
   64   T* Get()
 const {
return fPtr;}
 
   66   T* operator->()
 const {DoCheck(); 
return fPtr;}
 
   68   T& operator*()
 const {DoCheck(); 
return *fPtr;}
 
   70   bool operator==(
const  T* otherP)
 const {
return fPtr == otherP;}
 
   72   bool operator<(
const  T* otherP)
 const {
return fPtr < otherP;}
 
   74   unsigned int References()
 const {
return fCounter->References();}
 
   76   void AddReference()
 const {fCounter->AddReference();}
 
   78   void RemoveReference() {
 
   79     fCounter->RemoveReference();
 
   80     if(References() == 0) {
 
   82       delete fCounter; fCounter=0;
 
   89   MnReferenceCounter* fCounter;
 
   93   void DoCheck()
 const {assert(IsValid());}
 
  100 #endif  // ROOT_Minuit2_MnRefCountedPointer