* Update mmanager to version from article part 5.
[matthijs/ABM2.git] / ABM2 / Engine / mmanager.h
1 #ifndef MMANAGER_H_INCLUDED\r
2 #define MMANAGER_H_INCLUDED\r
3 \r
4 #include <list>\r
5 #include <cassert>\r
6 \r
7 class IMMObject\r
8 {\r
9         private:\r
10                 static IMMObject * liveObjects;\r
11                 static IMMObject * deadObjects;\r
12                 IMMObject *nextObject;\r
13                 IMMObject *prevObject;\r
14                 long refCount;\r
15                 bool bIsStackAllocated;\r
16                 static std::list<IMMObject*> heapObjects;\r
17                 static unsigned long heapUsage;\r
18                 unsigned long heapAllocSize;\r
19         protected:\r
20                 IMMObject();\r
21                 virtual ~IMMObject();\r
22         public:\r
23                 void AddRef();\r
24                 void Release();\r
25                 static void CollectGarbage();\r
26                 static void CollectRemainingObjects(bool bEmitWarnings=false);\r
27                 virtual unsigned long size()=0;\r
28                 void *operator new(size_t size);\r
29                 void operator delete(void* obj);\r
30 };\r
31 \r
32 #define AUTO_SIZE unsigned long size(){return sizeof(*this);}\r
33 \r
34 template<class T>\r
35 class CMMPointer\r
36 {\r
37 protected:\r
38         T* obj;\r
39 public:\r
40         CMMPointer(){obj=0;}\r
41         CMMPointer(T *o){obj=0; *this=o;}\r
42         CMMPointer(const CMMPointer<T> &p){obj=0; *this=p;}\r
43 \r
44         ~CMMPointer(){if(obj)obj->Release();}\r
45 \r
46         inline CMMPointer<T> &operator =(const CMMPointer<T> &p)\r
47         {\r
48                 if(obj)obj->Release();\r
49                 obj=p.obj;\r
50                 if(obj)obj->AddRef();\r
51                 return *this;\r
52         }\r
53         inline CMMPointer<T> &operator =(T* o)\r
54         {\r
55                 if(obj)obj->Release();\r
56                 obj=o;\r
57                 if(obj)obj->AddRef();\r
58                 return *this;\r
59         }\r
60 \r
61         inline T& operator *() const\r
62         {\r
63                 assert(obj!=0 && "Tried to * a NULL smart pointer");\r
64                 return *obj;\r
65         }\r
66 \r
67         inline T* operator ->() const\r
68         {\r
69                 assert(obj!=0 && "Tried to -> on a NULL smart pointer");\r
70                 return obj;\r
71         }\r
72 \r
73         inline operator T*() const\r
74         {\r
75                 return obj;\r
76         }\r
77 \r
78         inline bool operator !(){return !(obj);}\r
79 \r
80         inline bool isValid() const\r
81         {return (obj!=0);}\r
82 \r
83         inline bool operator ==(const CMMPointer<T> &p) const \r
84         {\r
85                 return (obj==p.obj);\r
86         }\r
87         inline bool operator ==(const T* o) const\r
88         {\r
89                 return (obj==o);\r
90         }\r
91 };\r
92 \r
93 template<class T, int i>\r
94 class CMMBlob : public IMMObject\r
95 {\r
96         protected:\r
97         T buffer[i];\r
98         public:\r
99         inline T& operator [](int index){assert(index<i); return buffer[index];}\r
100         inline operator T*(){return buffer;}\r
101         AUTO_SIZE;\r
102 };\r
103 \r
104 template<class T>\r
105 class CMMDynamicBlob : public IMMObject\r
106 {\r
107         protected:\r
108         unsigned long dataSize;\r
109         T *buffer;\r
110         public:\r
111         inline T& operator [](int index){assert(index<dataSize); return buffer[index];}\r
112         inline operator T*(){return buffer;}\r
113         CMMDynamicBlob(unsigned long size){dataSize=size; buffer=new T[size]; }\r
114         ~CMMDynamicBlob(){if(buffer)delete[] buffer;}\r
115         unsigned long size(){return dataSize*sizeof(T) + sizeof(this); }\r
116         unsigned long blobsize(){return dataSize;}\r
117 };\r
118 \r
119 #endif\r