1 // @(#)root/minuit2:$Id$ 2 // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei 2003-2005 3 4 /********************************************************************** 5 * * 6 * Copyright (c) 2005 LCG ROOT Math team, CERN/PH-SFT * 7 * * 8 **********************************************************************/ 9 10 #ifndef ROOT_Minuit2_MnReferenceCounter 11 #define ROOT_Minuit2_MnReferenceCounter 12 13 #include <cassert> 14 15 #include "StackAllocator.h" 16 17 namespace ROOT { 18 19 namespace Minuit2 { 20 21 // extern StackAllocator gStackAllocator; 22 23 class MnReferenceCounter { 24 25 public: MnReferenceCounter()26 MnReferenceCounter() : fReferences(0) {} 27 MnReferenceCounter(const MnReferenceCounter & other)28 MnReferenceCounter(const MnReferenceCounter &other) : fReferences(other.fReferences) {} 29 30 MnReferenceCounter &operator=(const MnReferenceCounter &other) 31 { 32 fReferences = other.fReferences; 33 return *this; 34 } 35 ~MnReferenceCounter()36 ~MnReferenceCounter() { assert(fReferences == 0); } 37 new(size_t nbytes)38 void *operator new(size_t nbytes) { return StackAllocatorHolder::Get().Allocate(nbytes); } 39 delete(void * p,size_t)40 void operator delete(void *p, size_t /*nbytes */) { StackAllocatorHolder::Get().Deallocate(p); } 41 References()42 unsigned int References() const { return fReferences; } 43 AddReference()44 void AddReference() const { fReferences++; } 45 RemoveReference()46 void RemoveReference() const { fReferences--; } 47 48 private: 49 mutable unsigned int fReferences; 50 }; 51 52 } // namespace Minuit2 53 54 } // namespace ROOT 55 56 #endif // ROOT_Minuit2_MnReferenceCounter 57