00001 // @(#)root/minuit2:$Id: MnReferenceCounter.h 20880 2007-11-19 11:23:41Z rdm $ 00002 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei 2003-2005 00003 00004 /********************************************************************** 00005 * * 00006 * Copyright (c) 2005 LCG ROOT Math team, CERN/PH-SFT * 00007 * * 00008 **********************************************************************/ 00009 00010 #ifndef ROOT_Minuit2_MnReferenceCounter 00011 #define ROOT_Minuit2_MnReferenceCounter 00012 00013 #include <cassert> 00014 00015 #include "StackAllocator.h" 00016 00017 namespace ROOT { 00018 00019 namespace Minuit2 { 00020 00021 00022 //extern StackAllocator gStackAllocator; 00023 00024 class MnReferenceCounter { 00025 00026 public: 00027 00028 MnReferenceCounter() : fReferences(0) {} 00029 00030 MnReferenceCounter(const MnReferenceCounter& other) : 00031 fReferences(other.fReferences) {} 00032 00033 MnReferenceCounter& operator=(const MnReferenceCounter& other) { 00034 fReferences = other.fReferences; 00035 return *this; 00036 } 00037 00038 ~MnReferenceCounter() {assert(fReferences == 0);} 00039 00040 void* operator new(size_t nbytes) { 00041 return StackAllocatorHolder::Get().Allocate(nbytes); 00042 } 00043 00044 void operator delete(void* p, size_t /*nbytes */) { 00045 StackAllocatorHolder::Get().Deallocate(p); 00046 } 00047 00048 unsigned int References() const {return fReferences;} 00049 00050 void AddReference() const {fReferences++;} 00051 00052 void RemoveReference() const {fReferences--;} 00053 00054 private: 00055 00056 mutable unsigned int fReferences; 00057 }; 00058 00059 } // namespace Minuit2 00060 00061 } // namespace ROOT 00062 00063 #endif // ROOT_Minuit2_MnReferenceCounter