19 #ifndef LIB_CS_SHARED_POINTER_H
20 #define LIB_CS_SHARED_POINTER_H
27 template <
typename T,
typename Deleter>
59 template <
typename U,
typename Deleter>
61 : m_ptr(p, std::move(d))
65 template <
typename Deleter>
67 : m_ptr(nullptr, std::move(d))
71 template <
typename U,
typename Deleter,
typename Alloc>
73 : m_ptr(p, std::move(d), std::move(a))
77 template <
typename Deleter,
typename Alloc>
79 : m_ptr(nullptr, std::move(d), std::move(a))
83 template <
typename U,
typename Deleter>
85 : m_ptr(std::unique_ptr<U, Deleter>(std::move(p)))
101 template <
typename U>
103 : m_ptr(p1.m_ptr, p2)
107 template <
typename U>
109 : m_ptr(std::move(p1.m_ptr), p2)
122 template <
typename U>
128 template <
typename U>
134 template <
typename U>
136 : m_ptr(std::move(p.m_ptr))
140 template <
typename U>
142 m_ptr = std::move(p.m_ptr);
146 template <
typename U>
148 : m_ptr(p.m_ptr.lock())
151 throw std::bad_weak_ptr();
155 template <
typename U>
157 m_ptr = p.m_ptr.lock();
170 return m_ptr ==
nullptr;
173 explicit operator bool() const noexcept {
174 return m_ptr !=
nullptr;
177 template <
typename U>
178 operator std::shared_ptr<U>() const & noexcept
183 template <
typename U>
184 operator std::shared_ptr<U>() &&
noexcept
186 return std::move(m_ptr);
194 template <
typename... Args>
196 return std::make_shared<T>(std::forward<Args>(args)...);
208 return m_ptr ==
nullptr;
211 template <
typename U>
213 return m_ptr.owner_before(p.m_ptr);
216 template <
typename U>
218 return m_ptr.owner_before(p.m_ptr);
225 template <
typename U>
227 if (m_ptr.get() == p) {
234 template <
typename U,
typename Deleter>
236 if (m_ptr.get() == p) {
240 m_ptr.reset(p, std::move(d));
243 template <
typename U,
typename Deleter,
typename Alloc>
244 void reset(U *p, Deleter d, Alloc a) {
245 if (m_ptr.get() == p) {
249 m_ptr.reset(p, std::move(d), std::move(a));
253 std::swap(m_ptr, other.m_ptr);
261 return m_ptr.use_count() == 1;
265 return m_ptr.use_count();
268 template <
typename U>
270 return this->m_ptr <=> ptr.m_ptr;
273 template <
typename U>
274 bool operator==(
const CsSharedPointer<U> &ptr)
const noexcept {
275 return this->m_ptr == ptr.m_ptr;
278 template <
typename U>
279 auto operator<=>(
const U *ptr)
const noexcept {
280 return this->
get() <=> ptr;
283 template <
typename U>
284 bool operator==(
const U *ptr)
const noexcept {
285 return this->
get() == ptr;
288 auto operator<=>(std::nullptr_t)
const noexcept {
289 return this->m_ptr <=>
nullptr;
292 bool operator==(std::nullptr_t)
const noexcept {
293 return this->m_ptr ==
nullptr;
297 std::shared_ptr<T> m_ptr;
299 template <
typename U>
300 friend class CsSharedArrayPointer;
302 template <
typename U>
303 friend class CsSharedPointer;
305 template <
typename U>
306 friend class CsWeakPointer;
309 template <
typename T,
typename... Args,
typename =
typename std::enable_if_t<! std::is_array_v<T>>>
312 return std::make_shared<T>(std::forward<Args>(args)...);
315 template <
typename T>
322 template <
typename T,
typename U>
325 return std::static_pointer_cast<T> (std::shared_ptr<U>(ptr));
328 template <
typename T,
typename U>
331 return std::dynamic_pointer_cast<T> (std::shared_ptr<U>(ptr));
334 template <
typename T,
typename U>
337 return std::const_pointer_cast<T> (std::shared_ptr<U>(ptr));
340 template <
typename T,
typename U>
343 return std::static_pointer_cast<T> (std::shared_ptr<U>(std::move(ptr)));
346 template <
typename T,
typename U>
349 return std::dynamic_pointer_cast<T> (std::shared_ptr<U>(std::move(ptr)));
352 template <
typename T,
typename U>
355 return std::const_pointer_cast<T> (std::shared_ptr<U>(std::move(ptr)));
CsSharedPointer< T > static_pointer_cast(const CsSharedPointer< U > &ptr)
Definition: cs_shared_pointer.h:323
bool unique() const noexcept
Definition: cs_shared_pointer.h:260
void swap(CsSharedPointer &other) noexcept
Definition: cs_shared_pointer.h:252
CsSharedPointer< T > dynamic_pointer_cast(const CsSharedPointer< U > &ptr)
Definition: cs_shared_pointer.h:329
bool owner_before(const CsWeakPointer< U > &p) const noexcept
Definition: cs_shared_pointer.h:217
CsWeakPointer< T > toWeakRef() const
Definition: cs_shared_pointer.h:256
pointer get() const noexcept
Definition: cs_shared_pointer.h:203
CsSharedPointer< T > const_pointer_cast(const CsSharedPointer< U > &ptr)
Definition: cs_shared_pointer.h:335
pointer data() const noexcept
Definition: cs_shared_pointer.h:199
static CsSharedPointer< T > create(Args &&...args)
Definition: cs_shared_pointer.h:195
void clear() noexcept
Definition: cs_shared_pointer.h:190
void reset(U *p, Deleter d, Alloc a)
Definition: cs_shared_pointer.h:244
void reset() noexcept
Definition: cs_shared_pointer.h:221
pointer operator->() const noexcept
Definition: cs_shared_pointer.h:165
element_type & operator*() const noexcept
Definition: cs_shared_pointer.h:161
CsSharedPointer & operator=(const CsWeakPointer< U > &p)
Definition: cs_shared_pointer.h:156
bool is_null() const noexcept
Definition: cs_shared_pointer.h:207
CsSharedPointer(const CsWeakPointer< U > &p)
Definition: cs_shared_pointer.h:147
long use_count() const noexcept
Definition: cs_shared_pointer.h:264
CsSharedPointer(const CsSharedPointer< U > &p) noexcept
Definition: cs_shared_pointer.h:123
void reset(U *p, Deleter d)
Definition: cs_shared_pointer.h:235
~CsSharedPointer() = default
CsSharedPointer(CsSharedPointer< U > &&p1, element_type *p2) noexcept
Definition: cs_shared_pointer.h:108
CsSharedPointer(const CsSharedPointer< U > &p1, element_type *p2) noexcept
Definition: cs_shared_pointer.h:102
CsSharedPointer(std::shared_ptr< U > &&p) noexcept
Definition: cs_shared_pointer.h:96
CsSharedPointer(std::nullptr_t, Deleter d, Alloc a)
Definition: cs_shared_pointer.h:78
bool operator==(const CsSharedPointer< T1 > &ptr1, const CsSharedPointer< T2 > &ptr2)
CsSharedPointer(U *p, Deleter d, Alloc a)
Definition: cs_shared_pointer.h:72
CsSharedPointer(std::nullptr_t, Deleter d)
Definition: cs_shared_pointer.h:66
CsSharedPointer(U *p, Deleter d)
Definition: cs_shared_pointer.h:60
bool owner_before(const CsSharedPointer< U > &p) const noexcept
Definition: cs_shared_pointer.h:212
CsSharedPointer(U *p)
Definition: cs_shared_pointer.h:54
CsSharedPointer(const std::shared_ptr< U > &p) noexcept
Definition: cs_shared_pointer.h:90
constexpr CsSharedPointer(std::nullptr_t) noexcept
Definition: cs_shared_pointer.h:49
CsSharedPointer & operator=(const CsSharedPointer< U > &p) noexcept
Definition: cs_shared_pointer.h:129
constexpr CsSharedPointer() noexcept
Definition: cs_shared_pointer.h:45
bool operator!() const noexcept
Definition: cs_shared_pointer.h:169
pointer Pointer
Definition: cs_shared_pointer.h:43
CsSharedPointer< T > make_shared(Args &&...args)
Definition: cs_shared_pointer.h:310
void reset(U *p)
Definition: cs_shared_pointer.h:226
CsSharedPointer & operator=(CsSharedPointer< U > &&p) noexcept
Definition: cs_shared_pointer.h:141
CsWeakPointer< T > weak_type
Definition: cs_shared_pointer.h:38
CsSharedPointer & operator=(const CsSharedPointer &other) = default
element_type ElementType
Definition: cs_shared_pointer.h:41
CsSharedPointer(CsUniquePointer< U, Deleter > &&p)
Definition: cs_shared_pointer.h:84
element_type * pointer
Definition: cs_shared_pointer.h:39
typename std::shared_ptr< cs_add_missing_extent_t< T > >::element_type element_type
Definition: cs_shared_pointer.h:37
Stores a pointer to a potentially shared object.
Definition: cs_shared_pointer.h:34
Stores a weak pointer to a potentially shared object.
Definition: cs_shared_pointer.h:31
CsSharedPointer(CsSharedPointer< U > &&p) noexcept
Definition: cs_shared_pointer.h:135
Contains a pointer to an object and takes exclusive ownership.
Definition: cs_shared_pointer.h:28
Namespace for the CsPointer library.