LMMS
Loading...
Searching...
No Matches
juce_Singleton.h File Reference

Go to the source code of this file.

Classes

struct  juce::SingletonHolder< Type, MutexType, onlyCreateOncePerRun >

Namespaces

namespace  juce

Macros

#define JUCE_DECLARE_SINGLETON(Classname, doNotRecreateAfterDeletion)
#define JUCE_IMPLEMENT_SINGLETON(Classname)
#define JUCE_DECLARE_SINGLETON_SINGLETHREADED(Classname, doNotRecreateAfterDeletion)
#define JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL(Classname)
#define juce_DeclareSingleton(Classname, doNotRecreate)
#define juce_DeclareSingleton_SingleThreaded(Classname, doNotRecreate)
#define juce_DeclareSingleton_SingleThreaded_Minimal(Classname)
#define juce_ImplementSingleton(Classname)
#define juce_ImplementSingleton_SingleThreaded(Classname)

Macro Definition Documentation

◆ JUCE_DECLARE_SINGLETON

#define JUCE_DECLARE_SINGLETON ( Classname,
doNotRecreateAfterDeletion )
Value:
\
static juce::SingletonHolder<Classname, juce::CriticalSection, doNotRecreateAfterDeletion> singletonHolder; \
friend juce::SingletonHolder<Classname, juce::CriticalSection, doNotRecreateAfterDeletion>; \
\
static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.get(); } \
static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \
static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \
void clearSingletonInstance() noexcept { singletonHolder.clear (this); }
#define noexcept
Definition DistrhoDefines.h:72
#define JUCE_CALLTYPE
std::atomic< Type * > instance
Definition juce_Singleton.h:123
void clear(Type *expectedObject) noexcept
Definition juce_Singleton.h:116
Type * get()
Definition juce_Singleton.h:54
void deleteInstance()
Definition juce_Singleton.h:109

Macro to generate the appropriate methods and boilerplate for a singleton class.

To use this, add the line JUCE_DECLARE_SINGLETON(MyClass, doNotRecreateAfterDeletion) to the class's definition.

Then put a macro JUCE_IMPLEMENT_SINGLETON(MyClass) along with the class's implementation code.

It's also a very good idea to also add the call clearSingletonInstance() in your class's destructor, in case it is deleted by other means than deleteInstance()

Clients can then call the static method MyClass::getInstance() to get a pointer to the singleton, or MyClass::getInstanceWithoutCreating() which will return nullptr if no instance currently exists.

e.g.

struct MySingleton
{
MySingleton() {}
~MySingleton()
{
// this ensures that no dangling pointers are left when the
// singleton is deleted.
clearSingletonInstance();
}
JUCE_DECLARE_SINGLETON (MySingleton, false)
};
// ..and this goes in a suitable .cpp file:
// example of usage:
auto* m = MySingleton::getInstance(); // creates the singleton if there isn't already one.
...
MySingleton::deleteInstance(); // safely deletes the singleton (if it's been created).
unsigned * m
Definition inflate.c:1559
#define JUCE_IMPLEMENT_SINGLETON(Classname)
Definition juce_Singleton.h:201
#define JUCE_DECLARE_SINGLETON(Classname, doNotRecreateAfterDeletion)
Definition juce_Singleton.h:184

If doNotRecreateAfterDeletion = true, it won't allow the object to be created more than once during the process's lifetime - i.e. after you've created and deleted the object, getInstance() will refuse to create another one. This can be useful to stop objects being accidentally re-created during your app's shutdown code.

If you know that your object will only be created and deleted by a single thread, you can use the slightly more efficient JUCE_DECLARE_SINGLETON_SINGLETHREADED macro instead of this one.

See also
JUCE_IMPLEMENT_SINGLETON, JUCE_DECLARE_SINGLETON_SINGLETHREADED

◆ JUCE_DECLARE_SINGLETON_SINGLETHREADED

#define JUCE_DECLARE_SINGLETON_SINGLETHREADED ( Classname,
doNotRecreateAfterDeletion )
Value:
\
static juce::SingletonHolder<Classname, juce::DummyCriticalSection, doNotRecreateAfterDeletion> singletonHolder; \
friend decltype (singletonHolder); \
\
static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.get(); } \
static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \
static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \
void clearSingletonInstance() noexcept { singletonHolder.clear (this); }

Macro to declare member variables and methods for a singleton class.

This is exactly the same as JUCE_DECLARE_SINGLETON, but doesn't use a critical section to make access to it thread-safe. If you know that your object will only ever be created or deleted by a single thread, then this is a more efficient version to use.

If doNotRecreateAfterDeletion = true, it won't allow the object to be created more than once during the process's lifetime - i.e. after you've created and deleted the object, getInstance() will refuse to create another one. This can be useful to stop objects being accidentally re-created during your app's shutdown code.

See the documentation for JUCE_DECLARE_SINGLETON for more information about how to use it. Just like JUCE_DECLARE_SINGLETON you need to also have a corresponding JUCE_IMPLEMENT_SINGLETON statement somewhere in your code.

See also
JUCE_IMPLEMENT_SINGLETON, JUCE_DECLARE_SINGLETON, JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL

◆ JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL

#define JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL ( Classname)
Value:
\
static juce::SingletonHolder<Classname, juce::DummyCriticalSection, false> singletonHolder; \
friend decltype (singletonHolder); \
\
static Classname* JUCE_CALLTYPE getInstance() { return singletonHolder.getWithoutChecking(); } \
static Classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept { return singletonHolder.instance; } \
static void JUCE_CALLTYPE deleteInstance() noexcept { singletonHolder.deleteInstance(); } \
void clearSingletonInstance() noexcept { singletonHolder.clear (this); }
Type * getWithoutChecking()
Definition juce_Singleton.h:98

Macro to declare member variables and methods for a singleton class.

This is like JUCE_DECLARE_SINGLETON_SINGLETHREADED, but doesn't do any checking for recursion or repeated instantiation. It's intended for use as a lightweight version of a singleton, where you're using it in very straightforward circumstances and don't need the extra checking.

See the documentation for JUCE_DECLARE_SINGLETON for more information about how to use it. Just like JUCE_DECLARE_SINGLETON you need to also have a corresponding JUCE_IMPLEMENT_SINGLETON statement somewhere in your code.

See also
JUCE_IMPLEMENT_SINGLETON, JUCE_DECLARE_SINGLETON

◆ juce_DeclareSingleton

#define juce_DeclareSingleton ( Classname,
doNotRecreate )
Value:
JUCE_DECLARE_SINGLETON(Classname, doNotRecreate)

◆ juce_DeclareSingleton_SingleThreaded

#define juce_DeclareSingleton_SingleThreaded ( Classname,
doNotRecreate )
Value:
JUCE_DECLARE_SINGLETON_SINGLETHREADED(Classname, doNotRecreate)
#define JUCE_DECLARE_SINGLETON_SINGLETHREADED(Classname, doNotRecreateAfterDeletion)
Definition juce_Singleton.h:226

◆ juce_DeclareSingleton_SingleThreaded_Minimal

#define juce_DeclareSingleton_SingleThreaded_Minimal ( Classname)
Value:
#define JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL(Classname)
Definition juce_Singleton.h:252

◆ JUCE_IMPLEMENT_SINGLETON

#define JUCE_IMPLEMENT_SINGLETON ( Classname)
Value:
\
decltype (Classname::singletonHolder) Classname::singletonHolder;

This is a counterpart to the JUCE_DECLARE_SINGLETON macros.

After adding the JUCE_DECLARE_SINGLETON to the class definition, this macro has to be used in the cpp file.

◆ juce_ImplementSingleton

#define juce_ImplementSingleton ( Classname)
Value:

◆ juce_ImplementSingleton_SingleThreaded

#define juce_ImplementSingleton_SingleThreaded ( Classname)
Value: