24 constexpr void operator()(T* pointer)
const {
delete pointer; }
27template<
typename T,
typename Deleter = DefaultDelete<T>>
38 constexpr explicit Box(T* pointer)
40 : m_pointer(pointer) {}
47 constexpr Box(T* pointer, Deleter
const& deleter)
49 : m_pointer(pointer), m_deleter(deleter) {}
51 template<concepts::MoveConstructible D = Deleter>
53 constexpr Box(T* pointer, D&& deleter) : m_pointer(pointer,
util::forward<D>(deleter)) {}
55 template<
typename D = Deleter>
59 template<
typename U,
typename E>
63 constexpr Box(
Box<U, E>&& other) : m_pointer(other.release()), m_deleter(util::forward<E>(other.get_deleter())) {}
69 reset(other.release());
70 m_deleter = util::forward<Deleter>(other.get_deleter());
74 template<
typename U,
typename E>
78 reset(other.release());
79 m_deleter = util::forward<Deleter>(other.get_deleter());
89 constexpr void reset(T* pointer =
nullptr) {
90 auto* old_pointer = m_pointer;
97 constexpr auto get() const -> T* {
return m_pointer; }
99 constexpr auto get_deleter() -> Deleter& {
return m_deleter; }
100 constexpr auto get_deleter() const -> Deleter const& {
return m_deleter; }
102 constexpr explicit operator bool()
const {
return !!m_pointer; }
116 return const_cast<void*
>(
static_cast<void const volatile*
>(a.get())) ==
117 const_cast<void*
>(
static_cast<void const volatile*
>(b.get()));
122 return const_cast<void*
>(
static_cast<void const volatile*
>(a.
get())) <=>
123 const_cast<void*
>(
static_cast<void const volatile*
>(b.
get()));
128 return a ==
nullptr ? di::strong_ordering::equal : di::strong_ordering::greater;
131 T* m_pointer {
nullptr };
132 [[no_unique_address]] Deleter m_deleter {};
138 template<
typename... Args>
142 auto* result = ::new (std::nothrow) T(util::forward<Args>(args)...);
148 auto* result = ::new T(util::forward<Args>(args)...);
162using vocab::DefaultDelete;
#define DI_ASSERT(...)
Definition assert_bool.h:7
constexpr friend auto operator==(Box const &a, Box< U > const &b) -> bool
Definition box.h:115
constexpr Box(T *pointer, Deleter const &deleter)
Definition box.h:47
constexpr Box(T *pointer, D &&deleter)
Definition box.h:53
constexpr Box(nullptr_t)
Definition box.h:34
constexpr friend auto operator<=>(Box const &a, nullptr_t)
Definition box.h:127
constexpr auto operator=(Box &&other) -> Box &requires(concepts::MoveAssignable< Deleter >)
Definition box.h:68
constexpr auto get_deleter() -> Deleter &
Definition box.h:99
constexpr ~Box()
Definition box.h:65
auto operator=(Box const &) -> Box &=delete
constexpr friend auto operator==(Box const &a, nullptr_t) -> bool
Definition box.h:126
constexpr Box(T *pointer)
Definition box.h:38
constexpr auto release() -> T *
Definition box.h:88
constexpr friend auto operator<=>(Box const &a, Box< U > const &b)
Definition box.h:121
constexpr auto operator*() const -> T &
Definition box.h:104
constexpr auto operator=(nullptr_t) -> Box &
Definition box.h:83
constexpr auto get_deleter() const -> Deleter const &
Definition box.h:100
constexpr Box(Box< U, E > &&other)
Definition box.h:63
constexpr auto operator->() const -> T *
Definition box.h:108
constexpr void reset(T *pointer=nullptr)
Definition box.h:89
constexpr Box(Box &&other)
Definition box.h:43
Box(T *, meta::RemoveReference< D > &&)=delete
constexpr auto get() const -> T *
Definition box.h:97
Definition operations.h:19
Definition operations.h:11
Definition operations.h:99
Definition operations.h:34
Definition operations.h:24
Definition allocator.h:20
Implicit conversion for this test refers to the ability to return a value of function from a type.
Definition operations.h:89
Definition language.h:110
Definition operations.h:46
Definition operations.h:43
constexpr auto invoke
Definition invoke.h:100
std::nullptr_t nullptr_t
Definition nullptr_t.h:12
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
Definition erasure_cast.h:7
constexpr auto make_box
Definition box.h:157
Unexpected(E &&) -> Unexpected< meta::UnwrapRefDecay< E > >
Definition zstring_parser.h:9
constexpr DefaultDelete(DefaultDelete< U > const &)
Definition box.h:22
constexpr void operator()(T *pointer) const
Definition box.h:24