1 #ifndef MMANAGER_H_INCLUDED
\r
2 #define MMANAGER_H_INCLUDED
\r
10 static IMMObject * liveObjects;
\r
11 static IMMObject * deadObjects;
\r
12 IMMObject *nextObject;
\r
13 IMMObject *prevObject;
\r
15 bool bIsStackAllocated;
\r
16 static std::list<IMMObject*> heapObjects;
\r
17 static unsigned long heapUsage;
\r
18 unsigned long heapAllocSize;
\r
21 virtual ~IMMObject();
\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
32 #define AUTO_SIZE unsigned long size(){return sizeof(*this);}
\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
44 ~CMMPointer(){if(obj)obj->Release();}
\r
46 inline CMMPointer<T> &operator =(const CMMPointer<T> &p)
\r
48 if(obj)obj->Release();
\r
50 if(obj)obj->AddRef();
\r
53 inline CMMPointer<T> &operator =(T* o)
\r
55 if(obj)obj->Release();
\r
57 if(obj)obj->AddRef();
\r
61 inline T& operator *() const
\r
63 assert(obj!=0 && "Tried to * a NULL smart pointer");
\r
67 inline T* operator ->() const
\r
69 assert(obj!=0 && "Tried to -> on a NULL smart pointer");
\r
73 inline operator T*() const
\r
78 inline bool operator !(){return !(obj);}
\r
80 inline bool isValid() const
\r
83 inline bool operator ==(const CMMPointer<T> &p) const
\r
85 return (obj==p.obj);
\r
87 inline bool operator ==(const T* o) const
\r
93 template<class T, int i>
\r
94 class CMMBlob : public IMMObject
\r
99 inline T& operator [](int index){assert(index<i); return buffer[index];}
\r
100 inline operator T*(){return buffer;}
\r
105 class CMMDynamicBlob : public IMMObject
\r
108 unsigned long dataSize;
\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