NewDelFunctions.h

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

Generated on Tue Jul 5 14:25:49 2011 for ROOT_528-00b_version by  doxygen 1.5.1