41 template <
typename Type,
typename MutexType,
bool onlyCreateOncePerRun>
54 jassert (instance ==
nullptr);
60 if (instance ==
nullptr)
62 typename MutexType::ScopedLockType sl (*
this);
64 if (instance ==
nullptr)
66 auto once = onlyCreateOncePerRun;
70 static bool createdOnceAlready =
false;
72 if (createdOnceAlready)
80 createdOnceAlready =
true;
83 static bool alreadyInside =
false;
95 alreadyInside =
false;
108 if (instance ==
nullptr)
110 auto newObject =
new Type();
111 instance = newObject;
120 typename MutexType::ScopedLockType sl (*
this);
127 void clear (Type* expectedObject) noexcept
129 if (instance == expectedObject)
133 Type* instance =
nullptr;
194 #define JUCE_DECLARE_SINGLETON(Classname, doNotRecreateAfterDeletion) \ 196 static juce::SingletonHolder<Classname, juce::CriticalSection, doNotRecreateAfterDeletion> singletonHolder; \ 197 friend decltype (singletonHolder); \ 199 static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.get(); } \ 200 static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \ 201 static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \ 202 void clearSingletonInstance() noexcept { singletonHolder.clear (this); } 211 #define JUCE_IMPLEMENT_SINGLETON(Classname) \ 213 decltype (Classname::singletonHolder) Classname::singletonHolder; 236 #define JUCE_DECLARE_SINGLETON_SINGLETHREADED(Classname, doNotRecreateAfterDeletion) \ 238 static juce::SingletonHolder<Classname, juce::DummyCriticalSection, doNotRecreateAfterDeletion> singletonHolder; \ 239 friend decltype (singletonHolder); \ 241 static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.get(); } \ 242 static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \ 243 static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \ 244 void clearSingletonInstance() noexcept { singletonHolder.clear (this); } 262 #define JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL(Classname) \ 264 static juce::SingletonHolder<Classname, juce::DummyCriticalSection, false> singletonHolder; \ 265 friend decltype (singletonHolder); \ 267 static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.getWithoutChecking(); } \ 268 static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \ 269 static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \ 270 void clearSingletonInstance() noexcept { singletonHolder.clear (this); } 277 #define juce_DeclareSingleton(Classname, doNotRecreate) JUCE_DECLARE_SINGLETON(Classname, doNotRecreate) 278 #define juce_DeclareSingleton_SingleThreaded(Classname, doNotRecreate) JUCE_DECLARE_SINGLETON_SINGLETHREADED(Classname, doNotRecreate) 279 #define juce_DeclareSingleton_SingleThreaded_Minimal(Classname) JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL(Classname) 280 #define juce_ImplementSingleton(Classname) JUCE_IMPLEMENT_SINGLETON(Classname) 281 #define juce_ImplementSingleton_SingleThreaded(Classname) JUCE_IMPLEMENT_SINGLETON(Classname)
Type * getWithoutChecking()
Returns the current instance, or creates a new instance if there isn't one, but doesn't do any lockin...
void clear(Type *expectedObject) noexcept
Called by the class's destructor to clear the pointer if it is currently set to the given object...
void deleteInstance()
Deletes and resets the current instance, if there is one.
Used by the JUCE_DECLARE_SINGLETON macros to manage a static pointer to a singleton instance...