18#ifndef TRINITYCORE_UNIQUE_TRACKABLE_PTR_H
19#define TRINITYCORE_UNIQUE_TRACKABLE_PTR_H
26class unique_trackable_ptr;
32class unique_strong_ref_ptr;
51 template <
typename Deleter, std::enable_if_t<std::conjunction_v<std::is_move_constructible<Deleter>, std::is_invocable<Deleter&, T*&>>,
int> = 0>
53 :
_ptr(ptr,
std::move(deleter)) { }
58 :
_ptr(std::move(other._ptr)) { }
60 template <
typename T2, std::enable_if_t<std::is_convertible_v<T2*, T*>,
int> = 0>
68 _ptr = std::move(other._ptr);
72 template <
typename T2, std::enable_if_t<std::is_convertible_v<T2*, T*>,
int> = 0>
100 return _ptr.operator->();
108 explicit operator bool()
const
110 return static_cast<bool>(
_ptr);
123 template <
class Deleter, std::enable_if_t<std::conjunction_v<std::is_move_constructible<Deleter>, std::is_invocable<Deleter&, T*&>>,
int> = 0>
126 _ptr.reset(ptr, std::move(deleter));
130 template <
typename T0>
133 template <
typename T0>
136 template <
typename T0,
typename... Args>
139 template <
typename T0>
142 template <
typename T0>
145 template <
typename T0>
148 template <
typename T0>
151 std::shared_ptr<element_type>
_ptr;
172 template <
typename T2, std::enable_if_t<std::is_convertible_v<T2*, T*>,
int> = 0>
174 :
_ptr(other._ptr) { }
178 template <
typename T2, std::enable_if_t<std::is_convertible_v<T2*, T*>,
int> = 0>
182 template <
typename T2>
184 :
_ptr(
std::shared_ptr<T>(aliased.
_ptr, aliasValue)) { }
186 template <
typename T2>
188 :
_ptr(
std::shared_ptr<T>(
std::move(aliased).
_ptr, aliasValue)) { }
198 template <
typename T2, std::enable_if_t<std::is_convertible_v<T2*, T*>,
int> = 0>
223 return _ptr.expired();
232 template <
typename T0>
235 template <
typename T0>
238 template <
class To,
class From>
241 template <
class To,
class From>
244 template <
class To,
class From>
247 template <
class To,
class From>
250 std::weak_ptr<element_type>
_ptr;
280 return _ptr.operator->();
288 explicit operator bool()
const
290 return static_cast<bool>(
_ptr);
301 template <
typename T0>
304 template <
class To,
class From>
307 template <
class To,
class From>
310 template <
class To,
class From>
313 template <
class To,
class From>
316 template <
class To,
class From>
319 template <
class To,
class From>
322 template <
class To,
class From>
325 template <
class To,
class From>
330 std::shared_ptr<element_type>
_ptr;
335template <
typename T1,
typename T2>
338 return left.
get() == right.
get();
341template <
typename T1,
typename T2>
344 return left.
get() <=> right.
get();
347template <
typename T1>
350 return left.
get() ==
nullptr;
353template <
typename T1>
356 return left.
get() <=>
nullptr;
359template <
typename T,
typename... Args>
363 ptr.
_ptr = std::make_shared<T>(std::forward<Args>(args)...);
371 ptr.
_ptr = std::make_shared<T>(N);
379 ptr.
_ptr = std::make_shared<T>(N, val);
387 ptr.
_ptr = std::make_shared<T>();
395 ptr.
_ptr = std::make_shared<T>(val);
401template <
class To,
class From>
405 to.
_ptr = std::static_pointer_cast<To>(other.
_ptr.lock());
409template <
class To,
class From>
413 to.
_ptr = std::const_pointer_cast<To>(other.
_ptr.lock());
417template <
class To,
class From>
421 to.
_ptr = std::reinterpret_pointer_cast<To>(other.
_ptr.lock());
425template <
class To,
class From>
429 to.
_ptr = std::dynamic_pointer_cast<To>(other.
_ptr.lock());
435template <
typename T1,
typename T2>
438 return left.
get() == right.
get();
441template <
typename T1,
typename T2>
444 return left.
get() <=> right.
get();
447template <
typename T1>
450 return left.
get() ==
nullptr;
453template <
typename T1>
456 return left.
get() <=>
nullptr;
459template <
class To,
class From>
465template <
class To,
class From>
471template <
class To,
class From>
477template <
class To,
class From>
483template <
class To,
class From>
489template <
class To,
class From>
495template <
class To,
class From>
501template <
class To,
class From>
Result of unique_weak_ptr::lock() function, this class holds a temporary strong reference to held obj...
pointer operator->() const
unique_strong_ref_ptr & operator=(unique_strong_ref_ptr &&)=delete
unique_strong_ref_ptr(std::shared_ptr< element_type > ptr)
std::shared_ptr< element_type > _ptr
~unique_strong_ref_ptr()=default
unique_strong_ref_ptr(unique_strong_ref_ptr const &)=delete
friend unique_strong_ref_ptr< To > dynamic_pointer_cast(unique_strong_ref_ptr< From > const &other)
friend unique_strong_ref_ptr< To > static_pointer_cast(unique_strong_ref_ptr< From > const &other)
unique_strong_ref_ptr & operator=(unique_strong_ref_ptr const &)=delete
friend unique_strong_ref_ptr< To > reinterpret_pointer_cast(unique_strong_ref_ptr< From > const &other)
unique_strong_ref_ptr(unique_strong_ref_ptr &&)=delete
friend unique_strong_ref_ptr< To > const_pointer_cast(unique_strong_ref_ptr< From > const &other)
element_type & operator*() const
Specialized variant of std::shared_ptr that enforces unique ownership and/or std::unique_ptr with std...
unique_trackable_ptr(unique_trackable_ptr const &)=delete
friend std::enable_if_t< std::is_bounded_array_v< T0 >, unique_trackable_ptr< T0 > > make_unique_trackable(std::remove_extent_t< T0 > const &val)
unique_trackable_ptr & operator=(unique_trackable_ptr const &)=delete
unique_trackable_ptr(unique_trackable_ptr< T2 > &&other) noexcept
std::shared_ptr< element_type > _ptr
void reset(pointer ptr, Deleter deleter)
friend std::enable_if_t< std::is_unbounded_array_v< T0 >, unique_trackable_ptr< T0 > > make_unique_trackable(std::size_t N, std::remove_extent_t< T0 > const &val)
~unique_trackable_ptr()=default
pointer operator->() const
friend std::enable_if_t<!std::is_array_v< T0 >, unique_trackable_ptr< T0 > > make_unique_trackable(Args &&... args)
unique_trackable_ptr & operator=(unique_trackable_ptr &&other) noexcept
unique_trackable_ptr(pointer ptr)
element_type & operator*() const
friend std::enable_if_t< std::is_bounded_array_v< T0 >, unique_trackable_ptr< T0 > > make_unique_trackable()
unique_trackable_ptr(pointer ptr, Deleter deleter)
unique_trackable_ptr & operator=(std::nullptr_t)
unique_trackable_ptr(unique_trackable_ptr &&other) noexcept
friend std::enable_if_t< std::is_unbounded_array_v< T0 >, unique_trackable_ptr< T0 > > make_unique_trackable(std::size_t N)
unique_trackable_ptr & operator=(unique_trackable_ptr< T2 > &&other) noexcept
void swap(unique_trackable_ptr &other) noexcept
Trinity::unique_trackable_ptr companion class, replicating what std::weak_ptr is to std::shared_ptr.
unique_weak_ptr & operator=(unique_weak_ptr &&other) noexcept=default
unique_weak_ptr()=default
unique_strong_ref_ptr< element_type > lock() const
unique_weak_ptr & operator=(unique_weak_ptr< T2 > &&other)
friend unique_weak_ptr< To > dynamic_pointer_cast(unique_weak_ptr< From > const &other)
unique_weak_ptr(unique_weak_ptr &&other) noexcept=default
std::weak_ptr< element_type > _ptr
unique_weak_ptr & operator=(unique_weak_ptr const &other)=default
friend unique_weak_ptr< To > static_pointer_cast(unique_weak_ptr< From > const &other)
unique_weak_ptr(unique_trackable_ptr< T > const &trackable)
unique_weak_ptr(unique_weak_ptr< T2 > &&other) noexcept
unique_weak_ptr(unique_trackable_ptr< T2 > const &aliased, T *aliasValue)
friend unique_weak_ptr< To > reinterpret_pointer_cast(unique_weak_ptr< From > const &other)
unique_weak_ptr & operator=(unique_trackable_ptr< T > const &trackable)
unique_weak_ptr(unique_weak_ptr const &other)=default
friend unique_weak_ptr< To > const_pointer_cast(unique_weak_ptr< From > const &other)
void swap(unique_weak_ptr &other) noexcept
unique_weak_ptr & operator=(std::nullptr_t) noexcept
unique_weak_ptr(unique_trackable_ptr< T2 > &&aliased, T *aliasValue)
~unique_weak_ptr()=default
unique_weak_ptr(unique_weak_ptr< T2 > const &other) noexcept
std::enable_if_t< std::is_bounded_array_v< T >, unique_trackable_ptr< T > > make_unique_trackable()
unique_weak_ptr< To > reinterpret_pointer_cast(unique_weak_ptr< From > const &other)
bool operator==(unique_trackable_ptr< T1 > const &left, unique_trackable_ptr< T2 > const &right)
unique_weak_ptr< To > const_pointer_cast(unique_weak_ptr< From > const &other)
unique_weak_ptr< To > static_pointer_cast(unique_weak_ptr< From > const &other)
unique_weak_ptr< To > dynamic_pointer_cast(unique_weak_ptr< From > const &other)
std::strong_ordering operator<=>(unique_trackable_ptr< T1 > const &left, unique_trackable_ptr< T2 > const &right)