11#if !defined(ALIB_C20_MODULES) || ((ALIB_C20_MODULES != 0) && (ALIB_C20_MODULES != 1))
12# error "Symbol ALIB_C20_MODULES has to be given to the compiler as either 0 or 1"
20#if ALIB_FEAT_SINGLETON_MAPPED
21# if !ALIB_MONOMEM || !ALIB_CONTAINERS
22# include <unordered_map>
39# if ALIB_FEAT_SINGLETON_MAPPED
40# if ALIB_DEBUG && ALIB_STRINGS
52# if ALIB_FEAT_SINGLETON_MAPPED
66#if ALIB_FEAT_SINGLETON_MAPPED && !DOXYGEN
67namespace alib::singletons::hidden {
68# if ALIB_MONOMEM && ALIB_CONTAINERS
70 lang::TypeFunctors::Hash,
71 lang::TypeFunctors::EqualTo,
73 Recycling::None > singletonMap;
75 extern std::unordered_map< lang::TypeFunctors::Key,
void *,
76 lang::TypeFunctors::Hash,
77 lang::TypeFunctors::EqualTo > singletonMap;
79# if !ALIB_MONOMEM && !ALIB_SINGLE_THREADED
80 extern std::mutex singletonMapMutex;
82 extern ALIB_DLL void *getSingleton(
const std::type_info &type);
83 extern ALIB_DLL void storeSingleton(
const std::type_info &type,
void *theSingleton);
84 extern ALIB_DLL void removeSingleton(
const std::type_info &type);
101template<
typename TDerivedClass>
108 #if !ALIB_FEAT_SINGLETON_MAPPED
110 static TDerivedClass singleton;
113 #if ALIB_SINGLE_THREADED
114 using TSingletonStorage = TDerivedClass *;
116 using TSingletonStorage = std::atomic<TDerivedClass *>;
120 static TSingletonStorage singleton =
nullptr;
123 TDerivedClass *result = singleton;
124 if (result !=
nullptr)
131 #if !ALIB_SINGLE_THREADED
135 std::lock_guard<std::mutex> guard(hidden::singletonMapMutex);
140 void *storedSingleton = hidden::getSingleton(
typeid(TDerivedClass));
141 if (storedSingleton !=
nullptr) {
142 singleton =
dynamic_cast<TDerivedClass *
>(
148 auto *firstInstance =
new TDerivedClass();
149 hidden::storeSingleton(
typeid(TDerivedClass),
155 return *firstInstance;
157 return *(singleton = firstInstance);
167 #if ALIB_FEAT_SINGLETON_MAPPED
168 #if !ALIB_SINGLE_THREADED
172 std::lock_guard<std::mutex> guard(hidden::singletonMapMutex);
175 hidden::removeSingleton(
typeid(TDerivedClass));
205#if ALIB_FEAT_SINGLETON_MAPPED && ALIB_DEBUG
209#if ALIB_MONOMEM && ALIB_CONTAINERS
231 lang::TypeFunctors::Hash,
232 lang::TypeFunctors::EqualTo,
237 lang::TypeFunctors::Hash,
static TDerivedClass & GetSingleton()
virtual ~Singleton()
Virtual destructor.
#define ALIB_LOCK_RECURSIVE_WITH(lock)
HashTable< TAllocator, TPairDescriptor< TKey, TMapped >, THash, TEqual, THashCaching, TRecycling > HashMap
ALIB_DLL RecursiveLock GLOBAL_ALLOCATOR_LOCK
HashMap< MonoAllocator, lang::TypeFunctors::Key, void *, lang::TypeFunctors::Hash, lang::TypeFunctors::EqualTo, lang::Caching::Auto, Recycling::None > & DbgGetSingletons()
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.
monomem::TMonoAllocator< lang::HeapAllocator > MonoAllocator
const ::std::type_info * Key
The key type.