--- /dev/null
+#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