Embedded Template Library 1.0
Loading...
Searching...
No Matches
const_multiset.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_MULTISET_INCLUDED
32#define ETL_CONST_MULTISET_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 "functional.h"
42#include "nth_type.h"
43#include "span.h"
44#include "type_traits.h"
45
47
50
51namespace etl
52{
53 template <typename TKey, typename TKeyCompare = etl::less<TKey>>
55 {
56 public:
57
58 using key_type = TKey;
59 using value_type = TKey;
60 using key_compare = TKeyCompare;
61 using value_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 //*************************************************************************
71 //*************************************************************************
72 ETL_CONSTEXPR14 bool is_valid() const ETL_NOEXCEPT
73 {
74 return etl::is_sorted(begin(), end(), vcompare);
75 }
76
77 //*************************************************************************
80 //*************************************************************************
81 ETL_CONSTEXPR14 const_iterator begin() const ETL_NOEXCEPT
82 {
83 return element_list;
84 }
85
86 //*************************************************************************
89 //*************************************************************************
90 ETL_CONSTEXPR14 const_iterator cbegin() const ETL_NOEXCEPT
91 {
92 return element_list;
93 }
94
95 //*************************************************************************
98 //*************************************************************************
99 ETL_CONSTEXPR14 const_iterator end() const ETL_NOEXCEPT
100 {
101 return element_list_end;
102 }
103
104 //*************************************************************************
107 //*************************************************************************
108 ETL_CONSTEXPR14 const_iterator cend() const ETL_NOEXCEPT
109 {
110 return element_list_end;
111 }
112
113 //*************************************************************************
116 //*************************************************************************
117 ETL_CONSTEXPR14 const_pointer data() const ETL_NOEXCEPT
118 {
119 return element_list;
120 }
121
122 //*************************************************************************
127 //*************************************************************************
128 ETL_CONSTEXPR14 const_iterator find(const key_type& key) const ETL_NOEXCEPT
129 {
130 const_iterator itr = lower_bound(key);
131
132 if ((itr != end()) && (keys_are_equal(*itr, key)))
133 {
134 return itr;
135 }
136
137 return end();
138 }
139
140 //*************************************************************************
146 //*************************************************************************
147 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
148 ETL_CONSTEXPR14 const_iterator find(const K& key) const ETL_NOEXCEPT
149 {
150 const_iterator itr = lower_bound(key);
151
152 if ((itr != end()) && (keys_are_equal(*itr, key)))
153 {
154 return itr;
155 }
156
157 return end();
158 }
159
160 //*************************************************************************
164 //*************************************************************************
165 ETL_CONSTEXPR14 bool contains(const key_type& key) const ETL_NOEXCEPT
166 {
167 return find(key) != end();
168 }
169
170 //*************************************************************************
175 //*************************************************************************
176 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
177 ETL_CONSTEXPR14 bool contains(const K& key) const ETL_NOEXCEPT
178 {
179 return find(key) != end();
180 }
181
182 //*************************************************************************
186 //*************************************************************************
187 ETL_CONSTEXPR14 size_type count(const key_type& key) const ETL_NOEXCEPT
188 {
189 auto range = equal_range(key);
190
191 return size_type(etl::distance(range.first, range.second));
192 }
193
194 //*************************************************************************
199 //*************************************************************************
200 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
201 ETL_CONSTEXPR14 size_type count(const K& key) const ETL_NOEXCEPT
202 {
203 auto range = equal_range(key);
204
205 return size_type(etl::distance(range.first, range.second));
206 }
207
208 //*************************************************************************
215 //*************************************************************************
216 ETL_CONSTEXPR14 ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(const key_type& key) const ETL_NOEXCEPT
217 {
218 return etl::equal_range(begin(), end(), key, vcompare);
219 }
220
221 //*************************************************************************
229 //*************************************************************************
230 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
231 ETL_CONSTEXPR14 ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(const K& key) const ETL_NOEXCEPT
232 {
233 return etl::equal_range(begin(), end(), key, vcompare);
234 }
235
236 //*************************************************************************
243 //*************************************************************************
244 ETL_CONSTEXPR14 const_iterator lower_bound(const key_type& key) const ETL_NOEXCEPT
245 {
246 return etl::lower_bound(begin(), end(), key, vcompare);
247 }
248
249 //*************************************************************************
256 //*************************************************************************
257 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
258 ETL_CONSTEXPR14 const_iterator lower_bound(const K& key) const ETL_NOEXCEPT
259 {
260 return etl::lower_bound(begin(), end(), key, vcompare);
261 }
262
263 //*************************************************************************
270 //*************************************************************************
271 ETL_CONSTEXPR14 const_iterator upper_bound(const key_type& key) const ETL_NOEXCEPT
272 {
273 return etl::upper_bound(begin(), end(), key, vcompare);
274 }
275
276 //*************************************************************************
283 //*************************************************************************
284 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
285 ETL_CONSTEXPR14 const_iterator upper_bound(const K& key) const ETL_NOEXCEPT
286 {
287 return etl::upper_bound(begin(), end(), key, vcompare);
288 }
289
290 //*************************************************************************
293 //*************************************************************************
294 ETL_CONSTEXPR14 size_type empty() const ETL_NOEXCEPT
295 {
296 return size() == 0U;
297 }
298
299 //*************************************************************************
302 //*************************************************************************
303 ETL_CONSTEXPR14 size_type full() const ETL_NOEXCEPT
304 {
305 return (max_elements != 0) && (size() == max_elements);
306 }
307
308 //*************************************************************************
311 //*************************************************************************
312 ETL_CONSTEXPR14 size_type size() const ETL_NOEXCEPT
313 {
314 return size_type(element_list_end - element_list);
315 }
316
317 //*************************************************************************
320 //*************************************************************************
321 ETL_CONSTEXPR14 size_type max_size() const ETL_NOEXCEPT
322 {
323 return max_elements;
324 }
325
326 //*************************************************************************
330 //*************************************************************************
331 ETL_CONSTEXPR14 size_type capacity() const ETL_NOEXCEPT
332 {
333 return max_elements;
334 }
335
336 //*************************************************************************
339 //*************************************************************************
340 ETL_CONSTEXPR14 key_compare key_comp() const ETL_NOEXCEPT
341 {
342 return kcompare;
343 }
344
345 //*************************************************************************
348 //*************************************************************************
349 ETL_CONSTEXPR14 value_compare value_comp() const ETL_NOEXCEPT
350 {
351 return vcompare;
352 }
353
354 protected:
355
356 //*************************************************************************
358 //*************************************************************************
359 template <typename... TElements>
360 ETL_CONSTEXPR14 explicit iconst_multiset(const value_type* element_list_, size_type size_, size_type max_elements_) ETL_NOEXCEPT
361 : element_list(element_list_)
362 , element_list_end{element_list_ + size_}
363 , max_elements(max_elements_)
364 {
365 }
366
367 private:
368
369 //*********************************************************************
371 //*********************************************************************
372 ETL_CONSTEXPR14 bool keys_are_equal(const key_type& key1, const key_type& key2) const ETL_NOEXCEPT
373 {
374 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
375 }
376
377 //*********************************************************************
380 //*********************************************************************
381 template <typename K1, typename K2, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
382 ETL_CONSTEXPR14 bool keys_are_equal(const K1& key1, const K2& key2) const ETL_NOEXCEPT
383 {
384 return !key_compare()(key1, key2) && !key_compare()(key2, key1);
385 }
386
387 key_compare kcompare;
388 value_compare vcompare;
389
390 const value_type* element_list;
391 const value_type* element_list_end;
392 size_type max_elements;
393 };
394
395 //*************************************************************************
397 //*************************************************************************
398 template <typename TKey, size_t Size, typename TKeyCompare = etl::less<TKey>>
399 class const_multiset : public iconst_multiset<TKey, TKeyCompare>
400 {
401 public:
402
404
405 using key_type = typename base_t::key_type;
406 using value_type = typename base_t::value_type;
407 using key_compare = typename base_t::key_compare;
408 using const_reference = typename base_t::const_reference;
409 using const_pointer = typename base_t::const_pointer;
410 using const_iterator = typename base_t::const_iterator;
411 using size_type = typename base_t::size_type;
412
413 static_assert((etl::is_default_constructible<key_type>::value), "key_type must be default constructible");
414
415 //*************************************************************************
421 //*************************************************************************
422 template <typename... TElements>
423 ETL_CONSTEXPR14 explicit const_multiset(TElements&&... elements) ETL_NOEXCEPT
424 : iconst_multiset<TKey, TKeyCompare>(element_list, sizeof...(elements), Size)
425 , element_list{etl::forward<TElements>(elements)...}
426 {
427 static_assert((etl::are_all_same<value_type, etl::decay_t<TElements>...>::value), "All elements must be value_type");
428 static_assert(sizeof...(elements) <= Size, "Number of elements exceeds capacity");
429 }
430
431 private:
432
433 value_type element_list[Size];
434 };
435
436 //*************************************************************************
438 //*************************************************************************
439#if ETL_USING_CPP17
440 template <typename... TElements>
441 const_multiset(TElements...) -> const_multiset<etl::nth_type_t<0, TElements...>, sizeof...(TElements)>;
442#endif
443
444 //*********************************************************************
446 //*********************************************************************
447 template <typename TKey, typename TKeyCompare = etl::less<TKey>>
448 class const_multiset_ext : public iconst_multiset<TKey, TKeyCompare>
449 {
450 public:
451
453
454 using key_type = typename base_t::key_type;
455 using value_type = typename base_t::value_type;
456 using key_compare = typename base_t::key_compare;
457 using const_reference = typename base_t::const_reference;
458 using const_pointer = typename base_t::const_pointer;
459 using const_iterator = typename base_t::const_iterator;
460 using size_type = typename base_t::size_type;
461
462 static_assert((etl::is_default_constructible<key_type>::value), "key_type must be default constructible");
463
464 //*************************************************************************
466 //*************************************************************************
467 ETL_CONSTEXPR14 const_multiset_ext() ETL_NOEXCEPT
468 : iconst_multiset<TKey, TKeyCompare>(nullptr, 0, 0)
469 {
470 }
471
472 //*************************************************************************
474 //*************************************************************************
475 template <size_type Size>
476 ETL_CONSTEXPR14 explicit const_multiset_ext(const etl::span<const value_type, Size>& sp) ETL_NOEXCEPT
477 : iconst_multiset<TKey, TKeyCompare>(sp.data(), Size, Size)
478 {
479 }
480
481 //*************************************************************************
483 //*************************************************************************
484 template <size_type Size>
485 ETL_CONSTEXPR14 explicit const_multiset_ext(const value_type (&begin_)[Size]) ETL_NOEXCEPT
486 : iconst_multiset<TKey, TKeyCompare>(begin_, Size, Size)
487 {
488 }
489 };
490
491 //*************************************************************************
493 //*************************************************************************
494#if ETL_USING_CPP17
495 template <typename TElements, size_t Size>
496 const_multiset_ext(const etl::span<TElements, Size>&) -> const_multiset_ext<TElements>;
497
498 template <typename TElements, size_t Size>
499 const_multiset_ext(const TElements (&)[Size]) -> const_multiset_ext<TElements>;
500#endif
501
502 //*************************************************************************
504 //*************************************************************************
505 template <typename TKey, typename TKeyCompare>
507 {
508 return (lhs.size() == rhs.size()) && etl::equal(lhs.begin(), lhs.end(), rhs.begin());
509 }
510
511 //*************************************************************************
513 //*************************************************************************
514 template <typename TKey, typename TKeyCompare>
516 {
517 return !(lhs == rhs);
518 }
519
520 //*************************************************************************
526 //*************************************************************************
527 template <typename TKey, typename TKeyCompare>
528 ETL_CONSTEXPR14 bool operator<(const etl::iconst_multiset<TKey, TKeyCompare>& lhs, const etl::iconst_multiset<TKey, TKeyCompare>& rhs) ETL_NOEXCEPT
529 {
530 return etl::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), lhs.value_comp());
531 }
532
533 //*************************************************************************
539 //*************************************************************************
540 template <typename TKey, typename TKeyCompare>
541 ETL_CONSTEXPR14 bool operator>(const etl::iconst_multiset<TKey, TKeyCompare>& lhs, const etl::iconst_multiset<TKey, TKeyCompare>& rhs) ETL_NOEXCEPT
542 {
543 return (rhs < lhs);
544 }
545
546 //*************************************************************************
553 //*************************************************************************
554 template <typename TKey, typename TKeyCompare>
556 {
557 return !(rhs < lhs);
558 }
559
560 //*************************************************************************
566 //*************************************************************************
567 template <typename TKey, typename TKeyCompare>
569 {
570 return !(lhs < rhs);
571 }
572} // namespace etl
573
574#endif
ETL_CONSTEXPR14 const_multiset_ext(const etl::span< const value_type, Size > &sp) ETL_NOEXCEPT
Construct a const_multiset from a variadic list of elements.
Definition const_multiset.h:476
ETL_CONSTEXPR14 const_multiset_ext() ETL_NOEXCEPT
Default construct a const_multiset.
Definition const_multiset.h:467
ETL_CONSTEXPR14 const_multiset_ext(const value_type(&begin_)[Size]) ETL_NOEXCEPT
Construct a const_multiset from an array.
Definition const_multiset.h:485
Multiset type designed for constexpr.
Definition const_multiset.h:400
ETL_CONSTEXPR14 const_multiset(TElements &&... elements) ETL_NOEXCEPT
Construct a const_set from a variadic list of elements. Static asserts if the element type is not con...
Definition const_multiset.h:423
Definition const_multiset.h:55
ETL_CONSTEXPR14 const_iterator cbegin() const ETL_NOEXCEPT
Gets the beginning of the multiset.
Definition const_multiset.h:90
ETL_CONSTEXPR14 size_type size() const ETL_NOEXCEPT
Definition const_multiset.h:312
ETL_CONSTEXPR14 bool is_valid() const ETL_NOEXCEPT
Definition const_multiset.h:72
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_multiset.h:258
ETL_CONSTEXPR14 const_iterator find(const K &key) const ETL_NOEXCEPT
Gets a const_iterator to the value at the key index. Enabled if the comparator is transparent.
Definition const_multiset.h:148
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_multiset.h:285
ETL_CONSTEXPR14 size_type full() const ETL_NOEXCEPT
Definition const_multiset.h:303
ETL_CONSTEXPR14 value_compare value_comp() const ETL_NOEXCEPT
Definition const_multiset.h:349
ETL_CONSTEXPR14 bool contains(const K &key) const ETL_NOEXCEPT
Checks if the multiset contains an element with key. Enabled if the comparator is transparent.
Definition const_multiset.h:177
ETL_CONSTEXPR14 const_iterator find(const key_type &key) const ETL_NOEXCEPT
Gets a const_iterator to the value at the key index.
Definition const_multiset.h:128
ETL_CONSTEXPR14 const_iterator begin() const ETL_NOEXCEPT
Gets the beginning of the multiset.
Definition const_multiset.h:81
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_multiset.h:231
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_multiset.h:216
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_multiset.h:244
ETL_CONSTEXPR14 size_type count(const key_type &key) const ETL_NOEXCEPT
Counts the numbeer elements with key.
Definition const_multiset.h:187
ETL_CONSTEXPR14 const_iterator end() const ETL_NOEXCEPT
Gets the end of the multiset.
Definition const_multiset.h:99
ETL_CONSTEXPR14 key_compare key_comp() const ETL_NOEXCEPT
Definition const_multiset.h:340
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_multiset.h:271
ETL_CONSTEXPR14 iconst_multiset(const value_type *element_list_, size_type size_, size_type max_elements_) ETL_NOEXCEPT
Constructor.
Definition const_multiset.h:360
ETL_CONSTEXPR14 size_type empty() const ETL_NOEXCEPT
Definition const_multiset.h:294
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_multiset.h:201
ETL_CONSTEXPR14 size_type max_size() const ETL_NOEXCEPT
Definition const_multiset.h:321
ETL_CONSTEXPR14 const_iterator cend() const ETL_NOEXCEPT
Gets the end of the multiset.
Definition const_multiset.h:108
ETL_CONSTEXPR14 const_pointer data() const ETL_NOEXCEPT
Gets the beginning of the multiset.
Definition const_multiset.h:117
ETL_CONSTEXPR14 bool contains(const key_type &key) const ETL_NOEXCEPT
Checks if the multiset contains an element with key.
Definition const_multiset.h:165
ETL_CONSTEXPR14 size_type capacity() const ETL_NOEXCEPT
Definition const_multiset.h:331
Span - Fixed Extent.
Definition span.h:208
ETL_NODISCARD ETL_CONSTEXPR14 bool is_sorted(TIterator begin, TIterator end)
Definition algorithm.h:1660
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1081
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1133
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1147
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1106
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1120