version 0.3.0
[fms.git] / include / threadwrapper / singleton.h
diff --git a/include/threadwrapper/singleton.h b/include/threadwrapper/singleton.h
new file mode 100644 (file)
index 0000000..9e2aab5
--- /dev/null
@@ -0,0 +1,61 @@
+#ifndef _singleton_\r
+#define _singleton_\r
+\r
+#include <cassert>\r
+\r
+#include "noncopyable.h"\r
+\r
+//! SingletonDestroyer\r
+template <class T>\r
+class Destroyer\r
+{\r
+       T* doomed;\r
+       public:\r
+  \r
+       Destroyer(T* q) : doomed(q) { assert(doomed); }\r
+       ~Destroyer();\r
+};\r
+\r
+template <class T>\r
+Destroyer<T>::~Destroyer()\r
+{\r
+       try\r
+       {\r
+               if(doomed)\r
+               {\r
+                       delete doomed;\r
+               }\r
+       }\r
+       catch(...)\r
+       {\r
+    }\r
+  \r
+       doomed = 0;\r
+}\r
+\r
+template <class T>\r
+class Singleton:public NonCopyable\r
+{\r
+public:\r
+\r
+       static T *Instance();\r
+\r
+private:\r
+       \r
+};\r
+\r
+template <class T>\r
+T *Singleton<T>::Instance()\r
+{\r
+       static T *obj=0;\r
+       static Poco::FastMutex mutex;\r
+       Poco::ScopedLock<Poco::FastMutex> g(mutex);\r
+       if(obj==0)\r
+       {\r
+               obj=new T();\r
+               static Destroyer<T> des(obj);\r
+       }\r
+       return const_cast<T*>(obj);\r
+}\r
+\r
+#endif // _singleton_\r