9#if ALIB_FEAT_SINGLETON_MAPPED && !DOXYGEN
10namespace alib::singletons::hidden {
11# if ALIB_MONOMEM && ALIB_CONTAINERS
13 lang::TypeFunctors::Hash,
14 lang::TypeFunctors::EqualTo,
16 Recycling::None > singletonMap;
18 extern std::unordered_map< lang::TypeFunctors::Key,
void *,
19 lang::TypeFunctors::Hash,
20 lang::TypeFunctors::EqualTo > singletonMap;
22# if !ALIB_MONOMEM && !ALIB_SINGLE_THREADED
23 extern std::mutex singletonMapMutex;
25 extern ALIB_DLL void *getSingleton(
const std::type_info &type);
26 extern ALIB_DLL void storeSingleton(
const std::type_info &type,
void *theSingleton);
27 extern ALIB_DLL void removeSingleton(
const std::type_info &type);
44template<
typename TDerivedClass>
51 #if !ALIB_FEAT_SINGLETON_MAPPED
53 static TDerivedClass singleton;
56 #if ALIB_SINGLE_THREADED
57 using TSingletonStorage = TDerivedClass *;
59 using TSingletonStorage = std::atomic<TDerivedClass *>;
63 static TSingletonStorage singleton =
nullptr;
66 TDerivedClass *result = singleton;
67 if (result !=
nullptr)
74 #if !ALIB_SINGLE_THREADED
78 std::lock_guard<std::mutex> guard(hidden::singletonMapMutex);
83 void *storedSingleton = hidden::getSingleton(
typeid(TDerivedClass));
84 if (storedSingleton !=
nullptr) {
85 singleton =
dynamic_cast<TDerivedClass *
>(
91 auto* firstInstance =
new TDerivedClass();
92 hidden::storeSingleton(
typeid(TDerivedClass),
98 return *firstInstance;
100 return *(singleton = firstInstance);
110 #if ALIB_FEAT_SINGLETON_MAPPED
111 #if !ALIB_SINGLE_THREADED
115 std::lock_guard<std::mutex> guard(hidden::singletonMapMutex);
118 hidden::removeSingleton(
typeid(TDerivedClass));
148#if ALIB_FEAT_SINGLETON_MAPPED && ALIB_DEBUG
152#if ALIB_MONOMEM && ALIB_CONTAINERS
174 lang::TypeFunctors::Hash,
175 lang::TypeFunctors::EqualTo,
180 lang::TypeFunctors::Hash,
#define ALIB_LOCK_RECURSIVE_WITH(lock)
static TDerivedClass & GetSingleton()
virtual ~Singleton()
Virtual destructor.
HashTable< TAllocator, TPairDescriptor< TKey, TMapped >, THash, TEqual, THashCaching, TRecycling > HashMap
RecursiveLock GLOBAL_ALLOCATOR_LOCK
HashMap< MonoAllocator, lang::TypeFunctors::Key, void *, lang::TypeFunctors::Hash, lang::TypeFunctors::EqualTo, lang::Caching::Auto, Recycling::None > & DbgGetSingletons()
monomem::TMonoAllocator< lang::HeapAllocator > MonoAllocator
singletons::Singleton< T > Singleton
Type alias in namespace #"%alib".
strings::TAString< nchar, lang::HeapAllocator > NAString
Type alias in namespace #"%alib".
containers::HashMap< TAllocator, TKey, TMapped, THash, TEqual, THashCaching, TRecycling > HashMap
Type alias in namespace #"%alib".
const ::std::type_info * Key
The key type.