146 return static_cast<T*
>(
Allocate(count *
sizeof(T)));
175 template<
class T,
class... Args>
185 template<
class T,
class... Args>
277 T* get() const noexcept {
301 explicit operator bool() const noexcept {
302 return static_cast<bool>(m_ptr);
309 operator std::shared_ptr<T>() const noexcept {
318 return m_ptr.use_count();
333 m_ptr.swap(other.m_ptr);
344 return m_ptr.owner_before(other.m_ptr);
354 bool owner_before(
const Weak<U>& other)
const noexcept;
363 template<
class Target,
class... Args>
366 return Heap::MakeShared<Target>(std::forward<Args>(args)...);
384 return static_cast<bool>(lhs.m_ptr);
402 return static_cast<bool>(rhs.m_ptr);
412 return lhs.get() == rhs.get();
422 return std::compare_three_way{}(lhs.get(), rhs.get());
439 explicit Shared(std::shared_ptr<T> pointer)
noexcept: m_ptr(std::move(pointer)) {}
445 explicit constexpr Adopt() noexcept = default;
452 explicit Shared(Adopt, T*
object): m_ptr(
object, Heap::ObjectDeleter{}, Heap::Allocator<T>{}) {}
460 template<
class U,
class... Args>
463 template<
class X,
class Y>
466 template<
class X,
class Y>
469 template<
class X,
class Y>
472 template<
class X,
class Y>
475 std::shared_ptr<T> m_ptr;
551 T* get() const noexcept {
575 explicit operator bool() const noexcept {
576 return static_cast<bool>(m_ptr);
583 operator std::unique_ptr<T, Heap::ObjectDeleter>() &&
noexcept {
584 return std::move(m_ptr);
592 return m_ptr.get_deleter();
600 return m_ptr.get_deleter();
615 m_ptr.swap(other.m_ptr);
626 template<
class Target,
class... Args>
629 return Heap::MakeUnique<Target>(std::forward<Args>(args)...);
647 return static_cast<bool>(lhs.m_ptr);
665 return static_cast<bool>(rhs.m_ptr);
675 return lhs.get() == rhs.get();
685 return std::compare_three_way{}(lhs.get(), rhs.get());
702 explicit constexpr Adopt() noexcept = default;
709 explicit
Unique(Adopt, T*
object): m_ptr(
object) {}
714 template<
class U,
class... Args>
717 std::unique_ptr<T, Heap::ObjectDeleter> m_ptr;
793 return m_weak.expired();
801 return m_weak.use_count();
816 m_weak.swap(other.m_weak);
827 return m_weak.owner_before(other.m_weak);
838 return m_weak.owner_before(other.m_ptr);
857 std::weak_ptr<T> m_weak;
867 template<
class T,
class U>
869 return Shared<T>(std::static_pointer_cast<T>(std::shared_ptr<U>(from)));
879 template<
class T,
class U>
881 return Shared<T>(std::dynamic_pointer_cast<T>(std::shared_ptr<U>(from)));
891 template<
class T,
class U>
893 return Shared<T>(std::const_pointer_cast<T>(std::shared_ptr<U>(from)));
903 template<
class T,
class U>
905 return Shared<T>(std::reinterpret_pointer_cast<T>(std::shared_ptr<U>(from)));
914 return m_ptr.owner_before(other.m_weak);
928 return std::hash<T*>{}(value.get());
940 return std::hash<T*>{}(value.get());
Shared owner of a T allocated on Base's heap.
Definition pointers.hxx:206
friend Shared< X > ConstPointerCast(const Shared< Y > &) noexcept
Shared(Shared< U > &&other) noexcept
Take ownership from other.
Definition pointers.hxx:237
friend Shared< X > ReinterpretPointerCast(const Shared< Y > &) noexcept
friend Shared< X > DynamicPointerCast(const Shared< Y > &) noexcept
T * operator->() const noexcept
Member access.
Definition pointers.hxx:293
friend bool operator!=(const Shared &lhs, std::nullptr_t) noexcept
Inequality with null.
Definition pointers.hxx:383
T & operator*() const
Dereference.
Definition pointers.hxx:285
friend bool operator==(const Shared &lhs, const Shared &rhs) noexcept
Same stored pointer.
Definition pointers.hxx:411
Shared() noexcept=default
Empty owner.
void swap(Shared &other) noexcept
Exchange owners with other.
Definition pointers.hxx:332
Shared(const Shared &) noexcept=default
Copy constructor.
friend Shared< X > StaticPointerCast(const Shared< Y > &) noexcept
friend auto operator<=>(const Shared &lhs, const Shared &rhs) noexcept
Order of the stored pointers.
Definition pointers.hxx:421
friend bool operator==(std::nullptr_t, const Shared &rhs) noexcept
Equality with null.
Definition pointers.hxx:392
Shared(const Shared< U > &other) noexcept
Share ownership with other.
Definition pointers.hxx:228
bool owner_before(const Shared< U > &other) const noexcept
Ownership order, same as std::shared_ptr::owner_before.
Definition pointers.hxx:343
friend bool operator!=(std::nullptr_t, const Shared &rhs) noexcept
Inequality with null.
Definition pointers.hxx:401
void reset() noexcept
Drop this owner's reference.
Definition pointers.hxx:324
T element_type
Pointee type.
Definition pointers.hxx:208
static Shared< T > MakePointer(Args &&... args)
Allocate Target on Base's heap and own it as T.
Definition pointers.hxx:365
long use_count() const noexcept
Number of Shared sharing this object.
Definition pointers.hxx:317
friend bool operator==(const Shared &lhs, std::nullptr_t) noexcept
Equality with null.
Definition pointers.hxx:374
Shared(Shared &&) noexcept=default
Move constructor.
T * get() const noexcept
Raw pointer, or null.
Definition pointers.hxx:277
friend void swap(Shared &left, Shared &right) noexcept
Exchange left and right.
Definition pointers.hxx:430
Unique owner of a T allocated on Base's heap.
Definition pointers.hxx:495
T * operator->() const noexcept
Member access.
Definition pointers.hxx:567
const deleter_type & get_deleter() const noexcept
Deleter stored in this owner.
Definition pointers.hxx:599
friend auto operator<=>(const Unique &lhs, const Unique &rhs) noexcept
Order of the stored pointers.
Definition pointers.hxx:684
T element_type
Pointee type.
Definition pointers.hxx:497
friend bool operator==(std::nullptr_t, const Unique &rhs) noexcept
Equality with null.
Definition pointers.hxx:655
void reset() noexcept
Destroy the object and drop this owner.
Definition pointers.hxx:606
T * get() const noexcept
Raw pointer, or null.
Definition pointers.hxx:551
friend void swap(Unique &left, Unique &right) noexcept
Exchange left and right.
Definition pointers.hxx:693
void swap(Unique &other) noexcept
Exchange owners with other.
Definition pointers.hxx:614
deleter_type & get_deleter() noexcept
Deleter stored in this owner.
Definition pointers.hxx:591
Unique(Unique< U > &&other) noexcept
Take ownership from other.
Definition pointers.hxx:518
friend bool operator!=(std::nullptr_t, const Unique &rhs) noexcept
Inequality with null.
Definition pointers.hxx:664
friend bool operator!=(const Unique &lhs, std::nullptr_t) noexcept
Inequality with null.
Definition pointers.hxx:646
friend bool operator==(const Unique &lhs, std::nullptr_t) noexcept
Equality with null.
Definition pointers.hxx:637
static Unique< T > MakePointer(Args &&... args)
Allocate Target on Base's heap and own it as T.
Definition pointers.hxx:628
Unique() noexcept=default
Empty owner.
Unique(const Unique &)=delete
Copy constructor.
friend bool operator==(const Unique &lhs, const Unique &rhs) noexcept
Same stored pointer.
Definition pointers.hxx:674
T * pointer
Stored pointer.
Definition pointers.hxx:498
T & operator*() const
Dereference.
Definition pointers.hxx:559
Unique(Unique &&) noexcept=default
Move constructor.
Non-owning observer of a Shared control block.
Definition pointers.hxx:730
bool owner_before(const Shared< U > &other) const noexcept
Ownership order against a Shared.
Definition pointers.hxx:837
void swap(Weak &other) noexcept
Exchange observers with other.
Definition pointers.hxx:815
Weak(const Weak &) noexcept=default
Copy constructor.
friend void swap(Weak &left, Weak &right) noexcept
Exchange left and right.
Definition pointers.hxx:846
void reset() noexcept
Drop this observer.
Definition pointers.hxx:807
bool expired() const noexcept
Whether the object is already gone.
Definition pointers.hxx:792
Weak(const Shared< U > &owner) noexcept
Observe owner.
Definition pointers.hxx:751
Weak() noexcept=default
Empty observer.
Weak(Weak &&) noexcept=default
Move constructor.
long use_count() const noexcept
Number of Shared still holding the object.
Definition pointers.hxx:800
bool owner_before(const Weak< U > &other) const noexcept
Ownership order, same as std::weak_ptr::owner_before.
Definition pointers.hxx:826
T element_type
Pointee type.
Definition pointers.hxx:732
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 * 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.
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.
Shared< T > ReinterpretPointerCast(const Shared< U > &from) noexcept
reinterpret_cast of the stored pointer.
Definition pointers.hxx:904
Shared< T > ConstPointerCast(const Shared< U > &from) noexcept
const_cast of the stored pointer.
Definition pointers.hxx:892
Shared< T > StaticPointerCast(const Shared< U > &from) noexcept
static_cast of the stored pointer.
Definition pointers.hxx:868
Shared< T > DynamicPointerCast(const Shared< U > &from) noexcept
dynamic_cast of the stored pointer.
Definition pointers.hxx:880
Root namespace of the StormByte suite.
std::shared_ptr allocator that uses Allocate / Free.
Definition pointers.hxx:125
T * allocate(std::size_t count)
Allocate count objects of T.
Definition pointers.hxx:145
T value_type
Allocator value type.
Definition pointers.hxx:126
constexpr Allocator() noexcept=default
Default constructor.
void deallocate(T *pointer, std::size_t) noexcept
Release storage obtained from allocate.
Definition pointers.hxx:153
constexpr bool operator==(const Allocator< U > &) const noexcept
All Allocator instances compare equal.
Definition pointers.hxx:163
Destroy T and return its block to Free.
Definition pointers.hxx:106
void operator()(U *pointer) const noexcept
Destroy pointer and free its block on Base's heap.
Definition pointers.hxx:113
std::size_t operator()(const StormByte::Safe::Shared< T > &value) const noexcept
Hashes the stored address.
Definition pointers.hxx:927
std::size_t operator()(const StormByte::Safe::Unique< T > &value) const noexcept
Hashes the stored address.
Definition pointers.hxx:939
#define STORMBYTE_PUBLIC_TYPE
Definition visibility.h:57
#define STORMBYTE_PUBLIC
Definition visibility.h:52