Iros
 
Loading...
Searching...
No Matches
mutable_vector_interface.h
Go to the documentation of this file.
1#pragma once
2
19#include "di/meta/operations.h"
20#include "di/meta/relation.h"
21#include "di/util/clone.h"
22#include "di/util/create.h"
24#include "di/util/forward.h"
25#include "di/util/move.h"
27
28namespace di::container {
29template<typename Self, typename Value>
31private:
32 constexpr auto self() -> Self& { return static_cast<Self&>(*this); }
33 constexpr auto self() const -> Self const& { return static_cast<Self const&>(*this); }
34
35 using Iterator = Value*;
36 using ConstIterator = Value const*;
37
38 template<concepts::InputContainer Con, typename... Args>
41 Args&&... args) {
42 auto result = Self(util::forward<Args>(args)...);
43 return invoke_as_fallible([&] {
44 return vector::append_container(result, util::forward<Con>(container));
45 }) % [&] {
46 return util::move(result);
48 }
49
50public:
51 constexpr auto clone() const
52 requires(concepts::Clonable<Value> && concepts::DefaultConstructible<Self>)
53 {
54 return util::create<Self>(*this | view::clone);
55 }
56
57 constexpr void clear() { return vector::clear(self()); }
58
59 constexpr auto push_back(Value const& value) -> decltype(auto)
61 {
62 return vector::emplace_back(self(), value);
63 }
64
65 constexpr auto push_back(Value&& value) -> decltype(auto)
67 {
68 return vector::emplace_back(self(), util::move(value));
69 }
70
71 template<typename... Args>
72 requires(concepts::ConstructibleFrom<Value, Args...>)
73 constexpr auto emplace_back(Args&&... args) -> decltype(auto) {
74 return vector::emplace_back(self(), util::forward<Args>(args)...);
75 }
76
77 template<concepts::InputContainer Con>
79 constexpr auto append_container(Con&& container) {
80 return vector::append_container(self(), util::forward<Con>(container));
81 }
82
83 constexpr auto insert(ConstIterator position, Value const& value)
85 {
86 return vector::emplace(self(), position, value);
87 }
88
89 constexpr auto insert(ConstIterator position, Value&& value)
91 {
92 return vector::emplace(self(), position, util::move(value));
93 }
94
95 template<concepts::InputContainer Con>
97 constexpr auto insert_container(ConstIterator position, Con&& container) {
98 return vector::insert_container(self(), position, util::forward<Con>(container));
99 }
100
101 template<typename... Args>
102 requires(concepts::ConstructibleFrom<Value, Args...>)
103 constexpr auto emplace(ConstIterator position, Args&&... args) {
104 return vector::emplace(self(), position, util::forward<Args>(args)...);
105 }
106
107 constexpr auto pop_back() { return vector::pop_back(self()); }
108
109 constexpr auto erase(ConstIterator position) { return vector::erase(self(), position); }
110 constexpr auto erase(ConstIterator start, ConstIterator end) { return vector::erase(self(), start, end); }
111
112 constexpr auto erase_unstable(ConstIterator iter) { return vector::erase_unstable(self(), iter); }
113
114 constexpr auto resize(size_t count)
116 {
117 return vector::resize(self(), count);
118 }
119
120 constexpr auto resize(size_t count, Value const& value)
122 {
123 return vector::resize(self(), count, value);
124 }
125
126 using ConstantVectorInterface<Self, Value>::iterator;
127 constexpr auto iterator(ConstIterator iter) { return vector::iterator(self(), iter); }
128
129 constexpr auto reserve(size_t n) { return vector::reserve(self(), n); }
130
131private:
132 template<typename F, SameAs<Tag<erase_if>> T = Tag<erase_if>>
134 constexpr friend auto tag_invoke(T, Self& self, F&& function) {
135 auto [first, last] = remove_if(self, di::forward<F>(function));
136 auto const count = usize(last - first);
137
138 vector::erase(self, first, last);
139 return count;
140 }
141};
142}
Definition constant_vector_interface.h:28
constexpr auto first(size_t count)
Definition constant_vector_interface.h:63
constexpr auto end()
Definition constant_vector_interface.h:41
constexpr auto last(size_t count)
Definition constant_vector_interface.h:66
Definition mutable_vector_interface.h:30
constexpr auto erase_unstable(ConstIterator iter)
Definition mutable_vector_interface.h:112
constexpr auto resize(size_t count, Value const &value)
Definition mutable_vector_interface.h:120
constexpr auto resize(size_t count)
Definition mutable_vector_interface.h:114
constexpr auto pop_back()
Definition mutable_vector_interface.h:107
constexpr auto erase(ConstIterator position)
Definition mutable_vector_interface.h:109
constexpr void clear()
Definition mutable_vector_interface.h:57
constexpr auto iterator(ConstIterator iter)
Definition mutable_vector_interface.h:127
constexpr auto emplace(ConstIterator position, Args &&... args)
Definition mutable_vector_interface.h:103
constexpr auto clone() const
Definition mutable_vector_interface.h:51
constexpr auto insert(ConstIterator position, Value &&value)
Definition mutable_vector_interface.h:89
constexpr auto append_container(Con &&container)
Definition mutable_vector_interface.h:79
constexpr auto emplace_back(Args &&... args) -> decltype(auto)
Definition mutable_vector_interface.h:73
constexpr auto push_back(Value const &value) -> decltype(auto) requires(concepts::CopyConstructible< Value >)
Definition mutable_vector_interface.h:59
constexpr friend auto tag_invoke(T, Self &self, F &&function)
Definition mutable_vector_interface.h:134
constexpr auto insert_container(ConstIterator position, Con &&container)
Definition mutable_vector_interface.h:97
constexpr auto push_back(Value &&value) -> decltype(auto) requires(concepts::MoveConstructible< Value >)
Definition mutable_vector_interface.h:65
constexpr auto insert(ConstIterator position, Value const &value)
Definition mutable_vector_interface.h:83
constexpr auto erase(ConstIterator start, ConstIterator end)
Definition mutable_vector_interface.h:110
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< Self >, Con &&container, Args &&... args)
Definition mutable_vector_interface.h:40
constexpr auto reserve(size_t n)
Definition mutable_vector_interface.h:129
Definition operations.h:11
Definition container_compatible.h:9
Definition operations.h:34
Definition operations.h:24
Definition input_container.h:8
Definition operations.h:43
Definition relation.h:7
Definition any_storable.h:9
constexpr auto erase_unstable(Vec &vector, CIter citerator) -> Iter
Definition vector_erase_unstable.h:13
constexpr auto append_container(Vec &vector, Con &&container) -> R
Definition vector_append_container.h:21
constexpr auto pop_back(concepts::detail::MutableVector auto &vector)
Definition vector_pop_back.h:11
constexpr auto erase(Vec &vector, CIter cstart, CIter cend) -> Iter
Definition vector_erase.h:14
constexpr auto emplace_back(Vec &vector, Args &&... args) -> decltype(auto)
Definition vector_emplace_back.h:17
constexpr auto emplace(Vec &vector, CIter cposition, Args &&... args) -> G
Definition vector_emplace.h:24
constexpr auto iterator(Vec &, CIter iterator) -> Iter
Definition vector_iterator.h:13
constexpr auto insert_container(Vec &vector, Cit it, Con &&container) -> R
Definition vector_append_container.h:31
constexpr auto reserve(Vec &vector, size_t capacity) -> R
Definition vector_reserve.h:16
constexpr void clear(Vec &vector)
Definition vector_clear.h:12
constexpr auto resize(Vec &vector, size_t count) -> R
Definition vector_resize.h:19
constexpr auto clone
Definition clone.h:27
Definition sequence.h:12
constexpr auto count
Definition count.h:37
constexpr auto remove_if
Definition remove_if.h:38
Definition as_bool.h:8
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto create(Args &&... args)
Definition create.h:21
constexpr auto invoke_as_fallible
Definition invoke_as_fallible.h:37
constexpr auto try_infallible
Definition try_infallible.h:31
Definition in_place_type.h:5