84 template <
typename SharedObjectType>
110 auto& holder = getSharedObjectHolder();
113 if (--(holder.refCount) == 0)
114 holder.sharedInstance =
nullptr;
118 operator SharedObjectType*()
const noexcept {
return sharedObject; }
121 SharedObjectType&
get() const noexcept {
return *sharedObject; }
126 SharedObjectType&
getObject() const noexcept {
return *sharedObject; }
129 SharedObjectType*
operator->() const noexcept {
return sharedObject; }
135 struct SharedObjectHolder
138 std::unique_ptr<SharedObjectType> sharedInstance;
142 static SharedObjectHolder& getSharedObjectHolder() noexcept
144 static void* holder [(
sizeof (SharedObjectHolder) +
sizeof(
void*) - 1) /
sizeof(
void*)] = {
nullptr };
145 return *
reinterpret_cast<SharedObjectHolder*
> (holder);
148 SharedObjectType* sharedObject;
152 auto& holder = getSharedObjectHolder();
155 if (++(holder.refCount) == 1)
156 holder.sharedInstance.reset (
new SharedObjectType());
158 sharedObject = holder.sharedInstance.get();
Automatically locks and unlocks a mutex object.
A smart-pointer that automatically creates and manages the lifetime of a shared static instance of a ...
~SharedResourcePointer()
Destructor.
int getReferenceCount() const noexcept
Returns the number of SharedResourcePointers that are currently holding the shared object.
SharedObjectType * operator->() const noexcept
Returns the shared object.
SharedResourcePointer()
Creates an instance of the shared object.
SharedObjectType & getObject() const noexcept
Returns the object that this pointer references.
SharedObjectType & get() const noexcept
Returns the shared object.
A simple spin-lock class that can be used as a simple, low-overhead mutex for uncontended situations.
GenericScopedLock< SpinLock > ScopedLockType
Provides the type of scoped lock to use for locking a SpinLock.