7#ifndef MYGUI_SINGLETON_H_
8#define MYGUI_SINGLETON_H_
15#ifndef MYGUI_DONT_USE_OBSOLETE
20 #if defined(__clang__)
23 __attribute__((no_sanitize(
"vptr")))
28 msInstance =
static_cast<T*
>(
this);
33 if (
nullptr == msInstance)
36 "Destroying Singleton instance " <<
getClassTypeName() <<
" before constructing it.");
55 return mClassTypeName;
60 static std::string_view mClassTypeName;
101 mInstance->initialiseSingleton();
105 mInstance->shutdownSingleton();
112#define MYGUI_SINGLETON_DECLARATION(ClassName) \
114 friend MyGUI::SingletonHolder<ClassName>; \
115 MyGUI::SingletonHolder<ClassName> mSingletonHolder; \
116 void initialiseSingleton(); \
117 void shutdownSingleton(); \
120 static ClassName& getInstance(); \
121 static ClassName* getInstancePtr(); \
122 static std::string_view getClassTypeName(); \
123 ClassName(const ClassName&) = delete; \
124 ClassName& operator=(const ClassName&) = delete
126#define MYGUI_SINGLETON_DEFINITION(ClassName) \
127 static ClassName* ClassName##Instance = nullptr; \
128 static std::string_view ClassName##ClassTypeName = #ClassName; \
130 void ClassName::initialiseSingleton() \
133 nullptr == ClassName##Instance, \
134 "Singleton instance " << getClassTypeName() << " already exsist"); \
135 ClassName##Instance = this; \
138 void ClassName::shutdownSingleton() \
140 if (nullptr == ClassName##Instance) \
141 MYGUI_LOG(Critical, "Destroying Singleton instance " << getClassTypeName() << " before constructing it."); \
142 ClassName##Instance = nullptr; \
145 ClassName& ClassName::getInstance() \
147 MYGUI_ASSERT(nullptr != getInstancePtr(), "Singleton instance " << getClassTypeName() << " was not created"); \
148 return (*getInstancePtr()); \
151 ClassName* ClassName::getInstancePtr() \
153 return ClassName##Instance; \
156 std::string_view ClassName::getClassTypeName() \
158 return ClassName##ClassTypeName; \
160 static_assert(true, "require semicolon")
#define MYGUI_ASSERT(exp, dest)
#define MYGUI_OBSOLETE(text)
#define MYGUI_LOG(level, text)
SingletonHolder(T *instance)
static T * getInstancePtr()
static std::string_view getClassTypeName()