5 changed files with 70 additions and 17 deletions
			
			
		@ -0,0 +1,55 @@ | 
				
			|||||||
 | 
					#ifndef SINGLETON_H | 
				
			||||||
 | 
					#define SINGLETON_H | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "inferno/assert.h" | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Inferno { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						template<typename T> | 
				
			||||||
 | 
						class Singleton { | 
				
			||||||
 | 
							// Application is allowed to access its Singleton instance for early setting
 | 
				
			||||||
 | 
							friend class Application; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public: | 
				
			||||||
 | 
							static inline void initialize() | 
				
			||||||
 | 
							{ | 
				
			||||||
 | 
								ASSERT(!s_instance, "Singleton already exists!"); | 
				
			||||||
 | 
								s_instance = new T { s {} }; | 
				
			||||||
 | 
							} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							static inline void destroy() | 
				
			||||||
 | 
							{ | 
				
			||||||
 | 
								ASSERT(s_instance, "Singleton does not exist!"); | 
				
			||||||
 | 
								delete s_instance; | 
				
			||||||
 | 
								s_instance = nullptr; | 
				
			||||||
 | 
							} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							static inline T& the() | 
				
			||||||
 | 
							{ | 
				
			||||||
 | 
								ASSERT(s_instance, "Singleton does not exist!"); | 
				
			||||||
 | 
								return *s_instance; | 
				
			||||||
 | 
							} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 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 Inferno
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // SINGLETON_H
 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue