* Add #ifdef WIN32 to make main.cpp compile on linux.
[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                         // This used to say "int" instead of long, but that breaks\r
15                         // on 64 bit linux at least\r
16                         long offset = (long)(T*)1 - (long)(Singleton <T>*)(T*)1;\r
17                         ms_singleton = (T*)((long)this + offset);\r
18                 }\r
19                 ~Singleton()\r
20                 {\r
21                         assert(ms_singleton);\r
22                         ms_singleton=0;\r
23                 }\r
24                 static inline T& GetSingleton()\r
25                 {\r
26                         assert(ms_singleton);\r
27                         return *ms_singleton;\r
28                 }\r
29                 static inline T* GetSingletonPtr()\r
30                 {\r
31                         assert(ms_singleton);\r
32                         return ms_singleton;\r
33                 }\r
34 };\r
35 \r
36 template <typename T> T* Singleton <T>::ms_singleton = 0;\r
37 \r
38 #endif\r