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() { release(); } 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 release() 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 } 00106 00107 private: 00108 T* mPtr; 00109 byte_t mBytes[ sizeof(T) ]; 00110 //------------------------------------------------------------ 00111 void prepareCtor() 00112 { 00113 release(); 00114 mPtr = reinterpret_cast< T* >( mBytes ); 00115 } 00116 }; 00117 00119 } 00120 //------------------------------------------------------------ 00121 #endif 00122 // EOF