37 template <
typename Type,
typename MutexType,
bool onlyCreateOncePerRun>
50 jassert (instance ==
nullptr);
56 if (instance ==
nullptr)
58 typename MutexType::ScopedLockType sl (*
this);
60 if (instance ==
nullptr)
62 auto once = onlyCreateOncePerRun;
66 static bool createdOnceAlready =
false;
68 if (createdOnceAlready)
76 createdOnceAlready =
true;
79 static bool alreadyInside =
false;
91 alreadyInside =
false;
104 if (instance ==
nullptr)
106 auto newObject =
new Type();
107 instance = newObject;
116 typename MutexType::ScopedLockType sl (*
this);
123 void clear (Type* expectedObject) noexcept
125 if (instance == expectedObject)
129 Type* instance =
nullptr;
190 #define JUCE_DECLARE_SINGLETON(Classname, doNotRecreateAfterDeletion) \ 192 static juce::SingletonHolder<Classname, juce::CriticalSection, doNotRecreateAfterDeletion> singletonHolder; \ 193 friend decltype (singletonHolder); \ 195 static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.get(); } \ 196 static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \ 197 static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \ 198 void clearSingletonInstance() noexcept { singletonHolder.clear (this); } 207 #define JUCE_IMPLEMENT_SINGLETON(Classname) \ 209 decltype (Classname::singletonHolder) Classname::singletonHolder; 232 #define JUCE_DECLARE_SINGLETON_SINGLETHREADED(Classname, doNotRecreateAfterDeletion) \ 234 static juce::SingletonHolder<Classname, juce::DummyCriticalSection, doNotRecreateAfterDeletion> singletonHolder; \ 235 friend decltype (singletonHolder); \ 237 static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.get(); } \ 238 static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \ 239 static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \ 240 void clearSingletonInstance() noexcept { singletonHolder.clear (this); } 258 #define JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL(Classname) \ 260 static juce::SingletonHolder<Classname, juce::DummyCriticalSection, false> singletonHolder; \ 261 friend decltype (singletonHolder); \ 263 static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.getWithoutChecking(); } \ 264 static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \ 265 static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \ 266 void clearSingletonInstance() noexcept { singletonHolder.clear (this); } 273 #define juce_DeclareSingleton(Classname, doNotRecreate) JUCE_DECLARE_SINGLETON(Classname, doNotRecreate) 274 #define juce_DeclareSingleton_SingleThreaded(Classname, doNotRecreate) JUCE_DECLARE_SINGLETON_SINGLETHREADED(Classname, doNotRecreate) 275 #define juce_DeclareSingleton_SingleThreaded_Minimal(Classname) JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL(Classname) 276 #define juce_ImplementSingleton(Classname) JUCE_IMPLEMENT_SINGLETON(Classname) 277 #define juce_ImplementSingleton_SingleThreaded(Classname) JUCE_IMPLEMENT_SINGLETON(Classname)
Type * getWithoutChecking()
void clear(Type *expectedObject) noexcept