singleton.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _SINGLETON_H_
00023 #define _SINGLETON_H_
00024
00025 #include <memory>
00026
00027 #include <dcl/mutex.h>
00028 #include <dcl/noncopyable.h>
00029
00030 namespace dbp {
00031
00033
00051 template <class T>
00052 class singleton: public noncopyable {
00053 public:
00055
00061 static T& instance() {
00062 if (!_instance.get()) {
00063 mutex_guard m(_cs);
00064 if (!_instance.get())
00065 _instance.reset(new T());
00066 else
00067 _instance->_is_copy = true;
00068 } else
00069 _instance->_is_copy = true;
00070 return *_instance;
00071 };
00073
00079 bool is_copy() {
00080 return _is_copy;
00081 };
00082 protected:
00083 singleton(): _is_copy(false) { };
00084 private:
00085 bool _is_copy;
00086 static std::auto_ptr<T> _instance;
00087 static mutex _cs;
00088 };
00089
00090 template <class T>
00091 std::auto_ptr<T> singleton<T>::_instance;
00092
00093 template <class T>
00094 mutex singleton<T>::_cs;
00095
00096 }
00097
00098 #endif