43#ifndef LASS_GUARDIAN_OF_INCLUSION_UTIL_SHARED_PTR_H
44#define LASS_GUARDIAN_OF_INCLUSION_UTIL_SHARED_PTR_H
57 template <
typename,
typename>
class StoragePolicy =
ObjectStorage,
60class SharedPtr:
public StoragePolicy<T, CounterPolicy>
65 typedef StoragePolicy<T, CounterPolicy> TStoragePolicy;
66 typedef CounterPolicy TCounterPolicy;
67 typedef typename TStoragePolicy::TStorage TStorage;
68 typedef typename TStoragePolicy::TPointer TPointer;
69 typedef typename TStoragePolicy::TReference TReference;
70 typedef typename TCounterPolicy::TCount TCount;
72 template <
typename U>
struct Rebind
74 typedef SharedPtr<U, StoragePolicy, CounterPolicy> Type;
81 explicit SharedPtr(TPointer p):
86 CounterPolicy::init(TStoragePolicy::storage());
89 SharedPtr(
const SharedPtr& other):
94 CounterPolicy::increment(TStoragePolicy::storage());
98 SharedPtr(SharedPtr&& other)
noexcept:
99 TStoragePolicy(std::move(other))
101 LASS_ASSERT(other.isEmpty());
104 template <
typename U> SharedPtr(
const SharedPtr<U, StoragePolicy, CounterPolicy>& other):
105 TStoragePolicy(other)
109 CounterPolicy::increment(TStoragePolicy::storage());
115 if (!isEmpty() && CounterPolicy::decrement(TStoragePolicy::storage()))
117 CounterPolicy::dispose(TStoragePolicy::storage());
118 TStoragePolicy::dispose();
122 SharedPtr& operator=(
const SharedPtr& other)
124 SharedPtr temp(other);
129 SharedPtr& operator=(SharedPtr&& other)
noexcept
131 SharedPtr temp(std::forward<SharedPtr>(other));
132 LASS_ASSERT(other.isEmpty());
137 void reset(TPointer p = 0)
143 template <
typename U> SharedPtr(std::unique_ptr<U>&& p) :
144 TStoragePolicy(p.get())
148 CounterPolicy::init(TStoragePolicy::storage());
152 template <
typename U>
void reset(std::unique_ptr<U>&& p)
154 SharedPtr temp(std::forward<std::unique_ptr<U>>(p));
159 void swap(SharedPtr& other)
161 TStoragePolicy::swap(other);
166 return TStoragePolicy::pointer();
168 TPointer operator->()
const
173 TReference operator*()
const
178 TReference operator[](
size_t i)
const
181 return TStoragePolicy::at(i);
184 const TCount count()
const
186 return isEmpty() ? 0 : TCounterPolicy::count(TStoragePolicy::storage());
190 return TStoragePolicy::isNull();
192 bool operator!()
const
196 explicit operator bool()
const
202 const TStorage& storage()
const
204 return TStoragePolicy::storage();
209 return TStoragePolicy::storage();
212 template <
typename U>
213 const SharedPtr<U, StoragePolicy, CounterPolicy> staticCast()
const
215 return SharedPtr<U, StoragePolicy, CounterPolicy>(TStoragePolicy::template staticCast<U>());
218 template <
typename U>
219 const SharedPtr<U, StoragePolicy, CounterPolicy> dynamicCast()
const
221 return SharedPtr<U, StoragePolicy, CounterPolicy>(TStoragePolicy::template dynamicCast<U>());
224 template <
typename U>
225 const SharedPtr<U, StoragePolicy, CounterPolicy> constCast()
const
227 return SharedPtr<U, StoragePolicy, CounterPolicy>(TStoragePolicy::template constCast<U>());
232 template <
typename U,
template <
typename,
typename>
class S,
typename C>
friend class SharedPtr;
234 SharedPtr(
const TStoragePolicy& storage):
235 TStoragePolicy(storage)
239 CounterPolicy::increment(TStoragePolicy::storage());
244template <
typename T1,
template <
typename,
typename>
class S1,
typename C1,
typename T2,
template <
typename,
typename>
class S2,
typename C2>
245bool operator==(
const SharedPtr<T1, S1, C1>& a,
const SharedPtr<T2, S2, C2>& b)
247 return a.get() == b.get();
250template <
typename T1,
template <
typename,
typename>
class S1,
typename C1,
typename T2,
template <
typename,
typename>
class S2,
typename C2>
251bool operator!=(
const SharedPtr<T1, S1, C1>& a,
const SharedPtr<T2, S2, C2>& b)
256template <
typename T,
template <
typename,
typename>
class S,
typename C>
257bool operator==(
const SharedPtr<T, S, C>& a, std::nullptr_t)
262template <
typename T,
template <
typename,
typename>
class S,
typename C>
263bool operator!=(
const SharedPtr<T, S, C>& a, std::nullptr_t)
265 return static_cast<bool>(a);
268template <
typename T,
template <
typename,
typename>
class S,
typename C>
269bool operator==(std::nullptr_t,
const SharedPtr<T, S, C>& b)
274template <
typename T,
template <
typename,
typename>
class S,
typename C>
275bool operator!=(std::nullptr_t,
const SharedPtr<T, S, C>& b)
277 return static_cast<bool>(b);
The default counter for the shared pointers, implementation of CounterPolicy concept.
Default storage policy for single objects, implementation of StoragePolicy concept.
general utility, debug facilities, ...
Library for Assembled Shared Sources.