CrossFramework Library

XBase/Placement.hpp

説明を見る。
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
 全て クラス ネームスペース ファイル 関数 変数 型定義 列挙型 列挙型の値 マクロ定義