00001 #ifndef PHX_SINGLETON_H
00002 #define PHX_SINGLETON_H
00003
00004 #if PHX_COMPILER == COMPILER_MSVC
00005
00006 # pragma warning (disable : 4311)
00007 # pragma warning (disable : 4312)
00008 #endif
00009
00010 namespace Phx {
00013 template <typename T> class PhxSingleton
00014 {
00015 protected:
00016
00017 static T* ms_Singleton;
00018
00019 public:
00020 PhxSingleton( void )
00021 {
00022 assert( !ms_Singleton );
00023 #if defined( _MSC_VER ) && _MSC_VER < 1200
00024 int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
00025 ms_Singleton = (T*)((int)this + offset);
00026 #else
00027 ms_Singleton = static_cast< T* >( this );
00028 #endif
00029 }
00030 ~PhxSingleton( void )
00031 { assert( ms_Singleton ); ms_Singleton = 0; }
00032 static T& getSingleton( void )
00033 { assert( ms_Singleton ); return ( *ms_Singleton ); }
00034 static T* getSingletonPtr( void )
00035 { return ms_Singleton; }
00036 };
00037 }
00038
00039
00040 #endif