Iros
 
Loading...
Searching...
No Matches
unique_storage.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/meta/algorithm.h"
11#include "di/meta/language.h"
12#include "di/meta/operations.h"
13#include "di/meta/vocab.h"
14#include "di/platform/prelude.h"
15#include "di/types/prelude.h"
16#include "di/util/addressof.h"
18#include "di/util/destroy_at.h"
19#include "di/util/exchange.h"
20#include "di/util/move.h"
21#include "di/util/swap.h"
24
25namespace di::any {
26namespace detail {
27 template<typename UniqueStorage, concepts::Allocator Alloc>
29 using Type = Method<UniqueStorageManage, void(This&, Alloc&)>;
30
31 template<typename T>
32 constexpr void operator()(T&, Alloc&) const;
33 };
34
35 template<typename UniqueStorage, concepts::Allocator Alloc>
37}
38
39template<concepts::Allocator Alloc = platform::DefaultAllocator>
41public:
44
46
47 template<typename T>
48 constexpr static auto creation_is_fallible(InPlaceType<T>) -> bool {
50 }
51
52 template<typename>
54
55 template<typename Any, typename T, typename... Args>
58 Args&&... args) {
59 auto result = di::allocate_one<T>(self->m_allocator);
60 if (!result) {
61 self = vocab::Unexpected(util::move(result).error());
62 return;
63 }
64
65 auto* pointer = *result;
66 util::construct_at(pointer, util::forward<Args>(args)...);
67
68 self->m_pointer = pointer;
69 }
70
71 template<typename T, typename... Args>
72 requires(concepts::ConstructibleFrom<T, Args...>)
73 constexpr static auto init(UniqueStorage* self, InPlaceType<T>, Args&&... args) {
74 return vocab::as_fallible(di::allocate_one<T>(self->m_allocator)) % [&](T* pointer) {
75 util::construct_at(pointer, util::forward<Args>(args)...);
76 self->m_pointer = pointer;
77 };
78 }
79
80 UniqueStorage() = default;
81
82 UniqueStorage(UniqueStorage const&) = default;
83 auto operator=(UniqueStorage const&) -> UniqueStorage& = default;
84
85 ~UniqueStorage() = default;
86
87 constexpr static void move_construct(concepts::VTableFor<Interface> auto& vtable, UniqueStorage* dest,
88 UniqueStorage* source) {
89 dest->m_pointer = util::exchange(source->m_pointer, nullptr);
90 vtable.reset();
91 }
92
93 template<concepts::VTableFor<Interface> VTable>
94 constexpr static void move_assign(VTable& dest_vtable, UniqueStorage* dest, VTable& source_vtable,
95 UniqueStorage* source) {
96 destroy(dest_vtable, dest);
97 dest_vtable = source_vtable;
98 move_construct(source_vtable, dest, source);
99 }
100
101 constexpr static void destroy(concepts::VTableFor<Interface> auto& vtable, UniqueStorage* self) {
102 if (self->m_pointer) {
103 auto const fp = vtable[Manage {}];
104 fp(self, self->m_allocator);
105 self->m_pointer = nullptr;
106 }
107 }
108
109 template<typename T>
110 constexpr auto down_cast() -> T* {
111 return static_cast<T*>(m_pointer);
112 }
113
114 template<typename T>
115 constexpr auto down_cast() const -> T const* {
116 return static_cast<T const*>(m_pointer);
117 }
118
119private:
120 constexpr explicit UniqueStorage(void* pointer) : m_pointer(pointer) {}
121
122 void* m_pointer { nullptr };
123 [[no_unique_address]] Alloc m_allocator {};
124};
125
126namespace detail {
127 template<typename UniqueStorage, concepts::Allocator Alloc>
128 template<typename T>
129 constexpr void UniqueStorageManage<UniqueStorage, Alloc>::operator()(T& a, Alloc& allocator) const {
130 auto* pointer = util::addressof(a);
131 util::destroy_at(pointer);
132 di::deallocate_one<T>(allocator, pointer);
133 }
134}
135}
Definition operations.h:11
Definition allocator.h:20
Definition vtable_for.h:17
Definition any.h:19
constexpr auto unique_storage_manage
Definition unique_storage.h:36
Definition any.h:18
StorageCategory
Definition storage_category.h:4
@ TriviallyRelocatable
Definition storage_category.h:7
meta::Type< AnyT< UserInterface, Storage, VTablePolicy > > Any
Definition any.h:294
T::Type Type
Definition core.h:26
meta::LikeExpected< decltype(di::allocate(util::declval< Alloc & >(), 0, 0)), T > AllocatorResult
Definition allocator.h:25
Type< detail::LikeExpectedHelper< T, U > > LikeExpected
Definition vocab.h:60
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
constexpr auto destroy_at
Definition destroy_at.h:24
constexpr auto construct_at
Definition construct_at.h:27
constexpr auto as_fallible
Definition as_fallible.h:26
Unexpected(E &&) -> Unexpected< meta::UnwrapRefDecay< E > >
constexpr auto allocate_one
Definition allocate_one.h:29
constexpr auto destroy
Definition destroy.h:35
constexpr auto in_place_type
Definition in_place_type.h:12
constexpr auto deallocate_one
Definition deallocate_one.h:27
static constexpr auto storage_category() -> StorageCategory
Definition unique_storage.h:45
static constexpr void move_assign(VTable &dest_vtable, UniqueStorage *dest, VTable &source_vtable, UniqueStorage *source)
Definition unique_storage.h:94
static constexpr auto creation_is_fallible(InPlaceType< T >) -> bool
Definition unique_storage.h:48
static constexpr void create(InPlaceType< Any >, meta::LikeExpected< CreationResult< T >, Any > &self, InPlaceType< T >, Args &&... args)
Definition unique_storage.h:57
auto operator=(UniqueStorage const &) -> UniqueStorage &=default
meta::Type< detail::UniqueStorageManage< UniqueStorage, Alloc > > Manage
Definition unique_storage.h:42
static constexpr void move_construct(concepts::VTableFor< Interface > auto &vtable, UniqueStorage *dest, UniqueStorage *source)
Definition unique_storage.h:87
static constexpr auto init(UniqueStorage *self, InPlaceType< T >, Args &&... args)
Definition unique_storage.h:73
constexpr auto down_cast() -> T *
Definition unique_storage.h:110
meta::AllocatorResult< Alloc > CreationResult
Definition unique_storage.h:53
meta::List< Manage > Interface
Definition unique_storage.h:43
UniqueStorage(UniqueStorage const &)=default
constexpr auto down_cast() const -> T const *
Definition unique_storage.h:115
static constexpr void destroy(concepts::VTableFor< Interface > auto &vtable, UniqueStorage *self)
Definition unique_storage.h:101
Definition unique_storage.h:28
Method< UniqueStorageManage, void(This &, Alloc &)> Type
Definition unique_storage.h:29
constexpr void operator()(T &, Alloc &) const
Definition unique_storage.h:129
Definition core.h:5
Definition in_place_type.h:5
Definition method.h:7
Definition this.h:4