Embedded Template Library 1.0
Loading...
Searching...
No Matches
const_multimap.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2025 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
29******************************************************************************/
30
31#ifndef ETL_CONST_MULTIMAP_INCLUDED
32#define ETL_CONST_MULTIMAP_INCLUDED
33
34#include "platform.h"
35
36#if ETL_NOT_USING_CPP11
37 #error NOT SUPPORTED FOR C++03 OR BELOW
38#endif
39
40#include "algorithm.h"
41#include "type_traits.h"
42#include "functional.h"
43#include "nth_type.h"
44#include "span.h"
45
47
50
51namespace etl
52{
53 template <typename TKey, typename TMapped, typename TKeyCompare = etl::less<TKey>>
55 {
56 public:
57
58 using key_type = TKey;
59 using value_type = ETL_OR_STD::pair<const TKey, TMapped>;
60 using mapped_type = TMapped ;
61 using key_compare = TKeyCompare;
62 using const_reference = const value_type&;
63 using const_pointer = const value_type*;
64 using const_iterator = const value_type*;
65 using size_type = size_t;
66
67 //*********************************************************************
69 //*********************************************************************
71 {
72 public:
73
74 // Compare two value types.
75 ETL_CONSTEXPR14 bool operator ()(const value_type& element1, const value_type& element2) const ETL_NOEXCEPT
76 {
77 return kcompare(element1.first, element2.first);
78 }
79
80 // Compare value type and key.
81 ETL_CONSTEXPR14 bool operator ()(const value_type& element, const key_type& key) const ETL_NOEXCEPT
82 {
83 return kcompare(element.first, key);
84 }
85
86 // Compare value types and key.
87 // Enabled for transparent comparators.
88 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
89 ETL_CONSTEXPR14 bool operator ()(const value_type& element, const K& key) const ETL_NOEXCEPT
90 {
91 return kcompare(element.first, key);
92 }
93
94 // Compare key and value type.
95 ETL_CONSTEXPR14 bool operator ()(const key_type& key, const value_type& element) const ETL_NOEXCEPT
96 {
97 return kcompare(key, element.first);
98 }
99
100 // Compare key and value type.
101 // Enabled for transparent comparators.
102 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
103 ETL_CONSTEXPR14 bool operator ()(const K& key, const value_type& element) const ETL_NOEXCEPT
104 {
105 return kcompare(key, element.first);
106 }
107
108 key_compare kcompare;
109 };
110
111 //*************************************************************************
115 //*************************************************************************
116 ETL_CONSTEXPR14 bool is_valid() const ETL_NOEXCEPT
117 {
118 return etl::is_sorted(begin(), end(), vcompare);
119 }
120
121 //*************************************************************************
124 //*************************************************************************
125 ETL_CONSTEXPR14 const_iterator begin() const ETL_NOEXCEPT
126 {
127 return element_list;
128 }
129
130 //*************************************************************************
133 //*************************************************************************
134 ETL_CONSTEXPR14 const_iterator cbegin() const ETL_NOEXCEPT
135 {
136 return element_list;
137 }
138
139 //*************************************************************************
142 //*************************************************************************
143 ETL_CONSTEXPR14 const_iterator end() const ETL_NOEXCEPT
144 {
145 return element_list_end;
146 }
147
148 //*************************************************************************
151 //*************************************************************************
152 ETL_CONSTEXPR14 const_iterator cend() const ETL_NOEXCEPT
153 {
154 return element_list_end;
155 }
156
157 //*************************************************************************
160 //*************************************************************************
161 ETL_CONSTEXPR14 const_pointer data() const ETL_NOEXCEPT
162 {
163 return element_list;
164 }
165
166 //*************************************************************************
171 //*************************************************************************
172 ETL_CONSTEXPR14 const_iterator find(const key_type& key) const ETL_NOEXCEPT
173 {
174 const_iterator itr = lower_bound(key);
175
176 if ((itr != end()) && (keys_are_equal(itr->first, key)))
177 {
178 return itr;
179 }
180
181 return end();
182 }
183
184 //*************************************************************************
190 //*************************************************************************
191 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
192 ETL_CONSTEXPR14 const_iterator find(const K& key) const ETL_NOEXCEPT
193 {
194 const_iterator itr = lower_bound(key);
195
196 if ((itr != end()) && (keys_are_equal(itr->first, key)))
197 {
198 return itr;
199 }
200
201 return end();
202 }
203
204 //*************************************************************************
208 //*************************************************************************
209 ETL_CONSTEXPR14 bool contains(const key_type& key) const ETL_NOEXCEPT
210 {
211 return find(key) != end();
212 }
213
214 //*************************************************************************
219 //*************************************************************************
220 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
221 ETL_CONSTEXPR14 bool contains(const K& key) const ETL_NOEXCEPT
222 {
223 return find(key) != end();
224 }
225
226 //*************************************************************************
230 //*************************************************************************
231 ETL_CONSTEXPR14 size_type count(const key_type& key) const ETL_NOEXCEPT
232 {
233 auto range = equal_range(key);
234
235 return size_type(etl::distance(range.first, range.second));
236 }
237
238 //*************************************************************************
243 //*************************************************************************
244 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
245 ETL_CONSTEXPR14 size_type count(const K& key) const ETL_NOEXCEPT
246 {
247 auto range = equal_range(key);
248
249 return size_type(etl::distance(range.first, range.second));
250 }
251
252 //*************************************************************************
259 //*************************************************************************
260 ETL_CONSTEXPR14 ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(const key_type& key) const ETL_NOEXCEPT
261 {
262 return etl::equal_range(begin(), end(), key, vcompare);
263 }
264
265 //*************************************************************************
273 //*************************************************************************
274 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
275 ETL_CONSTEXPR14 ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(const K& key) const ETL_NOEXCEPT
276 {
277 return etl::equal_range(begin(), end(), key, vcompare);
278 }
279
280 //*************************************************************************
285 //*************************************************************************
286 ETL_CONSTEXPR14 const_iterator lower_bound(const key_type& key) const ETL_NOEXCEPT
287 {
288 return etl::lower_bound(begin(), end(), key, vcompare);
289 }
290
291 //*************************************************************************
297 //*************************************************************************
298 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
299 ETL_CONSTEXPR14 const_iterator lower_bound(const K& key) const ETL_NOEXCEPT
300 {
301 return etl::lower_bound(begin(), end(), key, vcompare);
302 }
303
304 //*************************************************************************
309 //*************************************************************************
310 ETL_CONSTEXPR14 const_iterator upper_bound(const key_type& key) const ETL_NOEXCEPT
311 {
312 return etl::upper_bound(begin(), end(), key, vcompare);
313 }
314
315 //*************************************************************************
321 //*************************************************************************
322 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
323 ETL_CONSTEXPR14 const_iterator upper_bound(const K& key) const ETL_NOEXCEPT
324 {
325 return etl::upper_bound(begin(), end(), key, vcompare);
326 }
327
328 //*************************************************************************
331 //*************************************************************************
332 ETL_CONSTEXPR14 size_type empty() const ETL_NOEXCEPT
333 {
334 return size() == 0U;
335 }
336
337 //*************************************************************************
340 //*************************************************************************
341 ETL_CONSTEXPR14 size_type full() const ETL_NOEXCEPT
342 {
343 return (max_elements != 0) && (size() == max_elements);
344 }
345
346 //*************************************************************************
349 //*************************************************************************
350 ETL_CONSTEXPR14 size_type size() const ETL_NOEXCEPT
351 {
352 return size_type(element_list_end - element_list);
353 }
354
355 //*************************************************************************
358 //*************************************************************************
359 ETL_CONSTEXPR14 size_type max_size() const ETL_NOEXCEPT
360 {
361 return max_elements;
362 }
363
364 //*************************************************************************
368 //*************************************************************************
369 ETL_CONSTEXPR14 size_type capacity() const ETL_NOEXCEPT
370 {
371 return max_elements;
372 }
373
374 //*************************************************************************
377 //*************************************************************************
378 ETL_CONSTEXPR14 key_compare key_comp() const ETL_NOEXCEPT
379 {
380 return vcompare.kcompare;
381 }
382
383 //*************************************************************************
386 //*************************************************************************
387 ETL_CONSTEXPR14 value_compare value_comp() const ETL_NOEXCEPT
388 {
389 return vcompare;
390 }
391
392 protected:
393
394 //*************************************************************************
396 //*************************************************************************
397 template <typename... TElements>
398 ETL_CONSTEXPR14 explicit iconst_multimap(const value_type* element_list_, size_type size_, size_type max_elements_) ETL_NOEXCEPT
399 : element_list(element_list_)
400 , element_list_end{element_list_ + size_}
401 , max_elements(max_elements_)
402 {
403 }
404
405 private:
406
407 //*********************************************************************
409 //*********************************************************************
410 ETL_CONSTEXPR14 bool keys_are_equal(const key_type& key1, const key_type& key2) const ETL_NOEXCEPT
411 {
412 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
413 }
414
415 //*********************************************************************
418 //*********************************************************************
419 template <typename K1, typename K2, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
420 ETL_CONSTEXPR14 bool keys_are_equal(const K1& key1, const K2& key2) const ETL_NOEXCEPT
421 {
422 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
423 }
424
425 value_compare vcompare;
426
427 const value_type* element_list;
428 const value_type* element_list_end;
429 size_type max_elements;
430 };
431
432 //*************************************************************************
434 //*************************************************************************
435 template <typename TKey, typename TMapped, size_t Size, typename TKeyCompare = etl::less<TKey>>
436 class const_multimap : public iconst_multimap<TKey, TMapped, TKeyCompare>
437 {
438 public:
439
441
442 using key_type = typename base_t::key_type;
443 using value_type = typename base_t::value_type;
444 using mapped_type = typename base_t::mapped_type;
445 using key_compare = typename base_t::key_compare;
446 using const_reference = typename base_t::const_reference;
447 using const_pointer = typename base_t::const_pointer;
448 using const_iterator = typename base_t::const_iterator;
449 using size_type = typename base_t::size_type;
450
451 static_assert((etl::is_default_constructible<key_type>::value), "key_type must be default constructible");
452 static_assert((etl::is_default_constructible<mapped_type>::value), "mapped_type must be default constructible");
453
454 //*************************************************************************
459 //*************************************************************************
460 template <typename... TElements>
461 ETL_CONSTEXPR14 explicit const_multimap(TElements&&... elements) ETL_NOEXCEPT
462 : iconst_multimap<TKey, TMapped, TKeyCompare>(element_list, sizeof...(elements), Size)
463 , element_list{etl::forward<TElements>(elements)...}
464 {
465 static_assert((etl::are_all_same<value_type, etl::decay_t<TElements>...>::value), "All elements must be value_type");
466 static_assert(sizeof...(elements) <= Size, "Number of elements exceeds capacity");
467 }
468
469 private:
470
471 value_type element_list[Size];
472 };
473
474 //*************************************************************************
476 //*************************************************************************
477#if ETL_USING_CPP17
478 template <typename... TPairs>
479 const_multimap(TPairs...) -> const_multimap<typename etl::nth_type_t<0, TPairs...>::first_type,
480 typename etl::nth_type_t<0, TPairs...>::second_type,
481 sizeof...(TPairs)>;
482#endif
483
484 //*********************************************************************
486 //*********************************************************************
487 template <typename TKey, typename TMapped, typename TKeyCompare = etl::less<TKey>>
488 class const_multimap_ext : public iconst_multimap<TKey, TMapped, TKeyCompare>
489 {
490 public:
491
493
494 using key_type = typename base_t::key_type;
495 using value_type = typename base_t::value_type;
496 using mapped_type = typename base_t::mapped_type ;
497 using key_compare = typename base_t::key_compare;
498 using const_reference = typename base_t::const_reference;
499 using const_pointer = typename base_t::const_pointer;
500 using const_iterator = typename base_t::const_iterator;
501 using size_type = typename base_t::size_type;
502
503 static_assert((etl::is_default_constructible<key_type>::value), "key_type must be default constructible");
504 static_assert((etl::is_default_constructible<mapped_type>::value), "mapped_type must be default constructible");
505
506 //*************************************************************************
508 //*************************************************************************
509 ETL_CONSTEXPR14 const_multimap_ext() ETL_NOEXCEPT
510 : iconst_multimap<TKey, TMapped, TKeyCompare>(nullptr, 0, 0)
511 {
512 }
513
514 //*************************************************************************
516 //*************************************************************************
517 template <size_type Size>
518 ETL_CONSTEXPR14 explicit const_multimap_ext(const etl::span<const value_type, Size>& sp) ETL_NOEXCEPT
519 : iconst_multimap<TKey, TMapped, TKeyCompare>(sp.data(), Size, Size)
520 {
521 }
522
523 //*************************************************************************
525 //*************************************************************************
526 template <size_type Size>
527 ETL_CONSTEXPR14 explicit const_multimap_ext(const value_type(&begin_)[Size]) ETL_NOEXCEPT
529 {
530 }
531 };
532
533 //*************************************************************************
535 //*************************************************************************
536#if ETL_USING_CPP17
537 template <typename TElements, size_t Size>
538 const_multimap_ext(const etl::span<TElements, Size>&) -> const_multimap_ext<typename TElements::first_type, typename TElements::second_type>;
539
540 template <typename TElements, size_t Size>
541 const_multimap_ext(const TElements(&)[Size]) -> const_multimap_ext<typename TElements::first_type, typename TElements::second_type>;
542#endif
543
544 //*************************************************************************
546 //*************************************************************************
547 template <typename TKey, typename TMapped, typename TKeyCompare>
550 {
551 return etl::equal(lhs.begin(), lhs.end(), rhs.begin());
552 }
553
554 //*************************************************************************
556 //*************************************************************************
557 template <typename TKey, typename TMapped, typename TKeyCompare>
560 {
561 return !(lhs == rhs);
562 }
563
564 //*************************************************************************
570 //*************************************************************************
571 template <typename TKey, typename TMapped, typename TKeyCompare>
574 {
575 return etl::lexicographical_compare(lhs.begin(), lhs.end(),
576 rhs.begin(), rhs.end(),
577 lhs.value_comp());
578 }
579
580 //*************************************************************************
586 //*************************************************************************
587 template <typename TKey, typename TMapped, typename TKeyCompare>
590 {
591 return (rhs < lhs);
592 }
593
594 //*************************************************************************
600 //*************************************************************************
601 template <typename TKey, typename TMapped, typename TKeyCompare>
604 {
605 return !(rhs < lhs);
606 }
607
608 //*************************************************************************
614 //*************************************************************************
615 template <typename TKey, typename TMapped, typename TKeyCompare>
618 {
619 return !(lhs < rhs);
620 }
621}
622
623#endif
ETL_CONSTEXPR14 const_multimap_ext(const etl::span< const value_type, Size > &sp) ETL_NOEXCEPT
Construct a const_map from a variadic list of elements.
Definition const_multimap.h:518
ETL_CONSTEXPR14 const_multimap_ext(const value_type(&begin_)[Size]) ETL_NOEXCEPT
Construct a const_map from an array.
Definition const_multimap.h:527
ETL_CONSTEXPR14 const_multimap_ext() ETL_NOEXCEPT
Default construct a const_map.
Definition const_multimap.h:509
Multimap type designed for constexpr.
Definition const_multimap.h:437
ETL_CONSTEXPR14 const_multimap(TElements &&... elements) ETL_NOEXCEPT
Construct a const_map from a variadic list of elements. Static asserts if the element type is not con...
Definition const_multimap.h:461
How to compare elements and keys.
Definition const_multimap.h:71
Definition const_multimap.h:55
ETL_CONSTEXPR14 const_iterator lower_bound(const K &key) const ETL_NOEXCEPT
Returns a const_iterator to the first element that is not less than the key. Returns a const_iterator...
Definition const_multimap.h:299
ETL_CONSTEXPR14 size_type count(const K &key) const ETL_NOEXCEPT
Counts the numbeer elements with key. Enabled if the comparator is transparent.
Definition const_multimap.h:245
ETL_CONSTEXPR14 value_compare value_comp() const ETL_NOEXCEPT
Definition const_multimap.h:387
ETL_CONSTEXPR14 const_iterator upper_bound(const K &key) const ETL_NOEXCEPT
Returns a const_iterator to the first element that is greater than the key. Returns a const_iterator ...
Definition const_multimap.h:323
ETL_CONSTEXPR14 const_iterator end() const ETL_NOEXCEPT
Gets the end of the map.
Definition const_multimap.h:143
ETL_CONSTEXPR14 const_iterator lower_bound(const key_type &key) const ETL_NOEXCEPT
Returns a const_iterator to the first element that is not less than the key. Returns a const_iterator...
Definition const_multimap.h:286
ETL_CONSTEXPR14 key_compare key_comp() const ETL_NOEXCEPT
Definition const_multimap.h:378
ETL_CONSTEXPR14 const_iterator find(const K &key) const ETL_NOEXCEPT
Gets a const_iterator to the mapped value at the key index. Enabled if the comparator is transparent.
Definition const_multimap.h:192
ETL_CONSTEXPR14 bool contains(const K &key) const ETL_NOEXCEPT
Checks if the map contains an element with key. Enabled if the comparator is transparent.
Definition const_multimap.h:221
ETL_CONSTEXPR14 size_type empty() const ETL_NOEXCEPT
Definition const_multimap.h:332
ETL_CONSTEXPR14 ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const K &key) const ETL_NOEXCEPT
Returns a range containing all elements with the key. The range is defined by a pair of two iterators...
Definition const_multimap.h:275
ETL_CONSTEXPR14 size_type size() const ETL_NOEXCEPT
Definition const_multimap.h:350
ETL_CONSTEXPR14 size_type max_size() const ETL_NOEXCEPT
Definition const_multimap.h:359
ETL_CONSTEXPR14 iconst_multimap(const value_type *element_list_, size_type size_, size_type max_elements_) ETL_NOEXCEPT
Constructor.
Definition const_multimap.h:398
ETL_CONSTEXPR14 const_iterator cbegin() const ETL_NOEXCEPT
Gets the beginning of the map.
Definition const_multimap.h:134
ETL_CONSTEXPR14 bool is_valid() const ETL_NOEXCEPT
Definition const_multimap.h:116
ETL_CONSTEXPR14 const_iterator find(const key_type &key) const ETL_NOEXCEPT
Gets a const_iterator to the mapped value at the key index.
Definition const_multimap.h:172
ETL_CONSTEXPR14 ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const key_type &key) const ETL_NOEXCEPT
Returns a range containing all elements with the key. The range is defined by a pair of two iterators...
Definition const_multimap.h:260
ETL_CONSTEXPR14 const_iterator upper_bound(const key_type &key) const ETL_NOEXCEPT
Returns a const_iterator to the first element that is greater than the key. Returns a const_iterator ...
Definition const_multimap.h:310
ETL_CONSTEXPR14 const_iterator begin() const ETL_NOEXCEPT
Gets the beginning of the map.
Definition const_multimap.h:125
ETL_CONSTEXPR14 const_iterator cend() const ETL_NOEXCEPT
Gets the end of the map.
Definition const_multimap.h:152
ETL_CONSTEXPR14 size_type full() const ETL_NOEXCEPT
Definition const_multimap.h:341
ETL_CONSTEXPR14 const_pointer data() const ETL_NOEXCEPT
Gets the beginning of the map.
Definition const_multimap.h:161
ETL_CONSTEXPR14 size_type capacity() const ETL_NOEXCEPT
Definition const_multimap.h:369
ETL_CONSTEXPR14 bool contains(const key_type &key) const ETL_NOEXCEPT
Checks if the map contains an element with key.
Definition const_multimap.h:209
ETL_CONSTEXPR14 size_type count(const key_type &key) const ETL_NOEXCEPT
Counts the numbeer elements with key.
Definition const_multimap.h:231
Span - Fixed Extent.
Definition span.h:138
ETL_NODISCARD ETL_CONSTEXPR14 bool is_sorted(TIterator begin, TIterator end)
Definition algorithm.h:1709
bitset_ext
Definition absolute.h:39
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1190
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1202
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1151
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1139
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1163
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1178