141 return static_cast<T*
>(
Allocate(count *
sizeof(T)));
170 template<
class T,
class... Args>
180 template<
class T,
class... Args>
296 explicit operator bool() const noexcept {
297 return static_cast<bool>(m_ptr);
304 operator std::shared_ptr<T>() const noexcept {
313 return m_ptr.use_count();
328 m_ptr.swap(other.m_ptr);
339 return m_ptr.owner_before(other.m_ptr);
358 template<
class Target,
class... Args>
361 return Heap::MakeShared<Target>(std::forward<Args>(args)...);
379 return static_cast<bool>(lhs.m_ptr);
397 return static_cast<bool>(rhs.m_ptr);
407 return lhs.get() == rhs.get();
417 return std::compare_three_way{}(lhs.get(), rhs.get());
434 explicit Shared(std::shared_ptr<T> pointer)
noexcept: m_ptr(std::move(pointer)) {}
440 explicit constexpr Adopt() noexcept = default;
447 explicit
Shared(Adopt, T*
object): m_ptr(
object, Heap::ObjectDeleter{}, Heap::Allocator<T>{}) {}
455 template<
class U,
class... Args>
458 template<
class X,
class Y>
461 template<
class X,
class Y>
464 template<
class X,
class Y>
467 template<
class X,
class Y>
470 std::shared_ptr<T> m_ptr;
546 T* get() const noexcept {
570 explicit operator bool() const noexcept {
571 return static_cast<bool>(m_ptr);
578 operator std::unique_ptr<T, Heap::ObjectDeleter>() &&
noexcept {
579 return std::move(m_ptr);
587 return m_ptr.get_deleter();
595 return m_ptr.get_deleter();
610 m_ptr.swap(other.m_ptr);
621 template<
class Target,
class... Args>
624 return Heap::MakeUnique<Target>(std::forward<Args>(args)...);
642 return static_cast<bool>(lhs.m_ptr);
660 return static_cast<bool>(rhs.m_ptr);
670 return lhs.get() == rhs.get();
680 return std::compare_three_way{}(lhs.get(), rhs.get());
697 explicit constexpr Adopt() noexcept = default;
704 explicit
Unique(Adopt, T*
object): m_ptr(
object) {}
709 template<
class U,
class... Args>
712 std::unique_ptr<T, Heap::ObjectDeleter> m_ptr;
788 return m_weak.expired();
796 return m_weak.use_count();
811 m_weak.swap(other.m_weak);
822 return m_weak.owner_before(other.m_weak);
833 return m_weak.owner_before(other.m_ptr);
852 std::weak_ptr<T> m_weak;
862 template<
class T,
class U>
864 return Shared<T>(std::static_pointer_cast<T>(std::shared_ptr<U>(from)));
874 template<
class T,
class U>
876 return Shared<T>(std::dynamic_pointer_cast<T>(std::shared_ptr<U>(from)));
886 template<
class T,
class U>
888 return Shared<T>(std::const_pointer_cast<T>(std::shared_ptr<U>(from)));
898 template<
class T,
class U>
900 return Shared<T>(std::reinterpret_pointer_cast<T>(std::shared_ptr<U>(from)));
909 return m_ptr.owner_before(other.m_weak);
922 return std::hash<T*>{}(value.get());
934 return std::hash<T*>{}(value.get());
Shared owner of a T allocated on Base's heap.
Definition safe_pointers.hxx:201
Shared(const Shared &) noexcept=default
Copy constructor.
friend Shared< X > ConstPointerCast(const Shared< Y > &) noexcept
long use_count() const noexcept
Number of Shared sharing this object.
Definition safe_pointers.hxx:312
static Shared< T > MakePointer(Args &&... args)
Allocate Target on Base's heap and own it as T.
Definition safe_pointers.hxx:360
friend Shared< X > ReinterpretPointerCast(const Shared< Y > &) noexcept
friend Shared< X > DynamicPointerCast(const Shared< Y > &) noexcept
bool owner_before(const Shared< U > &other) const noexcept
Ownership order, same as std::shared_ptr::owner_before.
Definition safe_pointers.hxx:338
friend bool operator!=(const Shared &lhs, std::nullptr_t) noexcept
Inequality with null.
Definition safe_pointers.hxx:378
T & operator*() const
Dereference.
Definition safe_pointers.hxx:280
friend bool operator==(const Shared &lhs, const Shared &rhs) noexcept
Same stored pointer.
Definition safe_pointers.hxx:406
Shared() noexcept=default
Empty owner.
friend Shared< X > StaticPointerCast(const Shared< Y > &) noexcept
T * get() const noexcept
Raw pointer, or null.
Definition safe_pointers.hxx:272
friend auto operator<=>(const Shared &lhs, const Shared &rhs) noexcept
Order of the stored pointers.
Definition safe_pointers.hxx:416
friend bool operator==(std::nullptr_t, const Shared &rhs) noexcept
Equality with null.
Definition safe_pointers.hxx:387
Shared(Shared &&) noexcept=default
Move constructor.
T element_type
Pointee type.
Definition safe_pointers.hxx:203
friend class Shared
Definition safe_pointers.hxx:450
friend bool operator!=(std::nullptr_t, const Shared &rhs) noexcept
Inequality with null.
Definition safe_pointers.hxx:396
Shared(const Shared< U > &other) noexcept
Share ownership with other.
Definition safe_pointers.hxx:223
void swap(Shared &other) noexcept
Exchange owners with other.
Definition safe_pointers.hxx:327
friend bool operator==(const Shared &lhs, std::nullptr_t) noexcept
Equality with null.
Definition safe_pointers.hxx:369
void reset() noexcept
Drop this owner's reference.
Definition safe_pointers.hxx:319
Shared(Shared< U > &&other) noexcept
Take ownership from other.
Definition safe_pointers.hxx:232
friend void swap(Shared &left, Shared &right) noexcept
Exchange left and right.
Definition safe_pointers.hxx:425
T * operator->() const noexcept
Member access.
Definition safe_pointers.hxx:288
Unique owner of a T allocated on Base's heap.
Definition safe_pointers.hxx:490
void swap(Unique &other) noexcept
Exchange owners with other.
Definition safe_pointers.hxx:609
friend auto operator<=>(const Unique &lhs, const Unique &rhs) noexcept
Order of the stored pointers.
Definition safe_pointers.hxx:679
static Unique< T > MakePointer(Args &&... args)
Allocate Target on Base's heap and own it as T.
Definition safe_pointers.hxx:623
friend bool operator==(std::nullptr_t, const Unique &rhs) noexcept
Equality with null.
Definition safe_pointers.hxx:650
T * operator->() const noexcept
Member access.
Definition safe_pointers.hxx:562
Unique(Unique< U > &&other) noexcept
Take ownership from other.
Definition safe_pointers.hxx:513
deleter_type & get_deleter() noexcept
Deleter stored in this owner.
Definition safe_pointers.hxx:586
friend void swap(Unique &left, Unique &right) noexcept
Exchange left and right.
Definition safe_pointers.hxx:688
Unique(const Unique &)=delete
Copy constructor.
const deleter_type & get_deleter() const noexcept
Deleter stored in this owner.
Definition safe_pointers.hxx:594
friend bool operator!=(std::nullptr_t, const Unique &rhs) noexcept
Inequality with null.
Definition safe_pointers.hxx:659
friend bool operator!=(const Unique &lhs, std::nullptr_t) noexcept
Inequality with null.
Definition safe_pointers.hxx:641
T * pointer
Stored pointer.
Definition safe_pointers.hxx:493
Unique() noexcept=default
Empty owner.
friend bool operator==(const Unique &lhs, std::nullptr_t) noexcept
Equality with null.
Definition safe_pointers.hxx:632
void reset() noexcept
Destroy the object and drop this owner.
Definition safe_pointers.hxx:601
T & operator*() const
Dereference.
Definition safe_pointers.hxx:554
Unique(Unique &&) noexcept=default
Move constructor.
T * get() const noexcept
Raw pointer, or null.
Definition safe_pointers.hxx:546
friend bool operator==(const Unique &lhs, const Unique &rhs) noexcept
Same stored pointer.
Definition safe_pointers.hxx:669
T element_type
Pointee type.
Definition safe_pointers.hxx:492
Non-owning observer of a Shared control block.
Definition safe_pointers.hxx:725
void reset() noexcept
Drop this observer.
Definition safe_pointers.hxx:802
Weak(Weak &&) noexcept=default
Move constructor.
Weak() noexcept=default
Empty observer.
friend void swap(Weak &left, Weak &right) noexcept
Exchange left and right.
Definition safe_pointers.hxx:841
long use_count() const noexcept
Number of Shared still holding the object.
Definition safe_pointers.hxx:795
T element_type
Pointee type.
Definition safe_pointers.hxx:727
bool owner_before(const Shared< U > &other) const noexcept
Ownership order against a Shared.
Definition safe_pointers.hxx:832
bool owner_before(const Weak< U > &other) const noexcept
Ownership order, same as std::weak_ptr::owner_before.
Definition safe_pointers.hxx:821
Weak(const Shared< U > &owner) noexcept
Observe owner.
Definition safe_pointers.hxx:746
bool expired() const noexcept
Whether the object is already gone.
Definition safe_pointers.hxx:787
void swap(Weak &other) noexcept
Exchange observers with other.
Definition safe_pointers.hxx:810
Weak(const Weak &) noexcept=default
Copy constructor.
Derived derives from Base (std::is_base_of).
Definition relations.hxx:113
Same type after stripping cv and references from both sides.
Definition relations.hxx:94
void Free(void *pointer) noexcept
Release a block obtained from Allocate.
Shared< T > MakeShared(Args &&... args)
Construct T on Base's heap and wrap it in Shared.
void * Allocate(std::size_t bytes)
Allocate bytes on Base's heap.
Unique< T > MakeUnique(Args &&... args)
Construct T on Base's heap and wrap it in Unique.
Root namespace of the StormByte suite.
Shared< T > StaticPointerCast(const Shared< U > &from) noexcept
static_cast of the stored pointer.
Definition safe_pointers.hxx:863
Shared< T > ConstPointerCast(const Shared< U > &from) noexcept
const_cast of the stored pointer.
Definition safe_pointers.hxx:887
Shared< T > ReinterpretPointerCast(const Shared< U > &from) noexcept
reinterpret_cast of the stored pointer.
Definition safe_pointers.hxx:899
Shared< T > DynamicPointerCast(const Shared< U > &from) noexcept
dynamic_cast of the stored pointer.
Definition safe_pointers.hxx:875
std::shared_ptr allocator that uses Allocate / Free.
Definition safe_pointers.hxx:120
constexpr bool operator==(const Allocator< U > &) const noexcept
All Allocator instances compare equal.
Definition safe_pointers.hxx:158
void deallocate(T *pointer, std::size_t) noexcept
Release storage obtained from allocate.
Definition safe_pointers.hxx:148
T * allocate(std::size_t count)
Allocate count objects of T.
Definition safe_pointers.hxx:140
constexpr Allocator() noexcept=default
Default constructor.
T value_type
Allocator value type.
Definition safe_pointers.hxx:121
Destroy T and return its block to Free.
Definition safe_pointers.hxx:101
void operator()(U *pointer) const noexcept
Destroy pointer and free its block on Base's heap.
Definition safe_pointers.hxx:108
std::size_t operator()(const StormByte::Shared< T > &value) const noexcept
Hashes the stored address.
Definition safe_pointers.hxx:921
std::size_t operator()(const StormByte::Unique< T > &value) const noexcept
Hashes the stored address.
Definition safe_pointers.hxx:933
#define STORMBYTE_PUBLIC
Definition visibility.h:52