// @(#)root/minuit2:$Id$ // Authors: M. Winkler, F. James, L. Moneta, A. Zsenei 2003-2005 /********************************************************************** * * * Copyright (c) 2005 LCG ROOT Math team, CERN/PH-SFT * * * **********************************************************************/ #ifndef ROOT_Minuit2_MnReferenceCounter #define ROOT_Minuit2_MnReferenceCounter #include #include "StackAllocator.h" namespace ROOT { namespace Minuit2 { // extern StackAllocator gStackAllocator; class MnReferenceCounter { public: MnReferenceCounter() : fReferences(0) {} MnReferenceCounter(const MnReferenceCounter &other) : fReferences(other.fReferences) {} MnReferenceCounter &operator=(const MnReferenceCounter &other) { fReferences = other.fReferences; return *this; } ~MnReferenceCounter() { assert(fReferences == 0); } void *operator new(size_t nbytes) { return StackAllocatorHolder::Get().Allocate(nbytes); } void operator delete(void *p, size_t /*nbytes */) { StackAllocatorHolder::Get().Deallocate(p); } unsigned int References() const { return fReferences; } void AddReference() const { fReferences++; } void RemoveReference() const { fReferences--; } private: mutable unsigned int fReferences; }; } // namespace Minuit2 } // namespace ROOT #endif // ROOT_Minuit2_MnReferenceCounter