prim_allocator.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef LASS_GUARDIAN_OF_INCLUSION_PRIM_IMPL_ALLOCATOR_H
00043 #define LASS_GUARDIAN_OF_INCLUSION_PRIM_IMPL_ALLOCATOR_H
00044
00045 #include "../prim_common.h"
00046 #include "../../meta/is_integral.h"
00047 #include "../../meta/is_trivial.h"
00048
00049 namespace lass
00050 {
00051 namespace prim
00052 {
00053 namespace impl
00054 {
00055
00056 LASS_DLL void* allocateMemory(size_t size);
00057 LASS_DLL void deallocateMemory(void* mem, size_t size);
00058
00059 template <typename T, bool hasTrivialConstructorAndDestructor>
00060 class AllocatorHelper
00061 {
00062 public:
00063 static T* allocate(size_t n)
00064 {
00065 return static_cast<T*>(allocateMemory(n * sizeof(T)));
00066 }
00067 static void deallocate(T* p, size_t n)
00068 {
00069 deallocateMemory(p, n * sizeof(T));
00070 }
00071 };
00072
00073 template <typename T>
00074 class AllocatorHelper<T, false>
00075 {
00076 public:
00077 static T* allocate(size_t n)
00078 {
00079
00080
00081 T* p = static_cast<T*>(allocateMemory(n * sizeof(T)));
00082 for (size_t i = 0; i < n; ++i)
00083 {
00084 try
00085 {
00086 new(&p[i]) T();
00087 }
00088 catch (...)
00089 {
00090 deallocate(p, n, i);
00091 throw;
00092 }
00093 }
00094 return p;
00095 }
00096 static void deallocate(T* p, size_t n)
00097 {
00098 deallocate(p, n, n);
00099 }
00100 private:
00101 static void deallocate(T* p, size_t n, size_t i)
00102 {
00103 while (i > 0)
00104 {
00105 p[--i].~T();
00106 }
00107 deallocateMemory(p, n * sizeof(T));
00108 }
00109 };
00110
00111 template <typename T>
00112 T* allocateArray(size_t n)
00113 {
00114 return AllocatorHelper<T, meta::IsTrivial<T>::value>::allocate(n);
00115 }
00116
00117 template <typename T>
00118 void deallocateArray(T* p, size_t n)
00119 {
00120 AllocatorHelper<T, meta::IsTrivial<T>::value>::deallocate(p, n);
00121 }
00122
00123
00124 }
00125 }
00126 }
00127
00128 #endif
00129
00130