00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #pragma once
00028 #ifndef __CSOBJECT_H__
00029 #define __CSOBJECT_H__
00030
00031 #include "CSDefs.h"
00032 #include "CSMemory.h"
00033 #include "CSMutex.h"
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #define RETAIN(x) ((x)->retain(),(x))
00045
00046
00047
00048
00049
00050 #define BACK_REFERENCE(x) (x)
00051
00052 class CSObject {
00053 public:
00054 CSObject() { }
00055 virtual ~CSObject() { finalize(); }
00056
00057 #ifdef DEBUG
00058 virtual void retain(const char *func, const char *file, uint32_t line);
00059 virtual void release(const char *func, const char *file, uint32_t line);
00060 #else
00061 virtual void retain();
00062 virtual void release();
00063 #endif
00064
00065
00066
00067
00068
00069 virtual void finalize() { }
00070 virtual CSObject *getKey();
00071 virtual int compareKey(CSObject *);
00072 virtual uint32_t hashKey();
00073 virtual CSObject *getHashLink();
00074 virtual void setHashLink(CSObject *);
00075 virtual CSObject *getNextLink();
00076 virtual CSObject *getPrevLink();
00077 virtual void setNextLink(CSObject *);
00078 virtual void setPrevLink(CSObject *);
00079
00080 #ifdef DEBUG
00081 static void *operator new(size_t size, const char *func, const char *file, uint32_t line) {
00082 return cs_mm_malloc(func, file, line, size);
00083 }
00084
00085 static void operator delete(void *ptr, size_t size) {
00086 UNUSED(size);
00087 cs_mm_free(ptr);
00088 }
00089
00090 #endif
00091 };
00092
00093 class CSStaticObject : public CSObject {
00094 #ifdef DEBUG
00095 virtual void retain(const char *func, const char *file, uint32_t line);
00096 virtual void release(const char *func, const char *file, uint32_t line);
00097
00098 int iTrackMe;
00099 #else
00100 virtual void retain();
00101 virtual void release();
00102 #endif
00103 };
00104
00105 class CSRefObject : public CSObject {
00106 public:
00107 CSRefObject();
00108 virtual ~CSRefObject();
00109
00110 #ifdef DEBUG
00111 virtual void startTracking();
00112 virtual void retain(const char *func, const char *file, uint32_t line);
00113 virtual void release(const char *func, const char *file, uint32_t line);
00114
00115 int iTrackMe;
00116 #else
00117 virtual void retain();
00118 virtual void release();
00119 #endif
00120
00121 uint32_t getRefCount() { return iRefCount;}
00122
00123 private:
00124 uint32_t iRefCount;
00125 };
00126
00127 class CSSharedRefObject : public CSObject, public CSSync {
00128 public:
00129 CSSharedRefObject();
00130 virtual ~CSSharedRefObject();
00131
00132 #ifdef DEBUG
00133 virtual void startTracking();
00134 virtual void retain(const char *func, const char *file, uint32_t line);
00135 virtual void release(const char *func, const char *file, uint32_t line);
00136
00137 int iTrackMe;
00138 #else
00139 virtual void retain();
00140 virtual void release();
00141 #endif
00142
00143 uint32_t getRefCount() { return iRefCount;}
00144
00145 private:
00146 uint32_t iRefCount;
00147 };
00148
00149 #ifdef DEBUG
00150 #define new new(__FUNC__, __FILE__, __LINE__)
00151
00152 #define retain() retain(__FUNC__, __FILE__, __LINE__)
00153 #define release() release(__FUNC__, __FILE__, __LINE__)
00154 #endif
00155
00156 class CSPooled {
00157 public:
00158 virtual ~CSPooled() {}
00159 virtual void returnToPool() = 0;
00160 };
00161
00162 #endif