00001 // -*- C++ -*- 00020 #ifndef COIL_SINGLETON_H 00021 #define COIL_SINGLETON_H 00022 00023 #include <coil/Mutex.h> 00024 #include <coil/Guard.h> 00025 00026 namespace coil 00027 { 00101 template <class SingletonClass> 00102 class Singleton 00103 { 00104 public: 00105 typedef SingletonClass* SingletonClassPtr; 00106 typedef ::coil::Mutex Mutex; 00107 static SingletonClass& instance() 00108 { 00109 00110 // DLC pattern 00111 if (!m_instance) 00112 { 00113 coil::Guard<coil::Mutex> guard(m_mutex); 00114 if (!m_instance) 00115 { 00116 m_instance = new SingletonClass(); 00117 } 00118 } 00119 return *m_instance; 00120 } 00121 00122 protected: 00123 Singleton(){}; 00124 ~Singleton(){}; 00125 00126 private: 00127 Singleton(const Singleton& x); 00128 Singleton& operator=(const Singleton& x); 00129 00130 protected: 00131 static coil::Mutex m_mutex; 00132 static SingletonClass* m_instance; 00133 }; 00134 00135 template <class SingletonClass> 00136 typename Singleton<SingletonClass>::SingletonClassPtr 00137 Singleton<SingletonClass>::m_instance; 00138 00139 template <class SingletonClass> 00140 typename Singleton<SingletonClass>::Mutex 00141 Singleton<SingletonClass>::m_mutex; 00142 }; // namepsace coil 00143 00144 #endif // COIL_SINGLETON_H