Iros
 
Loading...
Searching...
No Matches
mutable_ring_interface.h
Go to the documentation of this file.
1#pragma once
2
5
6namespace di::container {
7template<typename Self, typename Value>
8class MutableRingInterface : public ConstantRingInterface<Self, Value> {
9private:
10 constexpr auto self() -> Self& { return static_cast<Self&>(*this); }
11 constexpr auto self() const -> Self const& { return static_cast<Self const&>(*this); }
12
13 using Iterator = RingIterator<Value>;
14 using ConstIterator = RingIterator<Value const>;
15
16 template<concepts::InputContainer Con, typename... Args>
19 Args&&... args) {
20 auto result = Self(util::forward<Args>(args)...);
21 return invoke_as_fallible([&] {
22 return vector::append_container(result, util::forward<Con>(container));
23 }) % [&] {
24 result.assume_tail(result.size());
25 return util::move(result);
27 }
28
29public:
30 constexpr auto clone() const
31 requires(concepts::Clonable<Value> && concepts::DefaultConstructible<Self>)
32 {
33 return util::create<Self>(*this | view::clone);
34 }
35
36 constexpr void clear() { ring::clear(self()); }
37
38 constexpr auto push_back(Value const& value) -> decltype(auto)
40 {
41 return ring::emplace_back(self(), value);
42 }
43
44 constexpr auto push_back(Value&& value) -> decltype(auto)
46 {
47 return ring::emplace_back(self(), util::move(value));
48 }
49
50 template<typename... Args>
51 requires(concepts::ConstructibleFrom<Value, Args...>)
52 constexpr auto emplace_back(Args&&... args) -> decltype(auto) {
53 return ring::emplace_back(self(), util::forward<Args>(args)...);
54 }
55
56 template<concepts::InputContainer Con>
58 constexpr auto append_container(Con&& container) {
59 return ring::append_container(self(), util::forward<Con>(container));
60 }
61
62 constexpr auto pop_back() -> decltype(auto) { return ring::pop_back(self()); }
63
64 constexpr auto push_front(Value const& value) -> decltype(auto)
66 {
67 return ring::emplace_front(self(), value);
68 }
69
70 constexpr auto push_front(Value&& value) -> decltype(auto)
72 {
73 return ring::emplace_front(self(), util::move(value));
74 }
75
76 template<typename... Args>
77 requires(concepts::ConstructibleFrom<Value, Args...>)
78 constexpr auto emplace_front(Args&&... args) -> decltype(auto) {
79 return ring::emplace_front(self(), util::forward<Args>(args)...);
80 }
81
82 template<concepts::InputContainer Con>
84 constexpr auto prepend_container(Con&& container) {
85 return ring::prepend_container(self(), util::forward<Con>(container));
86 }
87
88 constexpr auto pop_front() -> decltype(auto) { return ring::pop_front(self()); }
89
90 constexpr auto insert(ConstIterator position, Value const& value)
92 {
93 return ring::emplace(self(), position, value);
94 }
95
96 constexpr auto insert(ConstIterator position, Value&& value)
98 {
99 return ring::emplace(self(), position, util::move(value));
100 }
101
102 template<typename... Args>
103 requires(concepts::ConstructibleFrom<Value, Args...>)
104 constexpr auto emplace(ConstIterator position, Args&&... args) {
105 return ring::emplace(self(), position, util::forward<Args>(args)...);
106 }
107
108 constexpr auto erase(ConstIterator position) { return ring::erase(self(), position); }
109 constexpr auto erase(ConstIterator start, ConstIterator end) { return ring::erase(self(), start, end); }
110
111 using ConstantRingInterface<Self, Value>::iterator;
112 constexpr auto iterator(ConstIterator iter) { return ring::iterator(self(), iter); }
113
114 constexpr auto reserve(usize n) { return ring::reserve(self(), n); }
115
116 constexpr auto make_contigous() { return ring::make_contigous(self()); }
117
118 constexpr auto resize(size_t count)
120 {
121 return ring::resize(self(), count);
122 }
123
124 constexpr auto resize(size_t count, Value const& value)
126 {
127 return ring::resize(self(), count, value);
128 }
129
130private:
131 template<typename F, SameAs<Tag<erase_if>> T = Tag<erase_if>>
133 constexpr friend auto tag_invoke(T, Self& self, F&& function) {
134 auto [first, last] = remove_if(self, di::forward<F>(function));
135 auto const count = usize(last - first);
136
137 ring::erase(self, first, last);
138 return count;
139 }
140};
141}
Definition constant_ring_interface.h:9
constexpr auto end()
Definition constant_ring_interface.h:20
Definition mutable_ring_interface.h:8
constexpr auto push_back(Value const &value) -> decltype(auto) requires(concepts::CopyConstructible< Value >)
Definition mutable_ring_interface.h:38
constexpr auto clone() const
Definition mutable_ring_interface.h:30
constexpr auto resize(size_t count)
Definition mutable_ring_interface.h:118
constexpr auto append_container(Con &&container)
Definition mutable_ring_interface.h:58
constexpr auto insert(ConstIterator position, Value &&value)
Definition mutable_ring_interface.h:96
constexpr auto erase(ConstIterator position)
Definition mutable_ring_interface.h:108
constexpr void clear()
Definition mutable_ring_interface.h:36
constexpr auto emplace_front(Args &&... args) -> decltype(auto)
Definition mutable_ring_interface.h:78
constexpr auto resize(size_t count, Value const &value)
Definition mutable_ring_interface.h:124
constexpr auto pop_back() -> decltype(auto)
Definition mutable_ring_interface.h:62
constexpr auto push_front(Value const &value) -> decltype(auto) requires(concepts::CopyConstructible< Value >)
Definition mutable_ring_interface.h:64
constexpr auto insert(ConstIterator position, Value const &value)
Definition mutable_ring_interface.h:90
constexpr auto erase(ConstIterator start, ConstIterator end)
Definition mutable_ring_interface.h:109
constexpr auto emplace_back(Args &&... args) -> decltype(auto)
Definition mutable_ring_interface.h:52
constexpr auto reserve(usize n)
Definition mutable_ring_interface.h:114
constexpr auto pop_front() -> decltype(auto)
Definition mutable_ring_interface.h:88
constexpr auto push_back(Value &&value) -> decltype(auto) requires(concepts::MoveConstructible< Value >)
Definition mutable_ring_interface.h:44
constexpr auto emplace(ConstIterator position, Args &&... args)
Definition mutable_ring_interface.h:104
constexpr auto make_contigous()
Definition mutable_ring_interface.h:116
constexpr auto prepend_container(Con &&container)
Definition mutable_ring_interface.h:84
constexpr friend auto tag_invoke(T, Self &self, F &&function)
Definition mutable_ring_interface.h:133
constexpr auto push_front(Value &&value) -> decltype(auto) requires(concepts::MoveConstructible< Value >)
Definition mutable_ring_interface.h:70
constexpr friend auto tag_invoke(types::Tag< util::create_in_place >, InPlaceType< Self >, Con &&container, Args &&... args)
Definition mutable_ring_interface.h:18
constexpr auto iterator(ConstIterator iter)
Definition mutable_ring_interface.h:112
Definition ring_iterator.h:8
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 pop_front(concepts::detail::MutableRing auto &ring)
Definition ring_operations.h:188
constexpr auto prepend_container(Ring &ring, Con &&container) -> R
Definition ring_operations.h:182
constexpr auto emplace_back(Ring &ring, Args &&... args) -> decltype(auto)
Definition ring_operations.h:128
constexpr auto append_container(Ring &ring, Con &&container) -> R
Definition ring_operations.h:144
constexpr auto iterator(Ring &, RingIterator< Value const > iterator)
Definition ring_operations.h:77
constexpr auto resize(Ring &ring, usize count)
Definition ring_operations.h:260
constexpr auto make_contigous(concepts::detail::MutableRing auto &ring)
Definition ring_operations.h:235
constexpr void clear(concepts::detail::MutableRing auto &ring)
Definition ring_operations.h:95
constexpr auto erase(Ring &ring, RingIterator< Value const > first, RingIterator< Value const > last)
Definition ring_operations.h:212
constexpr auto reserve(Ring &ring, usize capacity) -> R
Definition ring_operations.h:103
constexpr auto emplace_front(Ring &ring, Args &&... args) -> decltype(auto)
Definition ring_operations.h:163
constexpr auto pop_back(concepts::detail::MutableRing auto &ring)
Definition ring_operations.h:150
constexpr auto emplace(Ring &ring, RingIterator< T const > it, Args &&... args)
Definition ring_operations.h:201
constexpr auto append_container(Vec &vector, Con &&container) -> R
Definition vector_append_container.h:21
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