#ifndef ANKI_UTIL_SINGLETON_H #define ANKI_UTIL_SINGLETON_H namespace anki { /// @addtogroup util /// @{ /// @addtogroup patterns /// @{ /// This template makes a class singleton template class Singleton { public: typedef T Value; // Non copyable Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; // Non constructable Singleton() = delete; ~Singleton() = delete; /// Get instance static Value& get() { return *(instance ? instance : (instance = new Value)); } private: static Value* instance; }; template typename Singleton::Value* Singleton::instance = nullptr; /// This template makes a class singleton with thread local instance template class SingletonThreadSafe { public: typedef T Value; // Non copyable SingletonThreadSafe(const SingletonThreadSafe&) = delete; SingletonThreadSafe& operator=(const SingletonThreadSafe&) = delete; // Non constructable SingletonThreadSafe() = delete; ~SingletonThreadSafe() = delete; /// Get instance static Value& get() { return *(instance ? instance : (instance = new Value)); } private: static thread_local Value* instance; }; template thread_local typename SingletonThreadSafe::Value* SingletonThreadSafe::instance = nullptr; /// @} /// @} } // end namespace anki #endif