Embedded Template Library 1.0
Loading...
Searching...
No Matches
flat_set.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) 2015 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_FLAT_SET_INCLUDED
32#define ETL_FLAT_SET_INCLUDED
33
34#include "platform.h"
35#include "initializer_list.h"
36#include "nth_type.h"
37#include "placement_new.h"
38#include "pool.h"
39#include "reference_flat_set.h"
40#include "type_traits.h"
41
43
44//*****************************************************************************
50//*****************************************************************************
51
52namespace etl
53{
54 //***************************************************************************
59 //***************************************************************************
60 template <typename T, typename TKeyCompare = etl::less<T> >
61 class iflat_set : private etl::ireference_flat_set<T, TKeyCompare>
62 {
63 private:
64
66 typedef typename refset_t::lookup_t lookup_t;
67 typedef etl::ipool storage_t;
68
69 typedef const T& key_parameter_t;
70
71 public:
72
73 typedef T key_type;
74 typedef T value_type;
75 typedef TKeyCompare key_compare;
76 typedef value_type& reference;
77 typedef const value_type& const_reference;
78#if ETL_USING_CPP11
79 typedef value_type&& rvalue_reference;
80#endif
81 typedef value_type* pointer;
82 typedef const value_type* const_pointer;
83 typedef size_t size_type;
84
85 typedef typename refset_t::iterator iterator;
86 typedef typename refset_t::const_iterator const_iterator;
87
88 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
89 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
90 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
91
92 public:
93
94 //*********************************************************************
97 //*********************************************************************
98 iterator begin()
99 {
100 return refset_t::begin();
101 }
102
103 //*********************************************************************
106 //*********************************************************************
107 const_iterator begin() const
108 {
109 return refset_t::begin();
110 }
111
112 //*********************************************************************
115 //*********************************************************************
116 iterator end()
117 {
118 return refset_t::end();
119 }
120
121 //*********************************************************************
124 //*********************************************************************
125 const_iterator end() const
126 {
127 return refset_t::end();
128 }
129
130 //*********************************************************************
133 //*********************************************************************
134 const_iterator cbegin() const
135 {
136 return refset_t::cbegin();
137 }
138
139 //*********************************************************************
142 //*********************************************************************
143 const_iterator cend() const
144 {
145 return refset_t::cend();
146 }
147
148 //*********************************************************************
151 //*********************************************************************
152 reverse_iterator rbegin()
153 {
154 return refset_t::rbegin();
155 }
156
157 //*********************************************************************
161 //*********************************************************************
162 const_reverse_iterator rbegin() const
163 {
164 return refset_t::rbegin();
165 }
166
167 //*********************************************************************
170 //*********************************************************************
171 reverse_iterator rend()
172 {
173 return refset_t::rend();
174 }
175
176 //*********************************************************************
179 //*********************************************************************
180 const_reverse_iterator rend() const
181 {
182 return refset_t::rend();
183 }
184
185 //*********************************************************************
189 //*********************************************************************
190 const_reverse_iterator crbegin() const
191 {
192 return refset_t::crbegin();
193 }
194
195 //*********************************************************************
198 //*********************************************************************
199 const_reverse_iterator crend() const
200 {
201 return refset_t::crend();
202 }
203
204 //*********************************************************************
211 //*********************************************************************
212 template <typename TIterator>
213 void assign(TIterator first, TIterator last)
214 {
215#if ETL_IS_DEBUG_BUILD
216 difference_type d = etl::distance(first, last);
217 ETL_ASSERT(d <= difference_type(capacity()), ETL_ERROR(flat_set_full));
218#endif
219
220 clear();
221
222 while (first != last)
223 {
224 insert(*first);
225 ++first;
226 }
227 }
228
229 //*********************************************************************
234 //*********************************************************************
235 ETL_OR_STD::pair<iterator, bool> insert(const_reference value)
236 {
237 iterator i_element = lower_bound(value);
238
239 ETL_OR_STD::pair<iterator, bool> result(i_element, false);
240
241 // Doesn't already exist?
242 if ((i_element == end()) || compare(value, *i_element))
243 {
245
246 value_type* pvalue = storage.allocate<value_type>();
247 ::new (pvalue) value_type(value);
248 ETL_INCREMENT_DEBUG_COUNT;
249 result = refset_t::insert_at(i_element, *pvalue);
250 }
251
252 return result;
253 }
254
255#if ETL_USING_CPP11
256 //*********************************************************************
261 //*********************************************************************
262 ETL_OR_STD::pair<iterator, bool> insert(rvalue_reference value)
263 {
264 iterator i_element = lower_bound(value);
265
266 ETL_OR_STD::pair<iterator, bool> result(i_element, false);
267
268 // Doesn't already exist?
269 if ((i_element == end()) || compare(value, *i_element))
270 {
272
273 value_type* pvalue = storage.allocate<value_type>();
274 ::new (pvalue) value_type(etl::move(value));
275 ETL_INCREMENT_DEBUG_COUNT;
276 result = refset_t::insert_at(i_element, *pvalue);
277 }
278
279 return result;
280 }
281#endif
282
283 //*********************************************************************
289 //*********************************************************************
290 iterator insert(const_iterator /*position*/, const_reference value)
291 {
292 return insert(value).first;
293 }
294
295#if ETL_USING_CPP11
296 //*********************************************************************
302 //*********************************************************************
303 iterator insert(const_iterator /*position*/, rvalue_reference value)
304 {
305 return insert(etl::move(value)).first;
306 }
307#endif
308
309 //*********************************************************************
316 //*********************************************************************
317 template <class TIterator>
318 void insert(TIterator first, TIterator last)
319 {
320 while (first != last)
321 {
322 insert(*first);
323 ++first;
324 }
325 }
326
327 //*************************************************************************
329 //*************************************************************************
330 ETL_OR_STD::pair<iterator, bool> emplace(const_reference value)
331 {
332 return insert(value);
333 }
334
335 //*************************************************************************
337 //*************************************************************************
338#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_FLAT_SET_FORCE_CPP03_IMPLEMENTATION)
339 template <typename... Args>
340 ETL_OR_STD::pair<iterator, bool> emplace(Args&&... args)
341 {
342 if (full())
343 {
344 // A duplicate key does not require a free slot, so emplacing it is not
345 // a capacity failure. Construct a temporary to obtain its key and only
346 // emit flat_set_full if the key is not already present. This keeps
347 // emplace consistent with insert when the set is full.
348 value_type temp_value(etl::forward<Args>(args)...);
349 iterator position = find(temp_value);
350
351 if (position == end())
352 {
353 ETL_ASSERT_FAIL(ETL_ERROR(flat_set_full));
354 return ETL_OR_STD::pair<iterator, bool>(end(), false);
355 }
356
357 return ETL_OR_STD::pair<iterator, bool>(position, false);
358 }
359
360 ETL_OR_STD::pair<iterator, bool> result;
361
362 // Create it.
363 value_type* pvalue = storage.allocate<value_type>();
364 ::new (pvalue) value_type(etl::forward<Args>(args)...);
365
366 iterator i_element = lower_bound(*pvalue);
367
368 // Doesn't already exist?
369 if ((i_element == end()) || compare(*pvalue, *i_element))
370 {
371 ETL_INCREMENT_DEBUG_COUNT;
372 result = refset_t::insert_at(i_element, *pvalue);
373 }
374 else
375 {
376 // Destroy it.
377 pvalue->~value_type();
378 storage.release(pvalue);
379 result = ETL_OR_STD::pair<iterator, bool>(i_element, false);
380 }
381
382 return result;
383 }
384#else
385 //*************************************************************************
387 //*************************************************************************
388 ETL_OR_STD::pair<iterator, bool> emplace()
389 {
390 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
391
392 ETL_OR_STD::pair<iterator, bool> result;
393
394 // Create it.
395 value_type* pvalue = storage.allocate<value_type>();
396 ::new (pvalue) value_type();
397
398 iterator i_element = lower_bound(*pvalue);
399
400 // Doesn't already exist?
401 if ((i_element == end()) || compare(*pvalue, *i_element))
402 {
403 ETL_INCREMENT_DEBUG_COUNT;
404 result = refset_t::insert_at(i_element, *pvalue);
405 }
406 else
407 {
408 // Destroy it.
409 pvalue->~value_type();
410 storage.release(pvalue);
411 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
412 }
413
414 return result;
415 }
416
417 //*************************************************************************
419 //*************************************************************************
420 template <typename T1>
421 ETL_OR_STD::pair<iterator, bool> emplace(const T1& value1)
422 {
423 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
424
425 ETL_OR_STD::pair<iterator, bool> result;
426
427 // Create it.
428 value_type* pvalue = storage.allocate<value_type>();
429 ::new (pvalue) value_type(value1);
430
431 iterator i_element = lower_bound(*pvalue);
432
433 // Doesn't already exist?
434 if ((i_element == end()) || compare(*pvalue, *i_element))
435 {
436 ETL_INCREMENT_DEBUG_COUNT;
437 result = refset_t::insert_at(i_element, *pvalue);
438 }
439 else
440 {
441 // Destroy it.
442 pvalue->~value_type();
443 storage.release(pvalue);
444 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
445 }
446
447 return result;
448 }
449
450 //*************************************************************************
452 //*************************************************************************
453 template <typename T1, typename T2>
454 ETL_OR_STD::pair<iterator, bool> emplace(const T1& value1, const T2& value2)
455 {
456 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
457
458 ETL_OR_STD::pair<iterator, bool> result;
459
460 // Create it.
461 value_type* pvalue = storage.allocate<value_type>();
462 ::new (pvalue) value_type(value1, value2);
463
464 iterator i_element = lower_bound(*pvalue);
465
466 // Doesn't already exist?
467 if ((i_element == end()) || compare(*pvalue, *i_element))
468 {
469 ETL_INCREMENT_DEBUG_COUNT;
470 result = refset_t::insert_at(i_element, *pvalue);
471 }
472 else
473 {
474 // Destroy it.
475 pvalue->~value_type();
476 storage.release(pvalue);
477 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
478 }
479
480 return result;
481 }
482
483 //*************************************************************************
485 //*************************************************************************
486 template <typename T1, typename T2, typename T3>
487 ETL_OR_STD::pair<iterator, bool> emplace(const T1& value1, const T2& value2, const T3& value3)
488 {
489 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
490
491 ETL_OR_STD::pair<iterator, bool> result;
492
493 // Create it.
494 value_type* pvalue = storage.allocate<value_type>();
495 ::new (pvalue) value_type(value1, value2, value3);
496
497 iterator i_element = lower_bound(*pvalue);
498
499 // Doesn't already exist?
500 if ((i_element == end()) || compare(*pvalue, *i_element))
501 {
502 ETL_INCREMENT_DEBUG_COUNT;
503 result = refset_t::insert_at(i_element, *pvalue);
504 }
505 else
506 {
507 // Destroy it.
508 pvalue->~value_type();
509 storage.release(pvalue);
510 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
511 }
512
513 return result;
514 }
515
516 //*************************************************************************
518 //*************************************************************************
519 template <typename T1, typename T2, typename T3, typename T4>
520 ETL_OR_STD::pair<iterator, bool> emplace(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
521 {
522 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
523
524 ETL_OR_STD::pair<iterator, bool> result;
525
526 // Create it.
527 value_type* pvalue = storage.allocate<value_type>();
528 ::new (pvalue) value_type(value1, value2, value3, value4);
529
530 iterator i_element = lower_bound(*pvalue);
531
532 // Doesn't already exist?
533 if ((i_element == end()) || compare(*pvalue, *i_element))
534 {
535 ETL_INCREMENT_DEBUG_COUNT;
536 result = refset_t::insert_at(i_element, *pvalue);
537 }
538 else
539 {
540 // Destroy it.
541 pvalue->~value_type();
542 storage.release(pvalue);
543 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
544 }
545
546 return result;
547 }
548#endif
549
550 //*********************************************************************
554 //*********************************************************************
555 size_t erase(key_parameter_t key)
556 {
557 iterator i_element = find(key);
558
559 if (i_element == end())
560 {
561 return 0;
562 }
563 else
564 {
565 etl::destroy_at(etl::addressof(*i_element));
566 storage.release(etl::addressof(*i_element));
567 refset_t::erase(i_element);
568 ETL_DECREMENT_DEBUG_COUNT;
569 return 1;
570 }
571 }
572
573#if ETL_USING_CPP11
574 //*********************************************************************
575 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
576 size_t erase(K&& key)
577 {
578 iterator i_element = find(etl::forward<K>(key));
579
580 if (i_element == end())
581 {
582 return 0;
583 }
584 else
585 {
586 etl::destroy_at(etl::addressof(*i_element));
587 storage.release(etl::addressof(*i_element));
588 refset_t::erase(i_element);
589 ETL_DECREMENT_DEBUG_COUNT;
590 return 1;
591 }
592 }
593#endif
594
595 //*********************************************************************
598 //*********************************************************************
599 iterator erase(iterator i_element)
600 {
601 etl::destroy_at(etl::addressof(*i_element));
602 storage.release(etl::addressof(*i_element));
603 ETL_DECREMENT_DEBUG_COUNT;
604 return refset_t::erase(i_element);
605 }
606
607 //*********************************************************************
610 //*********************************************************************
611 iterator erase(const_iterator i_element)
612 {
613 etl::destroy_at(etl::addressof(*i_element));
614 storage.release(etl::addressof(*i_element));
615 ETL_DECREMENT_DEBUG_COUNT;
616 return refset_t::erase(i_element);
617 }
618
619 //*********************************************************************
625 //*********************************************************************
626 iterator erase(const_iterator first, const_iterator last)
627 {
628 const_iterator itr = first;
629
630 while (itr != last)
631 {
633 storage.release(etl::addressof(*itr));
634 ++itr;
635 ETL_DECREMENT_DEBUG_COUNT;
636 }
637
638 return refset_t::erase(first, last);
639 }
640
641 //*************************************************************************
643 //*************************************************************************
644 void clear()
645 {
646 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<value_type>::value)
647 {
648 storage.release_all();
649 }
650 else
651 {
652 iterator itr = begin();
653
654 while (itr != end())
655 {
657 storage.release(etl::addressof(*itr));
658 ++itr;
659 ETL_DECREMENT_DEBUG_COUNT;
660 }
661 }
662
663 ETL_RESET_DEBUG_COUNT;
665 }
666
667 //*********************************************************************
671 //*********************************************************************
672 iterator find(key_parameter_t key)
673 {
674 return refset_t::find(key);
675 }
676
677#if ETL_USING_CPP11
678 //*********************************************************************
679 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
680 iterator find(const K& key)
681 {
682 return refset_t::find(key);
683 }
684#endif
685
686 //*********************************************************************
690 //*********************************************************************
691 const_iterator find(key_parameter_t key) const
692 {
693 return refset_t::find(key);
694 }
695
696#if ETL_USING_CPP11
697 //*********************************************************************
698 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
699 const_iterator find(const K& key) const
700 {
701 return refset_t::find(key);
702 }
703#endif
704
705 //*********************************************************************
709 //*********************************************************************
710 size_t count(key_parameter_t key) const
711 {
712 return refset_t::count(key);
713 }
714
715#if ETL_USING_CPP11
716 //*********************************************************************
717 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
718 size_t count(const K& key) const
719 {
720 return refset_t::count(key);
721 }
722#endif
723
724 //*********************************************************************
728 //*********************************************************************
729 iterator lower_bound(key_parameter_t key)
730 {
731 return refset_t::lower_bound(key);
732 }
733
734#if ETL_USING_CPP11
735 //*********************************************************************
736 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
737 iterator lower_bound(const K& key)
738 {
739 return refset_t::lower_bound(key);
740 }
741#endif
742
743 //*********************************************************************
747 //*********************************************************************
748 const_iterator lower_bound(key_parameter_t key) const
749 {
750 return refset_t::lower_bound(key);
751 }
752
753#if ETL_USING_CPP11
754 //*********************************************************************
755 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
756 const_iterator lower_bound(const K& key) const
757 {
758 return refset_t::lower_bound(key);
759 }
760#endif
761
762 //*********************************************************************
766 //*********************************************************************
767 iterator upper_bound(key_parameter_t key)
768 {
769 return refset_t::upper_bound(key);
770 }
771
772#if ETL_USING_CPP11
773 //*********************************************************************
774 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
775 iterator upper_bound(const K& key)
776 {
777 return refset_t::upper_bound(key);
778 }
779#endif
780
781 //*********************************************************************
785 //*********************************************************************
786 const_iterator upper_bound(key_parameter_t key) const
787 {
788 return refset_t::upper_bound(key);
789 }
790
791#if ETL_USING_CPP11
792 //*********************************************************************
793 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
794 const_iterator upper_bound(const K& key) const
795 {
796 return refset_t::upper_bound(key);
797 }
798#endif
799
800 //*********************************************************************
804 //*********************************************************************
805 ETL_OR_STD::pair<iterator, iterator> equal_range(key_parameter_t key)
806 {
807 return refset_t::equal_range(key);
808 }
809
810#if ETL_USING_CPP11
811 //*********************************************************************
812 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
813 ETL_OR_STD::pair<iterator, iterator> equal_range(const K& key)
814 {
815 return refset_t::equal_range(key);
816 }
817#endif
818
819 //*********************************************************************
823 //*********************************************************************
824 ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(key_parameter_t key) const
825 {
826 return refset_t::upper_bound(key);
827 }
828
829#if ETL_USING_CPP11
830 //*********************************************************************
831 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
832 ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(const K& key) const
833 {
834 return refset_t::upper_bound(key);
835 }
836#endif
837
838 //*************************************************************************
840 //*************************************************************************
841 bool contains(key_parameter_t key) const
842 {
843 return find(key) != end();
844 }
845
846#if ETL_USING_CPP11
847 //*************************************************************************
848 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
849 bool contains(const K& k) const
850 {
851 return find(k) != end();
852 }
853#endif
854
855 //*************************************************************************
857 //*************************************************************************
859 {
860 if (&rhs != this)
861 {
862 assign(rhs.cbegin(), rhs.cend());
863 }
864
865 return *this;
866 }
867
868#if ETL_USING_CPP11
869 //*************************************************************************
871 //*************************************************************************
873 {
874 move_container(etl::move(rhs));
875
876 return *this;
877 }
878#endif
879
880 //*************************************************************************
883 //*************************************************************************
884 size_type size() const
885 {
886 return refset_t::size();
887 }
888
889 //*************************************************************************
892 //*************************************************************************
893 bool empty() const
894 {
895 return refset_t::empty();
896 }
897
898 //*************************************************************************
901 //*************************************************************************
902 bool full() const
903 {
904 return refset_t::full();
905 }
906
907 //*************************************************************************
910 //*************************************************************************
911 size_type capacity() const
912 {
913 return refset_t::capacity();
914 }
915
916 //*************************************************************************
919 //*************************************************************************
920 size_type max_size() const
921 {
922 return refset_t::max_size();
923 }
924
925 //*************************************************************************
928 //*************************************************************************
929 size_t available() const
930 {
931 return refset_t::available();
932 }
933
934 protected:
935
936 //*********************************************************************
938 //*********************************************************************
939 iflat_set(lookup_t& lookup_, storage_t& storage_)
940 : refset_t(lookup_)
941 , storage(storage_)
942 {
943 }
944
945#if ETL_USING_CPP11
946 //*************************************************************************
949 //*************************************************************************
950 void move_container(iflat_set&& rhs)
951 {
952 if (&rhs != this)
953 {
954 this->clear();
955
956 etl::iflat_set<T, TKeyCompare>::iterator first = rhs.begin();
957 etl::iflat_set<T, TKeyCompare>::iterator last = rhs.end();
958
959 // Move all of the elements.
960 while (first != last)
961 {
962 typename etl::iflat_set<T, TKeyCompare>::iterator temp = first;
963 ++temp;
964
965 this->insert(etl::move(*first));
966 first = temp;
967 }
968 }
969 }
970#endif
971
972 private:
973
974 // Disable copy construction.
975 iflat_set(const iflat_set&);
976
977 storage_t& storage;
978
979 TKeyCompare compare;
980
982 ETL_DECLARE_DEBUG_COUNT;
983
984 //*************************************************************************
986 //*************************************************************************
987#if defined(ETL_POLYMORPHIC_FLAT_SET) || defined(ETL_POLYMORPHIC_CONTAINERS)
988
989 public:
990
991 virtual ~iflat_set() {}
992#else
993
994 protected:
995
997#endif
998 };
999
1000 //***************************************************************************
1006 //***************************************************************************
1007 template <typename T, typename TKeyCompare>
1009 {
1010 return (lhs.size() == rhs.size()) && etl::equal(lhs.begin(), lhs.end(), rhs.begin());
1011 }
1012
1013 //***************************************************************************
1019 //***************************************************************************
1020 template <typename T, typename TKeyCompare>
1022 {
1023 return !(lhs == rhs);
1024 }
1025
1026 //***************************************************************************
1032 //***************************************************************************
1033 template <typename T, const size_t MAX_SIZE_, typename TCompare = etl::less<T> >
1034 class flat_set : public etl::iflat_set<T, TCompare>
1035 {
1036 public:
1037
1038 static ETL_CONSTANT size_t MAX_SIZE = MAX_SIZE_;
1039
1040 //*************************************************************************
1042 //*************************************************************************
1044 : etl::iflat_set<T, TCompare>(lookup, storage)
1045 {
1046 }
1047
1048 //*************************************************************************
1050 //*************************************************************************
1051 flat_set(const flat_set& other)
1052 : etl::iflat_set<T, TCompare>(lookup, storage)
1053 {
1054 this->assign(other.cbegin(), other.cend());
1055 }
1056
1057#if ETL_USING_CPP11
1058 //*************************************************************************
1060 //*************************************************************************
1061 flat_set(flat_set&& other)
1062 : etl::iflat_set<T, TCompare>(lookup, storage)
1063 {
1064 if (&other != this)
1065 {
1066 this->move_container(etl::move(other));
1067 }
1068 }
1069#endif
1070
1071 //*************************************************************************
1076 //*************************************************************************
1077 template <typename TIterator>
1078 flat_set(TIterator first, TIterator last)
1079 : etl::iflat_set<T, TCompare>(lookup, storage)
1080 {
1081 this->assign(first, last);
1082 }
1083
1084#if ETL_HAS_INITIALIZER_LIST
1085 //*************************************************************************
1087 //*************************************************************************
1088 flat_set(std::initializer_list<T> init)
1089 : etl::iflat_set<T, TCompare>(lookup, storage)
1090 {
1091 this->assign(init.begin(), init.end());
1092 }
1093#endif
1094
1095 //*************************************************************************
1097 //*************************************************************************
1099 {
1100 this->clear();
1101 }
1102
1103 //*************************************************************************
1105 //*************************************************************************
1107 {
1108 if (&rhs != this)
1109 {
1110 this->assign(rhs.cbegin(), rhs.cend());
1111 }
1112
1113 return *this;
1114 }
1115
1116#if ETL_USING_CPP11
1117 //*************************************************************************
1119 //*************************************************************************
1121 {
1122 if (&rhs != this)
1123 {
1124 this->move_container(etl::move(rhs));
1125 }
1126
1127 return *this;
1128 }
1129#endif
1130
1131 private:
1132
1133 typedef typename etl::iflat_set<T, TCompare>::value_type node_t;
1134
1135 // The pool of nodes.
1136 etl::pool<node_t, MAX_SIZE> storage;
1137
1138 // The vector that stores pointers to the nodes.
1139 etl::vector<node_t*, MAX_SIZE> lookup;
1140 };
1141
1142 template <typename T, const size_t MAX_SIZE_, typename TCompare>
1143 ETL_CONSTANT size_t flat_set<T, MAX_SIZE_, TCompare>::MAX_SIZE;
1144
1145 //*************************************************************************
1147 //*************************************************************************
1148#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1149 template <typename... T>
1150 flat_set(T...) -> flat_set<etl::nth_type_t<0, T...>, sizeof...(T)>;
1151#endif
1152
1153 //*************************************************************************
1155 //*************************************************************************
1156#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1157 template <typename TKey, typename TKeyCompare = etl::less<TKey>, typename... T>
1158 constexpr auto make_flat_set(T&&... keys) -> etl::flat_set<TKey, sizeof...(T), TKeyCompare>
1159 {
1160 return {etl::forward<T>(keys)...};
1161 }
1162#endif
1163} // namespace etl
1164
1165#endif
Definition reference_flat_set.h:71
Definition reference_flat_set.h:102
size_type capacity() const
Definition reference_flat_set.h:852
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, reference value)
Definition reference_flat_set.h:890
size_t available() const
Definition reference_flat_set.h:870
iterator upper_bound(parameter_t key)
Definition reference_flat_set.h:733
const_reverse_iterator crbegin() const
Definition reference_flat_set.h:404
iterator begin()
Definition reference_flat_set.h:308
size_t erase(parameter_t key)
Definition reference_flat_set.h:505
iterator end()
Definition reference_flat_set.h:326
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition reference_flat_set.h:771
const_iterator cend() const
Definition reference_flat_set.h:353
const_iterator cbegin() const
Definition reference_flat_set.h:344
iterator find(parameter_t key)
Definition reference_flat_set.h:582
size_type max_size() const
Definition reference_flat_set.h:861
const_reverse_iterator crend() const
Definition reference_flat_set.h:414
bool empty() const
Definition reference_flat_set.h:834
size_type size() const
Definition reference_flat_set.h:825
reverse_iterator rbegin()
Definition reference_flat_set.h:363
size_t count(parameter_t key) const
Definition reference_flat_set.h:676
bool full() const
Definition reference_flat_set.h:843
void clear()
Definition reference_flat_set.h:572
iterator lower_bound(parameter_t key)
Definition reference_flat_set.h:695
reverse_iterator rend()
Definition reference_flat_set.h:383
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
const_iterator cbegin() const
Definition flat_set.h:134
iterator insert(const_iterator, const_reference value)
Definition flat_set.h:290
~iflat_set()
Destructor.
Definition flat_set.h:996
iterator upper_bound(key_parameter_t key)
Definition flat_set.h:767
size_t available() const
Definition flat_set.h:929
flat_set()
Constructor.
Definition flat_set.h:1043
size_t erase(key_parameter_t key)
Definition flat_set.h:555
iterator begin()
Definition flat_set.h:98
iflat_set(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition flat_set.h:939
const_iterator begin() const
Definition flat_set.h:107
const_reverse_iterator crbegin() const
Definition flat_set.h:190
iterator erase(iterator i_element)
Definition flat_set.h:599
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1)
Emplaces a value to the set.
Definition flat_set.h:421
size_type max_size() const
Definition flat_set.h:920
iterator find(key_parameter_t key)
Definition flat_set.h:672
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition flat_set.h:805
size_type capacity() const
Definition flat_set.h:911
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Emplaces a value to the set.
Definition flat_set.h:520
size_t count(key_parameter_t key) const
Definition flat_set.h:710
ETL_OR_STD::pair< iterator, bool > emplace(const_reference value)
Emplaces a value to the set.
Definition flat_set.h:330
iterator erase(const_iterator first, const_iterator last)
Definition flat_set.h:626
iterator lower_bound(key_parameter_t key)
Definition flat_set.h:729
ETL_OR_STD::pair< iterator, bool > emplace()
Emplaces a value to the set.
Definition flat_set.h:388
bool empty() const
Definition flat_set.h:893
const_iterator find(key_parameter_t key) const
Definition flat_set.h:691
~flat_set()
Destructor.
Definition flat_set.h:1098
iflat_set & operator=(const iflat_set &rhs)
Assignment operator.
Definition flat_set.h:858
const_iterator end() const
Definition flat_set.h:125
bool full() const
Definition flat_set.h:902
iterator end()
Definition flat_set.h:116
bool contains(key_parameter_t key) const
Check if the map contains the key.
Definition flat_set.h:841
iterator erase(const_iterator i_element)
Definition flat_set.h:611
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition flat_set.h:235
const_reverse_iterator rbegin() const
Definition flat_set.h:162
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2)
Emplaces a value to the set.
Definition flat_set.h:454
void insert(TIterator first, TIterator last)
Definition flat_set.h:318
const_reverse_iterator crend() const
Definition flat_set.h:199
void assign(TIterator first, TIterator last)
Definition flat_set.h:213
reverse_iterator rend()
Definition flat_set.h:171
flat_set & operator=(const flat_set &rhs)
Assignment operator.
Definition flat_set.h:1106
flat_set(const flat_set &other)
Copy constructor.
Definition flat_set.h:1051
size_type size() const
Definition flat_set.h:884
const_iterator lower_bound(key_parameter_t key) const
Definition flat_set.h:748
reverse_iterator rbegin()
Definition flat_set.h:152
const_iterator upper_bound(key_parameter_t key) const
Definition flat_set.h:786
const_reverse_iterator rend() const
Definition flat_set.h:180
const_iterator cend() const
Definition flat_set.h:143
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition flat_set.h:824
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2, const T3 &value3)
Emplaces a value to the set.
Definition flat_set.h:487
flat_set(TIterator first, TIterator last)
Definition flat_set.h:1078
void clear()
Clears the flat_set.
Definition flat_set.h:644
Definition flat_set.h:1035
Definition flat_set.h:62
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
etl::enable_if< etl::is_trivially_destructible< T >::value, void >::type destroy_at(T *)
Definition memory.h:1819
T * allocate()
Definition ipool.h:334
void release(const void *const p_object)
Definition ipool.h:461
Definition ipool.h:110
Definition absolute.h:40
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1078
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1090
Definition compare.h:51
iterator
Definition iterator.h:482