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