1 changed files with 50 additions and 0 deletions
			
			
		@ -0,0 +1,50 @@
					 | 
				
			||||
#ifndef SINGLETON_H | 
				
			||||
#define SINGLETON_H | 
				
			||||
 | 
				
			||||
#include <cassert> | 
				
			||||
 | 
				
			||||
namespace Util { | 
				
			||||
 | 
				
			||||
template<typename T> | 
				
			||||
class Singleton { | 
				
			||||
public: | 
				
			||||
	static inline T& the() | 
				
			||||
	{ | 
				
			||||
		if (s_instance == nullptr) { | 
				
			||||
			s_instance = new T { s {} }; | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		return *s_instance; | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	static inline void destroy() | 
				
			||||
	{ | 
				
			||||
		if (s_instance) { | 
				
			||||
			delete s_instance; | 
				
			||||
		} | 
				
			||||
 | 
				
			||||
		s_instance = nullptr; | 
				
			||||
	} | 
				
			||||
 | 
				
			||||
	// Remove copy constructor and copy assignment operator
 | 
				
			||||
	Singleton(const Singleton&) = delete; | 
				
			||||
	Singleton& operator=(const Singleton&) = delete; | 
				
			||||
	Singleton(Singleton&&) = delete; | 
				
			||||
	Singleton& operator=(Singleton&&) = delete; | 
				
			||||
 | 
				
			||||
protected: | 
				
			||||
	Singleton() {} | 
				
			||||
 | 
				
			||||
	// Constructor token
 | 
				
			||||
	struct s {}; | 
				
			||||
 | 
				
			||||
private: | 
				
			||||
	static T* s_instance; | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
template<typename T> | 
				
			||||
T* Singleton<T>::s_instance = nullptr; | 
				
			||||
 | 
				
			||||
} // namespace Util
 | 
				
			||||
 | 
				
			||||
#endif // SINGLETON_H
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue