00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef OVR_ContainerAllocator_h
00018 #define OVR_ContainerAllocator_h
00019
00020 #include "OVR_Allocator.h"
00021 #include <string.h>
00022
00023
00024 namespace OVR {
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 class ContainerAllocatorBase
00035 {
00036 public:
00037 static void* Alloc(UPInt size) { return OVR_ALLOC(size); }
00038 static void* Realloc(void* p, UPInt newSize) { return OVR_REALLOC(p, newSize); }
00039 static void Free(void *p) { OVR_FREE(p); }
00040 };
00041
00042
00043
00044
00045
00046
00047
00048 template<class T>
00049 class ConstructorPOD
00050 {
00051 public:
00052 static void Construct(void *) {}
00053 static void Construct(void *p, const T& source)
00054 {
00055 *(T*)p = source;
00056 }
00057
00058
00059 template <class S>
00060 static void ConstructAlt(void *p, const S& source)
00061 {
00062 *(T*)p = source;
00063 }
00064
00065 static void ConstructArray(void*, UPInt) {}
00066
00067 static void ConstructArray(void* p, UPInt count, const T& source)
00068 {
00069 UByte *pdata = (UByte*)p;
00070 for (UPInt i=0; i< count; ++i, pdata += sizeof(T))
00071 *(T*)pdata = source;
00072 }
00073
00074 static void ConstructArray(void* p, UPInt count, const T* psource)
00075 {
00076 memcpy(p, psource, sizeof(T) * count);
00077 }
00078
00079 static void Destruct(T*) {}
00080 static void DestructArray(T*, UPInt) {}
00081
00082 static void CopyArrayForward(T* dst, const T* src, UPInt count)
00083 {
00084 memmove(dst, src, count * sizeof(T));
00085 }
00086
00087 static void CopyArrayBackward(T* dst, const T* src, UPInt count)
00088 {
00089 memmove(dst, src, count * sizeof(T));
00090 }
00091
00092 static bool IsMovable() { return true; }
00093 };
00094
00095
00096
00097
00098
00099
00100 template<class T>
00101 class ConstructorMov
00102 {
00103 public:
00104 static void Construct(void* p)
00105 {
00106 OVR::Construct<T>(p);
00107 }
00108
00109 static void Construct(void* p, const T& source)
00110 {
00111 OVR::Construct<T>(p, source);
00112 }
00113
00114
00115 template <class S>
00116 static void ConstructAlt(void* p, const S& source)
00117 {
00118 OVR::ConstructAlt<T,S>(p, source);
00119 }
00120
00121 static void ConstructArray(void* p, UPInt count)
00122 {
00123 UByte* pdata = (UByte*)p;
00124 for (UPInt i=0; i< count; ++i, pdata += sizeof(T))
00125 Construct(pdata);
00126 }
00127
00128 static void ConstructArray(void* p, UPInt count, const T& source)
00129 {
00130 UByte* pdata = (UByte*)p;
00131 for (UPInt i=0; i< count; ++i, pdata += sizeof(T))
00132 Construct(pdata, source);
00133 }
00134
00135 static void ConstructArray(void* p, UPInt count, const T* psource)
00136 {
00137 UByte* pdata = (UByte*)p;
00138 for (UPInt i=0; i< count; ++i, pdata += sizeof(T))
00139 Construct(pdata, *psource++);
00140 }
00141
00142 static void Destruct(T* p)
00143 {
00144 p->~T();
00145 OVR_UNUSED(p);
00146 }
00147
00148 static void DestructArray(T* p, UPInt count)
00149 {
00150 p += count - 1;
00151 for (UPInt i=0; i<count; ++i, --p)
00152 p->~T();
00153 }
00154
00155 static void CopyArrayForward(T* dst, const T* src, UPInt count)
00156 {
00157 memmove(dst, src, count * sizeof(T));
00158 }
00159
00160 static void CopyArrayBackward(T* dst, const T* src, UPInt count)
00161 {
00162 memmove(dst, src, count * sizeof(T));
00163 }
00164
00165 static bool IsMovable() { return true; }
00166 };
00167
00168
00169
00170
00171
00172
00173 template<class T>
00174 class ConstructorCPP
00175 {
00176 public:
00177 static void Construct(void* p)
00178 {
00179 OVR::Construct<T>(p);
00180 }
00181
00182 static void Construct(void* p, const T& source)
00183 {
00184 OVR::Construct<T>(p, source);
00185 }
00186
00187
00188 template <class S>
00189 static void ConstructAlt(void* p, const S& source)
00190 {
00191 OVR::ConstructAlt<T,S>(p, source);
00192 }
00193
00194 static void ConstructArray(void* p, UPInt count)
00195 {
00196 UByte* pdata = (UByte*)p;
00197 for (UPInt i=0; i< count; ++i, pdata += sizeof(T))
00198 Construct(pdata);
00199 }
00200
00201 static void ConstructArray(void* p, UPInt count, const T& source)
00202 {
00203 UByte* pdata = (UByte*)p;
00204 for (UPInt i=0; i< count; ++i, pdata += sizeof(T))
00205 Construct(pdata, source);
00206 }
00207
00208 static void ConstructArray(void* p, UPInt count, const T* psource)
00209 {
00210 UByte* pdata = (UByte*)p;
00211 for (UPInt i=0; i< count; ++i, pdata += sizeof(T))
00212 Construct(pdata, *psource++);
00213 }
00214
00215 static void Destruct(T* p)
00216 {
00217 p->~T();
00218 OVR_UNUSED(p);
00219 }
00220
00221 static void DestructArray(T* p, UPInt count)
00222 {
00223 p += count - 1;
00224 for (UPInt i=0; i<count; ++i, --p)
00225 p->~T();
00226 }
00227
00228 static void CopyArrayForward(T* dst, const T* src, UPInt count)
00229 {
00230 for(UPInt i = 0; i < count; ++i)
00231 dst[i] = src[i];
00232 }
00233
00234 static void CopyArrayBackward(T* dst, const T* src, UPInt count)
00235 {
00236 for(UPInt i = count; i; --i)
00237 dst[i-1] = src[i-1];
00238 }
00239
00240 static bool IsMovable() { return false; }
00241 };
00242
00243
00244
00245
00246
00247
00248 template<class T> struct ContainerAllocator_POD : ContainerAllocatorBase, ConstructorPOD<T> {};
00249 template<class T> struct ContainerAllocator : ContainerAllocatorBase, ConstructorMov<T> {};
00250 template<class T> struct ContainerAllocator_CPP : ContainerAllocatorBase, ConstructorCPP<T> {};
00251
00252
00253 }
00254
00255
00256 #endif