13 inline singletons_manager::~singletons_manager() noexcept
15 while (!m_Singletons.empty())
16 m_Singletons.pop_back();
19 inline singletons_manager& singletons_manager::get_instance() noexcept
21 static singletons_manager instance;
25 inline void singletons_manager::add(std::unique_ptr<base_singleton> pSingleton) noexcept
27 std::lock_guard _(m_SingletonsMutex);
28 m_Singletons.push_back(std::move(pSingleton));
31 template<
class T,
class... dependencies_t>
32 requires(std::is_base_of_v<base_singleton, dependencies_t> && ...)
33 T&
singleton<T, dependencies_t...>::get_instance()
37 "T must be final in order qx::singleton to be safely used with multiple inheritance");
39 static std::mutex instanceMutex;
40 std::lock_guard _(instanceMutex);
42 static T* pSavedInstance =
nullptr;
43 if (!pSavedInstance) [[unlikely]]
45 (dependencies_t::get_instance(), ...);
47 std::unique_ptr<T> pInstance = std::make_unique<T>();
49 pSavedInstance = pInstance.get();
50 singletons_manager::get_instance().add(std::move(pInstance));
53 return *pSavedInstance;
56 template<
class T,
class... dependencies_t>
57 requires(std::is_base_of_v<base_singleton, dependencies_t> && ...)
58 void
singleton<T, dependencies_t...>::init()
Inherit the necessary singleton class from this.
requires(same_variadic_args_v< args_t... >) const expr auto coalesce(args_t &&... args)
Coalesce function, C# a ?? b analogue.