00001 // $Id: NewDelFunctions.h 2134 2007-11-30 18:07:51Z pcanal $ 00002 00003 #ifndef Reflex_NewDelFunctions 00004 #define Reflex_NewDelFunctions 00005 00006 /** 00007 * @file NewDelFunctions.h 00008 */ 00009 00010 00011 namespace Reflex { 00012 typedef void* (*NewFunc_t)(void*); 00013 typedef void* (*NewArrFunc_t)(long size, void* arena); 00014 typedef void (*DelFunc_t)(void*); 00015 typedef void (*DelArrFunc_t)(void*); 00016 typedef void (*DesFunc_t)(void*); 00017 00018 struct RFLX_API NewDelFunctions { 00019 NewFunc_t fNew; //pointer to a function newing one object. 00020 NewArrFunc_t fNewArray; //pointer to a function newing an array of objects. 00021 DelFunc_t fDelete; //pointer to a function deleting one object. 00022 DelArrFunc_t fDeleteArray; //pointer to a function deleting an array of objects. 00023 DesFunc_t fDestructor; //pointer to a function call an object's destructor. 00024 }; 00025 00026 template <class T> struct NewDelFunctionsT: public NewDelFunctions { 00027 static void* 00028 new_T(void* p) { return p ? new (p) T : new T; } 00029 00030 static void* 00031 new_p_T(void* p) { return p ? new (p) T : ::new T; } 00032 00033 static void* 00034 new_np_T(void* p) { return p ? ::new (p) T : new T; } 00035 00036 static void* 00037 newArray_T(long size, 00038 void* p) { return p ? new (p) T[size] : new T[size]; } 00039 00040 static void* 00041 newArray_p_T(long size, 00042 void* p) { return p ? new (p) T[size] : ::new T[size]; } 00043 00044 static void* 00045 newArray_np_T(long size, 00046 void* p) { return p ? ::new (p) T[size] : new T[size]; } 00047 00048 static void 00049 delete_T(void* p) { delete (T*) p; } 00050 00051 static void 00052 deleteArray_T(void* p) { delete[] (T*) p; } 00053 00054 static void 00055 destruct_T(void* p) { ((T*) p)->~T(); } 00056 00057 NewDelFunctionsT() { 00058 fNew = new_T; 00059 fNewArray = newArray_T; 00060 fDelete = delete_T; 00061 fDeleteArray = deleteArray_T; 00062 fDestructor = destruct_T; 00063 } 00064 00065 00066 }; 00067 00068 00069 } // namespace reflex 00070 00071 #endif