2e3e6e2cfbea6e65cbb33abf9ef8ae6c01dda9cb
[matthijs/ABM2.git] / ABM2 / Engine / singleton.h
1 #ifndef SINGLETON_H_INCLUDED\r
2 #define SINGLETON_H_INCLUDED\r
3 \r
4 template<typename T>\r
5 class Singleton\r
6 {\r
7         static T* ms_singleton;\r
8         public:\r
9                 Singleton()\r
10                 {\r
11                         assert(!ms_singleton);\r
12                         //use a cunning trick to get the singleton pointing to the start of the whole, rather than\r
13                         //the start of the Singleton part of the object\r
14                         int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;\r
15                         ms_singleton = (T*)((int)this + offset);\r
16                 }\r
17                 ~Singleton()\r
18                 {\r
19                         assert(ms_singleton);\r
20                         ms_singleton=0;\r
21                 }\r
22                 static inline T& GetSingleton()\r
23                 {\r
24                         assert(ms_singleton);\r
25                         return *ms_singleton;\r
26                 }\r
27                 static inline T* GetSingletonPtr()\r
28                 {\r
29                         assert(ms_singleton);\r
30                         return ms_singleton;\r
31                 }\r
32 };\r
33 \r
34 template <typename T> T* Singleton <T>::ms_singleton = 0;\r
35 \r
36 #endif\r