80template <
typename SharedObjectType>
106 auto& holder = getSharedObjectHolder();
109 if (--(holder.refCount) == 0)
110 holder.sharedInstance =
nullptr;
114 operator SharedObjectType*()
const noexcept {
return sharedObject; }
117 SharedObjectType&
get() const noexcept {
return *sharedObject; }
122 SharedObjectType&
getObject() const noexcept {
return *sharedObject; }
125 SharedObjectType*
operator->() const noexcept {
return sharedObject; }
131 struct SharedObjectHolder
134 std::unique_ptr<SharedObjectType> sharedInstance;
138 static SharedObjectHolder& getSharedObjectHolder() noexcept
140 static void* holder [(
sizeof (SharedObjectHolder) +
sizeof(
void*) - 1) /
sizeof(
void*)] = {
nullptr };
141 return *
reinterpret_cast<SharedObjectHolder*
> (holder);
144 SharedObjectType* sharedObject;
148 auto& holder = getSharedObjectHolder();
151 if (++(holder.refCount) == 1)
152 holder.sharedInstance.reset (
new SharedObjectType());
154 sharedObject = holder.sharedInstance.get();
int getReferenceCount() const noexcept
SharedObjectType & getObject() const noexcept
SharedObjectType & get() const noexcept
SharedObjectType * operator->() const noexcept
GenericScopedLock< SpinLock > ScopedLockType