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();