CrossFramework Library
|
00001 00006 #if defined(XBASE_INCLUDED_PLACEMENT_HPP) 00007 #else 00008 #define XBASE_INCLUDED_PLACEMENT_HPP 00009 00010 //------------------------------------------------------------ 00011 #include <new> 00012 #include <XBase/BuiltInTypes.hpp> 00013 #include <XBase/RuntimeAssert.hpp> 00014 00015 //------------------------------------------------------------ 00016 namespace XBase { 00018 00019 00033 template< typename T > 00034 class Placement 00035 { 00036 public: 00038 00039 Placement() : mPtr( 0 ) {} 00040 ~Placement() { reset(); } 00042 00044 00045 00046 bool isValid()const { return mPtr != 0; } 00047 00049 T* ptr()const { XBASE_POINTER_ASSERT( mPtr ); return mPtr; } 00050 00052 T& ref()const { return *ptr(); } 00054 00056 00057 T* operator->()const { return ptr(); } 00058 T& operator*()const { return ref(); } 00059 00060 00062 00063 00064 void reset() 00065 { 00066 if ( isValid() ) 00067 { 00068 mPtr->~T(); 00069 mPtr = 0; 00070 } 00071 } 00073 00075 00076 void init() 00077 { 00078 prepareCtor(); 00079 new ( mPtr ) T(); 00080 } 00081 template< typename A0 > 00082 void init( A0 a0 ) 00083 { 00084 prepareCtor(); 00085 new( mPtr ) T( a0 ); 00086 } 00087 template< typename A0 , typename A1 > 00088 void init( A0 a0 , A1 a1 ) 00089 { 00090 prepareCtor(); 00091 new ( mPtr ) T( a0 , a1 ); 00092 } 00093 template< typename A0 , typename A1 , typename A2 > 00094 void init( A0 a0 , A1 a1 , A2 a2 ) 00095 { 00096 prepareCtor(); 00097 new ( mPtr ) T( a0 , a1 , a2 ); 00098 } 00099 template< typename A0 , typename A1 , typename A2 , typename A3 > 00100 void init( A0 a0 , A1 a1 , A2 a2 , A3 a3 ) 00101 { 00102 prepareCtor(); 00103 new ( mPtr ) T( a0 , a1 , a2 , a3 ); 00104 } 00105 template< typename A0 , typename A1 , typename A2 , typename A3 , typename A4 > 00106 void init( A0 a0 , A1 a1 , A2 a2 , A3 a3 , A4 a4 ) 00107 { 00108 prepareCtor(); 00109 new ( mPtr ) T( a0 , a1 , a2 , a3 , a4 ); 00110 } 00111 template< typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 > 00112 void init( A0 a0 , A1 a1 , A2 a2 , A3 a3 , A4 a4 , A5 a5 ) 00113 { 00114 prepareCtor(); 00115 new ( mPtr ) T( a0 , a1 , a2 , a3 , a4 , a5 ); 00116 } 00117 template< typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 > 00118 void init( A0 a0 , A1 a1 , A2 a2 , A3 a3 , A4 a4 , A5 a5 , A6 a6 ) 00119 { 00120 prepareCtor(); 00121 new ( mPtr ) T( a0 , a1 , a2 , a3 , a4 , a5 , a6 ); 00122 } 00123 template< typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 > 00124 void init( A0 a0 , A1 a1 , A2 a2 , A3 a3 , A4 a4 , A5 a5 , A6 a6 , A7 a7 ) 00125 { 00126 prepareCtor(); 00127 new ( mPtr ) T( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 ); 00128 } 00129 template< typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 > 00130 void init( A0 a0 , A1 a1 , A2 a2 , A3 a3 , A4 a4 , A5 a5 , A6 a6 , A7 a7 , A8 a8 ) 00131 { 00132 prepareCtor(); 00133 new ( mPtr ) T( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 ); 00134 } 00135 template< typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 > 00136 void init( A0 a0 , A1 a1 , A2 a2 , A3 a3 , A4 a4 , A5 a5 , A6 a6 , A7 a7 , A8 a8 , A9 a9 ) 00137 { 00138 prepareCtor(); 00139 new ( mPtr ) T( a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9 ); 00140 } 00142 00143 private: 00144 T* mPtr; 00145 byte_t mBytes[ sizeof(T) ]; 00146 //------------------------------------------------------------ 00147 void prepareCtor() 00148 { 00149 reset(); 00150 mPtr = reinterpret_cast< T* >( mBytes ); 00151 } 00152 }; 00153 00155 } 00156 //------------------------------------------------------------ 00157 #endif 00158 // EOF