45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  *  Created by Phil Nash on 15/6/2018.
 | |
|  *
 | |
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying
 | |
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | |
|  */
 | |
| #ifndef TWOBLUECUBES_CATCH_SINGLETONS_HPP_INCLUDED
 | |
| #define TWOBLUECUBES_CATCH_SINGLETONS_HPP_INCLUDED
 | |
| 
 | |
| namespace Catch {
 | |
| 
 | |
|     struct ISingleton {
 | |
|         virtual ~ISingleton();
 | |
|     };
 | |
| 
 | |
| 
 | |
|     void addSingleton( ISingleton* singleton );
 | |
|     void cleanupSingletons();
 | |
| 
 | |
| 
 | |
|     template<typename SingletonImplT, typename InterfaceT = SingletonImplT, typename MutableInterfaceT = InterfaceT>
 | |
|     class Singleton : SingletonImplT, public ISingleton {
 | |
| 
 | |
|         static auto getInternal() -> Singleton* {
 | |
|             static Singleton* s_instance = nullptr;
 | |
|             if( !s_instance ) {
 | |
|                 s_instance = new Singleton;
 | |
|                 addSingleton( s_instance );
 | |
|             }
 | |
|             return s_instance;
 | |
|         }
 | |
| 
 | |
|     public:
 | |
|         static auto get() -> InterfaceT const& {
 | |
|             return *getInternal();
 | |
|         }
 | |
|         static auto getMutable() -> MutableInterfaceT& {
 | |
|             return *getInternal();
 | |
|         }
 | |
|     };
 | |
| 
 | |
| } // namespace Catch
 | |
| 
 | |
| #endif // TWOBLUECUBES_CATCH_SINGLETONS_HPP_INCLUDED
 |