aboutsummaryrefslogtreecommitdiffstats
path: root/src/catch2/internal/catch_singletons.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/catch2/internal/catch_singletons.hpp')
-rw-r--r--src/catch2/internal/catch_singletons.hpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/catch2/internal/catch_singletons.hpp b/src/catch2/internal/catch_singletons.hpp
new file mode 100644
index 0000000..a28a13d
--- /dev/null
+++ b/src/catch2/internal/catch_singletons.hpp
@@ -0,0 +1,45 @@
+
+// Copyright Catch2 Authors
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE.txt or copy at
+// https://www.boost.org/LICENSE_1_0.txt)
+
+// SPDX-License-Identifier: BSL-1.0
+#ifndef CATCH_SINGLETONS_HPP_INCLUDED
+#define CATCH_SINGLETONS_HPP_INCLUDED
+
+namespace Catch {
+
+ struct ISingleton {
+ virtual ~ISingleton(); // = default
+ };
+
+
+ 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 // CATCH_SINGLETONS_HPP_INCLUDED