41template <
typename Type,
typename MutexType,
bool onlyCreateOncePerRun>
54 jassert (instance ==
nullptr);
60 if (instance ==
nullptr)
62 typename MutexType::ScopedLockType
sl (*
this);
64 if (instance ==
nullptr)
108 if (instance ==
nullptr)
120 typename MutexType::ScopedLockType
sl (*
this);
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)
Holds a resizable array of primitive or copy-by-value objects.
Used by the JUCE_DECLARE_SINGLETON macros to manage a static pointer to a singleton instance.
void clear(Type *expectedObject) noexcept
Called by the class's destructor to clear the pointer if it is currently set to the given object.
Type * get()
Returns the current instance, or creates a new instance if there isn't one.
void deleteInstance()
Deletes and resets the current instance, if there is one.
Type * getWithoutChecking()
Returns the current instance, or creates a new instance if there isn't one, but doesn't do any lockin...