version 0.3.33
[fms.git] / include / threadwrapper / singleton.h
1 #ifndef _singleton_\r
2 #define _singleton_\r
3 \r
4 #include <cassert>\r
5 \r
6 #include "noncopyable.h"\r
7 \r
8 //! SingletonDestroyer\r
9 template <class T>\r
10 class Destroyer\r
11 {\r
12         T* doomed;\r
13         public:\r
14   \r
15         Destroyer(T* q) : doomed(q) { assert(doomed); }\r
16         ~Destroyer();\r
17 };\r
18 \r
19 template <class T>\r
20 Destroyer<T>::~Destroyer()\r
21 {\r
22         try\r
23         {\r
24                 if(doomed)\r
25                 {\r
26                         delete doomed;\r
27                 }\r
28         }\r
29         catch(...)\r
30         {\r
31     }\r
32   \r
33         doomed = 0;\r
34 }\r
35 \r
36 template <class T>\r
37 class Singleton:public NonCopyable\r
38 {\r
39 public:\r
40 \r
41         static T *Instance();\r
42 \r
43 private:\r
44         \r
45 };\r
46 \r
47 template <class T>\r
48 T *Singleton<T>::Instance()\r
49 {\r
50         static T *obj=0;\r
51         static Poco::FastMutex mutex;\r
52         Poco::ScopedLock<Poco::FastMutex> g(mutex);\r
53         if(obj==0)\r
54         {\r
55                 obj=new T();\r
56                 static Destroyer<T> des(obj);\r
57         }\r
58         return const_cast<T*>(obj);\r
59 }\r
60 \r
61 #endif  // _singleton_\r