00001
00002 #ifndef __ptr__
00003
00004 #define __ptr__
00005
00006
00007 inline void* operator new(size_t, void* where, int) { return where; }
00008
00009
00010 inline void operator delete(void*, size_t) {return;};
00011 inline void operator delete(void*, size_t, int) {return;};
00012 inline void operator delete(void*, void*, int) {return;};
00013 namespace gdt {
00014
00015
00016 typedef void* Ptr;
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #define COPY_INTO_PTR(T,x,p) (new((void*)(&p),0) T(x))
00027
00028
00029 template <class T>
00030 inline Ptr ptr_copy(T x) {
00031 Ptr p = 0;
00032 if (sizeof(T) <= sizeof(Ptr))
00033 COPY_INTO_PTR(T,x,p);
00034 else
00035 p = (Ptr) new T(x);
00036 return p;
00037 }
00038
00039
00040 #define PTR_ACCESS(T,p) ptr_access((T*)0, p)
00041
00042 template <class T>
00043 inline T& ptr_access(T*, Ptr& p) {
00044 T* t;
00045 if (sizeof(T) <= sizeof(Ptr))
00046 t = (T*)&p;
00047 else
00048 t = (T*)p;
00049 return *t;
00050 }
00051
00052 #define PTR_DEFAULT_INIT(T,p) ptr_default_init((T*)0,p)
00053
00054 template <class T>
00055 inline void ptr_default_init(T*, Ptr& p) {
00056 if (sizeof(T) > sizeof(Ptr))
00057 p = ((void*) new T());
00058 }
00059
00060 #define PTR_CONST_ACCESS(T,p) ptr_const_access((T*)0, p)
00061
00062 template <class T>
00063 inline const T& ptr_const_access(T*, const Ptr& p) {
00064 const T* t;
00065 if (sizeof(T) <= sizeof(Ptr))
00066 t = (const T*)&p;
00067 else
00068 t = (const T*)p;
00069 return *t;
00070 }
00071
00072 #define PTR_DELETE(T,p) ptr_delete((T*)0, p)
00073
00074 template <class T>
00075 inline void ptr_delete(T*, Ptr p) {
00076 if (sizeof(T) > sizeof(Ptr))
00077 delete ((T*) p);
00078
00079 }
00080 }
00081
00082 #endif