Loading...
Searching...
No Matches
IndirectContainer.hpp
1#pragma once
2#include <array>
3#include <memory>
4#include <vector>
5
6namespace score
7{
8template <typename base_iterator_t>
10{
12 using iterator = self_type;
14 using value_type = std::remove_reference_t<
15 decltype(*std::declval<typename base_iterator_t::value_type>())>;
16 using reference = value_type&;
17 using pointer = value_type*;
18 using iterator_category = std::forward_iterator_tag;
19 using difference_type = int;
20
21 base_iterator_t it;
22
23 self_type operator++() noexcept
24 {
25 ++it;
26 return *this;
27 }
28 self_type operator++(int) noexcept
29 {
30 self_type i = *this;
31 it++;
32 return i;
33 }
34
35 value_type& operator*() const noexcept { return **it; }
36 value_type* operator->() const noexcept { return *it; }
37 bool operator==(const self_type& rhs) const noexcept { return it == rhs.it; }
38 bool operator!=(const self_type& rhs) const noexcept { return it != rhs.it; }
39 bool operator<(const self_type& rhs) const noexcept { return it < rhs.it; }
40};
41
42template <typename T>
43indirect_iterator<T> make_indirect_iterator(const T& it) noexcept
44{
45 return indirect_iterator<T>{it};
46}
47
48template <typename base_iterator_t>
50{
52 using iterator = self_type;
54 using value_type = std::remove_reference_t<decltype(*std::declval<base_iterator_t>())>;
55 using reference = value_type&;
56 using pointer = value_type*;
57 using iterator_category = std::forward_iterator_tag;
58 using difference_type = int;
59
60 base_iterator_t it;
61
62 self_type operator++() noexcept
63 {
64 ++it;
65 return *this;
66 }
67 self_type operator++(int) noexcept
68 {
69 self_type i = *this;
70 it++;
71 return i;
72 }
73
74 auto& operator*() const noexcept { return **it; }
75 auto operator->() const noexcept { return it; }
76 bool operator==(const self_type& rhs) const noexcept { return it == rhs.it; }
77 bool operator!=(const self_type& rhs) const noexcept { return it != rhs.it; }
78 bool operator<(const self_type& rhs) const noexcept { return it < rhs.it; }
79};
80
81template <typename T>
82indirect_ptr_iterator<T> make_indirect_ptr_iterator(const T& it)
83{
84 return indirect_ptr_iterator<T>{it};
85}
86
87template <typename base_iterator_t>
89{
91 using iterator = self_type;
93 using value_type = std::remove_reference_t<
94 decltype(*std::declval<typename base_iterator_t::value_type::second_type>())>;
95 using reference = value_type&;
96 using pointer = value_type*;
97 using iterator_category = std::forward_iterator_tag;
98 using difference_type = int;
99
100 base_iterator_t it;
101
102 self_type operator++() noexcept
103 {
104 ++it;
105 return *this;
106 }
107 self_type operator++(int) noexcept
108 {
109 self_type i = *this;
110 it++;
111 return i;
112 }
113
114 auto& operator*() const noexcept { return *it->second; }
115 auto operator->() const noexcept { return it->second; }
116 bool operator==(const self_type& rhs) const noexcept { return it == rhs.it; }
117 bool operator!=(const self_type& rhs) const noexcept { return it != rhs.it; }
118 bool operator<(const self_type& rhs) const noexcept { return it < rhs.it; }
119};
120
121template <typename T>
122indirect_map_iterator<T> make_indirect_map_iterator(const T& it)
123{
124 return indirect_map_iterator<T>{it};
125}
126
127template <typename base_iterator_t, typename CastTo>
129{
131 using iterator = self_type;
133 using value_type = std::remove_reference_t<
134 decltype(*std::declval<typename base_iterator_t::value_type::second_type>())>;
135 using reference = value_type&;
136 using pointer = value_type*;
137 using iterator_category = std::forward_iterator_tag;
138 using difference_type = int;
139
140 base_iterator_t it;
141
142 self_type operator++() noexcept
143 {
144 ++it;
145 return *this;
146 }
147 self_type operator++(int) noexcept
148 {
149 self_type i = *this;
150 it++;
151 return i;
152 }
153
154 auto& operator*() const noexcept { return static_cast<CastTo&>(*it->second); }
155 auto operator->() const noexcept { return static_cast<CastTo*>(&*it->second); }
156 bool operator==(const self_type& rhs) const noexcept { return it == rhs.it; }
157 bool operator!=(const self_type& rhs) const noexcept { return it != rhs.it; }
158 bool operator<(const self_type& rhs) const noexcept { return it < rhs.it; }
159};
160
161template <typename CastTo, typename T>
162indirect_cast_map_iterator<T, CastTo> make_indirect_cast_map_iterator(const T& it)
163{
165}
166
167template <typename T, typename U = std::allocator<T*>>
168class IndirectContainer : std::vector<T*, U>
169{
170public:
171 using ctnr_t = std::vector<T*, U>;
172 using ctnr_t::ctnr_t;
173 using ctnr_t::reserve;
174 using ctnr_t::resize;
175 using value_type = T;
176
177 auto begin() noexcept { return make_indirect_ptr_iterator(ctnr_t::begin()); }
178 auto end() noexcept { return make_indirect_ptr_iterator(ctnr_t::end()); }
179 auto begin() const noexcept { return make_indirect_ptr_iterator(ctnr_t::begin()); }
180 auto end() const noexcept { return make_indirect_ptr_iterator(ctnr_t::end()); }
181
182 auto rbegin() noexcept { return make_indirect_ptr_iterator(ctnr_t::rbegin()); }
183 auto rend() noexcept { return make_indirect_ptr_iterator(ctnr_t::rend()); }
184 auto rbegin() const noexcept { return make_indirect_ptr_iterator(ctnr_t::rbegin()); }
185 auto rend() const noexcept { return make_indirect_ptr_iterator(ctnr_t::rend()); }
186
187 auto cbegin() const noexcept { return make_indirect_ptr_iterator(ctnr_t::cbegin()); }
188 auto cend() const noexcept { return make_indirect_ptr_iterator(ctnr_t::cend()); }
189
190 auto size() const noexcept { return ctnr_t::size(); }
191 auto empty() const noexcept { return ctnr_t::empty(); }
192
193 auto push_back(T* ptr) { return ctnr_t::push_back(ptr); }
194
195 auto& front() const noexcept { return *ctnr_t::front(); }
196 auto& back() const noexcept { return *ctnr_t::back(); }
197
198 auto& operator[](int pos) noexcept { return *ctnr_t::operator[](pos); }
199 auto& operator[](int pos) const noexcept { return *ctnr_t::operator[](pos); }
200};
201
202template <class Container>
204{
205public:
206 Container& container;
207
208 auto begin() { return make_indirect_iterator(container.begin()); }
209 auto end() { return make_indirect_iterator(container.end()); }
210 auto begin() const { return make_indirect_iterator(container.begin()); }
211 auto end() const { return make_indirect_iterator(container.end()); }
212 auto cbegin() const { return make_indirect_iterator(container.cbegin()); }
213 auto cend() const { return make_indirect_iterator(container.cend()); }
214};
215
216template <typename T>
217auto wrap_indirect(T& container)
218{
219 return IndirectContainerWrapper<T>{container};
220}
221
222template <typename T, int N>
224{
225 std::array<T*, N> array;
226
227public:
228 using value_type = T;
229 template <typename... Args>
230 IndirectArray(Args&&... args) noexcept
231 : array{{std::forward<Args>(args)...}}
232 {
233 }
234
235 auto begin() noexcept { return make_indirect_ptr_iterator(array.begin()); }
236 auto end() noexcept { return make_indirect_ptr_iterator(array.end()); }
237 auto begin() const noexcept { return make_indirect_ptr_iterator(array.begin()); }
238 auto end() const noexcept { return make_indirect_ptr_iterator(array.end()); }
239 auto cbegin() const noexcept { return make_indirect_ptr_iterator(array.cbegin()); }
240 auto cend() const noexcept { return make_indirect_ptr_iterator(array.cend()); }
241
242 auto& operator[](int pos) noexcept { return *array[pos]; }
243 auto& operator[](int pos) const noexcept { return *array[pos]; }
244};
245
246template <typename Map_T>
248{
249public:
250 auto begin() noexcept { return make_indirect_iterator(map.begin()); }
251 auto begin() const noexcept { return make_indirect_iterator(map.begin()); }
252
253 auto cbegin() noexcept { return make_indirect_iterator(map.cbegin()); }
254 auto cbegin() const noexcept { return make_indirect_iterator(map.cbegin()); }
255
256 auto end() noexcept { return make_indirect_iterator(map.end()); }
257 auto end() const noexcept { return make_indirect_iterator(map.end()); }
258
259 auto cend() noexcept { return make_indirect_iterator(map.cend()); }
260 auto cend() const noexcept { return make_indirect_iterator(map.cend()); }
261
262 auto empty() const noexcept { return map.empty(); }
263
264 template <typename K>
265 auto find(K&& key) const noexcept
266 {
267 return map.find(std::forward<K>(key));
268 }
269
270 template <typename E>
271 auto insert(E&& elt)
272 {
273 return map.insert(std::forward<E>(elt));
274 }
275
276protected:
277 Map_T map;
278};
279
280template <typename Map_T>
282{
283 using base_iterator_t = typename Map_T::iterator;
284 using base_const_iterator_t = typename Map_T::const_iterator;
285
286public:
287 using value_type = typename base_iterator_t::value_type;
288 IndirectUnorderedMap() noexcept = default;
289
290 auto begin() noexcept { return make_indirect_map_iterator(map.begin()); }
291 auto begin() const noexcept { return make_indirect_map_iterator(map.begin()); }
292
293 auto cbegin() noexcept { return make_indirect_map_iterator(map.cbegin()); }
294 auto cbegin() const noexcept { return make_indirect_map_iterator(map.cbegin()); }
295
296 auto end() noexcept { return make_indirect_map_iterator(map.end()); }
297 auto end() const noexcept { return make_indirect_map_iterator(map.end()); }
298
299 auto cend() noexcept { return make_indirect_map_iterator(map.cend()); }
300 auto cend() const noexcept { return make_indirect_map_iterator(map.cend()); }
301
302 auto empty() const noexcept { return map.empty(); }
303
304 template <typename K>
305 auto find(K&& key) const noexcept
306 {
307 return make_indirect_map_iterator(map.find(std::forward<K>(key)));
308 }
309
310 template <typename E>
311 auto insert(E&& elt)
312 {
313 return map.insert(std::forward<E>(elt));
314 }
315
316protected:
317 Map_T map;
318
319private:
322 IndirectUnorderedMap& operator=(const IndirectUnorderedMap&) = delete;
323 IndirectUnorderedMap& operator=(IndirectUnorderedMap&&) = delete;
324};
325}
Definition IndirectContainer.hpp:224
Definition IndirectContainer.hpp:169
Definition IndirectContainer.hpp:204
Definition IndirectContainer.hpp:248
Definition IndirectContainer.hpp:282
Base toolkit upon which the software is built.
Definition Application.cpp:97
Definition IndirectContainer.hpp:129
Definition IndirectContainer.hpp:10
Definition IndirectContainer.hpp:89
Definition IndirectContainer.hpp:50