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