00001 #ifndef CTLNEW_H
00002 #define CTLNEW_H
00003
00018 #define ctl_malloc(ptr,size) _ctlmalloc( ppCastPtr(void**)&(ptr),(size) ppDebugParam( ppFileLine("ctl_malloc") ) )
00019
00026 #define ctl_calloc(ptr, nelem, size) _ctlcalloc( ppCastPtr(void**)&(ptr),(nelem),(size) ppDebugParam( ppFileLine("ctl_calloc") ) )
00027
00034 #define ctl_realloc(ptr,size) _ctlrealloc( ppCastPtr(void**)&(ptr),(size) ppDebugParam( ppFileLine("ctl_realloc") ) )
00035
00040 #define ctl_free(ptr) _ctlfree( ppCastPtr(void**)&(ptr) ppDebugParam( ppFileLine("ctl_free") ) )
00041
00049 #define ctl_size(ptr) _ctlsize( (ptr) ppDebugParam( ppFileLine("ctl_size") ) )
00050
00058 #define ctl_strdup(ptr,sz) _ctlstrdup( (char**)&(ptr), (sz) ppDebugParam( ppFileLine("ctl_strdup") ) )
00059
00067 #define ctl_wcsdup(ptr,sz) _ctlwcsdup( (wchar_t**)&(ptr), (sz) ppDebugParam( ppFileLine("ctl_wcsdup") ) )
00068
00074 #define ctl_assertmem(ptr) assert( _ctlvalidate( (ptr), ppFileLine("ctl_assertmem") ) )
00075
00082 #define ctl_alloctype(ptr,type) ctl_malloc((ptr),sizeof(type))
00083
00091 #define ctl_alloc_array(ptr,type,count) ctl_malloc((ptr),sizeof(type)*(count))
00092
00099 #define ctl_calloctype(ptr,type) ctl_calloc((ptr),sizeof(type))
00100
00108 #define ctl_calloc_array(ptr,type,count) ctl_calloc((ptr),sizeof(type)*(count))
00109
00117 #define ctl_new(ptr,type)\
00118 {\
00119 void** ppScr(pptr) = ppCastPtr(void**)&(ptr);\
00120 _ctlnew( (void**)ppScr(pptr), sizeof(type), ppCastPtr(void(*)(void*))ppConcat(type,_destroy) ppDebugParam( ppFileLine("ctl_new") ) );\
00121 ppConcat(type,_init)((type*)*ppScr(pptr));\
00122 }
00123
00131 #define ctl_new_array(type,ptr,count) \
00132 {\
00133 if( ctl_malloc((ptr),sizeof(type)*(count)) );\
00134 {\
00135 type* ppScr2(newa,pcurr) = (ptr);\
00136 const type* ppScr2(newa,end) = ppScr2(newa,pcurr) + (count);\
00137 while( ppScr2(newa,pcurr)++ < ppScr2(newa,end) )\
00138 ppConcat(type,_init)(ppScr2(newa,pcurr));\
00139 }\
00140 }
00141
00148 #define ctl_delete(ptr) _ctldelete( ppCastPtr(void**)&(ptr) ppDebugParam( ppFileLine("ctl_delete") ) )
00149
00156 #define ctl_ref( ptr, fromptr ) _ctlref( ((ptr)=(fromptr)) ppDebugParam( ppFileLine("ctl_ref") ) )
00157
00163 #define ctl_deref( ptr ) _ctldelete( ppCastPtr(void**)&(ptr) ppDebugParam( ppFileLine("ctl_deref") ) )
00164
00170 #define ctl_refcount( ptr ) _ctlrefcount( (ptr) ppDebugParam( ppFileLine("ctl_refcount") ) )
00171
00179 #define ctl_delete_array(type,ptr,count) \
00180 {\
00181 type* ppScr2(dela,pcurr) = (ptr) + (count);\
00182 const type* ppScr2(dela,end) = ppScr2(dela,pcurr);\
00183 while( ppScr2(dela,pcurr)-- > ppScr2(dela,end) )\
00184 ppConcat(type,_destroy)(ppScr2(dela,pcurr));\
00185 ctl_free(ptr);\
00186 }
00187
00194 typedef void (*ctl_newhandler)( const char* sz, size_t needed );
00198 ctl_newhandler ctl_set_new_handler( ctl_newhandler handler );
00199 bool _ctlmalloc( void** ptr, size_t size ppDebugParam(const char* szFileLine) );
00200 bool _ctlcalloc( void** ptr, size_t size ppDebugParam(const char* szFileLine) );
00201 bool _ctlrealloc( void** ptr, size_t size ppDebugParam(const char* szFileLine) );
00202 void _ctlfree( void** ptr ppDebugParam(const char* szFileLine) );
00203 size_t _ctlsize( void* ptr ppDebugParam(const char* szFileLine) );
00204 bool _ctlstrdup( char** ptr, const char* sz ppDebugParam(const char* szFileLine) );
00205 bool _ctlwcsdup( wchar_t** ptr, const wchar_t*sz ppDebugParam(const char* szFileLine) );
00206 bool _ctlnew( void** ptr, size_t size, void (*destruct)(void*) ppDebugParam(const char* szFileLine) );
00207 int _ctldelete( void** ptr ppDebugParam(const char* szFileLine) );
00208 int _ctlref( void* ptr ppDebugParam(const char* szFileLine) );
00209 int _ctlrefcount( void* ptr ppDebugParam(const char* szFileLine) );
00210 #ifdef NDEBUG
00211 #define ctl_memory_dump( logmask ) 0
00212 #else
00213
00216 size_t ctl_memory_dump( uint32 logmask );
00217 bool _ctlvalidate( void* ptr ppDebugParam(const char* szFileLine) );
00218 #endif
00219
00224 #define ctl_pool(type) ctl_pool_base
00225
00233 #define ctl_pool_auto(type,pool,delta) ctl_pool_base_auto(sizeof(type),delta,pool)
00234
00241 #define ctl_pool_init(type,pool,delta) ctl_pool_base_init(pool,sizeof(type),delta,#pool)
00242
00249 #define ctl_pool_grow(type,pool,size) ctl_pool_base_grow(pool,size)
00250
00256 #define ctl_pool_destroy(type,pool) ctl_pool_base_destroy(pool)
00257
00264 #define ctl_pool_alloc(type,pool, ptr) { (ptr) = (type*)ctl_pool_base_alloc(pool); }
00265
00272 #define ctl_pool_free(type,pool, ptr) { ctl_pool_base_free(pool, (ptr) ); (ptr) = NULL; }
00273
00278 #define ctl_pool_free_count(pool) ((pool)->cFree)
00279
00284 #define ctl_pool_alloc_count(pool) ((pool)->cAlloc)
00285
00290 #define ctl_pool_count(pool) ((pool)->cAlloc+(pool)->cFree)
00291
00292 struct ctl_pool_base_node;
00293 struct ctl_pool_base_block;
00308 typedef struct ctl_pool_base
00309 {
00310 struct ctl_pool_base_node* freelist;
00311 struct ctl_pool_base_block* blocks;
00312 struct ctl_pool_base* poolList;
00313 const char* name;
00314 size_t unit;
00315 size_t delta;
00316 size_t cFree;
00317 size_t cAlloc;
00318 } ctl_pool_base;
00319
00326 #define ctl_pool_base_entry( unitSize, delta, label ) { NULL, NULL, NULL, #label, (unitSize), (delta), 0,0 }
00327
00335 #define ctl_pool_base_auto( unitSize, delta, label ) ctl_pool_base label = ctl_pool_base_entry( unitSize, delta, label )
00336
00344 void ctl_pool_base_init( ctl_pool_base* pool, size_t unitSize, size_t delta, const char* name );
00345
00351 void ctl_pool_base_grow( ctl_pool_base* pool, size_t size );
00352
00357 void ctl_pool_base_destroy( ctl_pool_base* pool );
00358
00364 void* ctl_pool_base_alloc( ctl_pool_base* pool );
00365
00371 void ctl_pool_base_free( ctl_pool_base* pool, void* ptr );
00372
00373 #ifdef NDEBUG
00374 #define ctl_pool_dump(logmask) 0
00375 #define ctl_destroy_all_pools()
00376 #else
00377 size_t ctl_pool_dump( uint32 logmask );
00378 void ctl_destroy_all_pools( void );
00379 #endif
00380
00381 #endif