ctlnew.h

Go to the documentation of this file.
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 /* CTLNEW_H */

Generated on Fri Jan 2 15:28:34 2009 for Squat by  doxygen 1.5.6