| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | 
							- /*
 
-  *  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
 
 
  |