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 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
343
344 ETL_OR_STD::pair<iterator, bool> result;
345
346 // Create it.
347 value_type* pvalue = storage.allocate<value_type>();
348 ::new (pvalue) value_type(etl::forward<Args>(args)...);
349
350 iterator i_element = lower_bound(*pvalue);
351
352 // Doesn't already exist?
353 if ((i_element == end()) || compare(*pvalue, *i_element))
354 {
355 ETL_INCREMENT_DEBUG_COUNT;
356 result = refset_t::insert_at(i_element, *pvalue);
357 }
358 else
359 {
360 // Destroy it.
361 pvalue->~value_type();
362 storage.release(pvalue);
363 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
364 }
365
366 return result;
367 }
368#else
369 //*************************************************************************
371 //*************************************************************************
372 ETL_OR_STD::pair<iterator, bool> emplace()
373 {
374 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
375
376 ETL_OR_STD::pair<iterator, bool> result;
377
378 // Create it.
379 value_type* pvalue = storage.allocate<value_type>();
380 ::new (pvalue) value_type();
381
382 iterator i_element = lower_bound(*pvalue);
383
384 // Doesn't already exist?
385 if ((i_element == end()) || compare(*pvalue, *i_element))
386 {
387 ETL_INCREMENT_DEBUG_COUNT;
388 result = refset_t::insert_at(i_element, *pvalue);
389 }
390 else
391 {
392 // Destroy it.
393 pvalue->~value_type();
394 storage.release(pvalue);
395 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
396 }
397
398 return result;
399 }
400
401 //*************************************************************************
403 //*************************************************************************
404 template <typename T1>
405 ETL_OR_STD::pair<iterator, bool> emplace(const T1& value1)
406 {
407 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
408
409 ETL_OR_STD::pair<iterator, bool> result;
410
411 // Create it.
412 value_type* pvalue = storage.allocate<value_type>();
413 ::new (pvalue) value_type(value1);
414
415 iterator i_element = lower_bound(*pvalue);
416
417 // Doesn't already exist?
418 if ((i_element == end()) || compare(*pvalue, *i_element))
419 {
420 ETL_INCREMENT_DEBUG_COUNT;
421 result = refset_t::insert_at(i_element, *pvalue);
422 }
423 else
424 {
425 // Destroy it.
426 pvalue->~value_type();
427 storage.release(pvalue);
428 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
429 }
430
431 return result;
432 }
433
434 //*************************************************************************
436 //*************************************************************************
437 template <typename T1, typename T2>
438 ETL_OR_STD::pair<iterator, bool> emplace(const T1& value1, const T2& value2)
439 {
440 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
441
442 ETL_OR_STD::pair<iterator, bool> result;
443
444 // Create it.
445 value_type* pvalue = storage.allocate<value_type>();
446 ::new (pvalue) value_type(value1, value2);
447
448 iterator i_element = lower_bound(*pvalue);
449
450 // Doesn't already exist?
451 if ((i_element == end()) || compare(*pvalue, *i_element))
452 {
453 ETL_INCREMENT_DEBUG_COUNT;
454 result = refset_t::insert_at(i_element, *pvalue);
455 }
456 else
457 {
458 // Destroy it.
459 pvalue->~value_type();
460 storage.release(pvalue);
461 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
462 }
463
464 return result;
465 }
466
467 //*************************************************************************
469 //*************************************************************************
470 template <typename T1, typename T2, typename T3>
471 ETL_OR_STD::pair<iterator, bool> emplace(const T1& value1, const T2& value2, const T3& value3)
472 {
473 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
474
475 ETL_OR_STD::pair<iterator, bool> result;
476
477 // Create it.
478 value_type* pvalue = storage.allocate<value_type>();
479 ::new (pvalue) value_type(value1, value2, value3);
480
481 iterator i_element = lower_bound(*pvalue);
482
483 // Doesn't already exist?
484 if ((i_element == end()) || compare(*pvalue, *i_element))
485 {
486 ETL_INCREMENT_DEBUG_COUNT;
487 result = refset_t::insert_at(i_element, *pvalue);
488 }
489 else
490 {
491 // Destroy it.
492 pvalue->~value_type();
493 storage.release(pvalue);
494 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
495 }
496
497 return result;
498 }
499
500 //*************************************************************************
502 //*************************************************************************
503 template <typename T1, typename T2, typename T3, typename T4>
504 ETL_OR_STD::pair<iterator, bool> emplace(const T1& value1, const T2& value2, const T3& value3, const T4& value4)
505 {
506 ETL_ASSERT(!full(), ETL_ERROR(flat_set_full));
507
508 ETL_OR_STD::pair<iterator, bool> result;
509
510 // Create it.
511 value_type* pvalue = storage.allocate<value_type>();
512 ::new (pvalue) value_type(value1, value2, value3, value4);
513
514 iterator i_element = lower_bound(*pvalue);
515
516 // Doesn't already exist?
517 if ((i_element == end()) || compare(*pvalue, *i_element))
518 {
519 ETL_INCREMENT_DEBUG_COUNT;
520 result = refset_t::insert_at(i_element, *pvalue);
521 }
522 else
523 {
524 // Destroy it.
525 pvalue->~value_type();
526 storage.release(pvalue);
527 result = ETL_OR_STD::pair<iterator, bool>(end(), false);
528 }
529
530 return result;
531 }
532#endif
533
534 //*********************************************************************
538 //*********************************************************************
539 size_t erase(key_parameter_t key)
540 {
541 iterator i_element = find(key);
542
543 if (i_element == end())
544 {
545 return 0;
546 }
547 else
548 {
549 etl::destroy_at(etl::addressof(*i_element));
550 storage.release(etl::addressof(*i_element));
551 refset_t::erase(i_element);
552 ETL_DECREMENT_DEBUG_COUNT;
553 return 1;
554 }
555 }
556
557#if ETL_USING_CPP11
558 //*********************************************************************
559 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
560 size_t erase(K&& key)
561 {
562 iterator i_element = find(etl::forward<K>(key));
563
564 if (i_element == end())
565 {
566 return 0;
567 }
568 else
569 {
570 etl::destroy_at(etl::addressof(*i_element));
571 storage.release(etl::addressof(*i_element));
572 refset_t::erase(i_element);
573 ETL_DECREMENT_DEBUG_COUNT;
574 return 1;
575 }
576 }
577#endif
578
579 //*********************************************************************
582 //*********************************************************************
583 iterator erase(iterator i_element)
584 {
585 etl::destroy_at(etl::addressof(*i_element));
586 storage.release(etl::addressof(*i_element));
587 ETL_DECREMENT_DEBUG_COUNT;
588 return refset_t::erase(i_element);
589 }
590
591 //*********************************************************************
594 //*********************************************************************
595 iterator erase(const_iterator i_element)
596 {
597 etl::destroy_at(etl::addressof(*i_element));
598 storage.release(etl::addressof(*i_element));
599 ETL_DECREMENT_DEBUG_COUNT;
600 return refset_t::erase(i_element);
601 }
602
603 //*********************************************************************
609 //*********************************************************************
610 iterator erase(const_iterator first, const_iterator last)
611 {
612 const_iterator itr = first;
613
614 while (itr != last)
615 {
617 storage.release(etl::addressof(*itr));
618 ++itr;
619 ETL_DECREMENT_DEBUG_COUNT;
620 }
621
622 return refset_t::erase(first, last);
623 }
624
625 //*************************************************************************
627 //*************************************************************************
628 void clear()
629 {
630 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<value_type>::value)
631 {
632 storage.release_all();
633 }
634 else
635 {
636 iterator itr = begin();
637
638 while (itr != end())
639 {
641 storage.release(etl::addressof(*itr));
642 ++itr;
643 ETL_DECREMENT_DEBUG_COUNT;
644 }
645 }
646
647 ETL_RESET_DEBUG_COUNT;
649 }
650
651 //*********************************************************************
655 //*********************************************************************
656 iterator find(key_parameter_t key)
657 {
658 return refset_t::find(key);
659 }
660
661#if ETL_USING_CPP11
662 //*********************************************************************
663 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
664 iterator find(const K& key)
665 {
666 return refset_t::find(key);
667 }
668#endif
669
670 //*********************************************************************
674 //*********************************************************************
675 const_iterator find(key_parameter_t key) const
676 {
677 return refset_t::find(key);
678 }
679
680#if ETL_USING_CPP11
681 //*********************************************************************
682 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
683 const_iterator find(const K& key) const
684 {
685 return refset_t::find(key);
686 }
687#endif
688
689 //*********************************************************************
693 //*********************************************************************
694 size_t count(key_parameter_t key) const
695 {
696 return refset_t::count(key);
697 }
698
699#if ETL_USING_CPP11
700 //*********************************************************************
701 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
702 size_t count(const K& key) const
703 {
704 return refset_t::count(key);
705 }
706#endif
707
708 //*********************************************************************
712 //*********************************************************************
713 iterator lower_bound(key_parameter_t key)
714 {
715 return refset_t::lower_bound(key);
716 }
717
718#if ETL_USING_CPP11
719 //*********************************************************************
720 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
721 iterator lower_bound(const K& key)
722 {
723 return refset_t::lower_bound(key);
724 }
725#endif
726
727 //*********************************************************************
731 //*********************************************************************
732 const_iterator lower_bound(key_parameter_t key) const
733 {
734 return refset_t::lower_bound(key);
735 }
736
737#if ETL_USING_CPP11
738 //*********************************************************************
739 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
740 const_iterator lower_bound(const K& key) const
741 {
742 return refset_t::lower_bound(key);
743 }
744#endif
745
746 //*********************************************************************
750 //*********************************************************************
751 iterator upper_bound(key_parameter_t key)
752 {
753 return refset_t::upper_bound(key);
754 }
755
756#if ETL_USING_CPP11
757 //*********************************************************************
758 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
759 iterator upper_bound(const K& key)
760 {
761 return refset_t::upper_bound(key);
762 }
763#endif
764
765 //*********************************************************************
769 //*********************************************************************
770 const_iterator upper_bound(key_parameter_t key) const
771 {
772 return refset_t::upper_bound(key);
773 }
774
775#if ETL_USING_CPP11
776 //*********************************************************************
777 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
778 const_iterator upper_bound(const K& key) const
779 {
780 return refset_t::upper_bound(key);
781 }
782#endif
783
784 //*********************************************************************
788 //*********************************************************************
789 ETL_OR_STD::pair<iterator, iterator> equal_range(key_parameter_t key)
790 {
791 return refset_t::equal_range(key);
792 }
793
794#if ETL_USING_CPP11
795 //*********************************************************************
796 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
797 ETL_OR_STD::pair<iterator, iterator> equal_range(const K& key)
798 {
799 return refset_t::equal_range(key);
800 }
801#endif
802
803 //*********************************************************************
807 //*********************************************************************
808 ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(key_parameter_t key) const
809 {
810 return refset_t::upper_bound(key);
811 }
812
813#if ETL_USING_CPP11
814 //*********************************************************************
815 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
816 ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(const K& key) const
817 {
818 return refset_t::upper_bound(key);
819 }
820#endif
821
822 //*************************************************************************
824 //*************************************************************************
825 bool contains(key_parameter_t key) const
826 {
827 return find(key) != end();
828 }
829
830#if ETL_USING_CPP11
831 //*************************************************************************
832 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
833 bool contains(const K& k) const
834 {
835 return find(k) != end();
836 }
837#endif
838
839 //*************************************************************************
841 //*************************************************************************
843 {
844 if (&rhs != this)
845 {
846 assign(rhs.cbegin(), rhs.cend());
847 }
848
849 return *this;
850 }
851
852#if ETL_USING_CPP11
853 //*************************************************************************
855 //*************************************************************************
857 {
858 move_container(etl::move(rhs));
859
860 return *this;
861 }
862#endif
863
864 //*************************************************************************
867 //*************************************************************************
868 size_type size() const
869 {
870 return refset_t::size();
871 }
872
873 //*************************************************************************
876 //*************************************************************************
877 bool empty() const
878 {
879 return refset_t::empty();
880 }
881
882 //*************************************************************************
885 //*************************************************************************
886 bool full() const
887 {
888 return refset_t::full();
889 }
890
891 //*************************************************************************
894 //*************************************************************************
895 size_type capacity() const
896 {
897 return refset_t::capacity();
898 }
899
900 //*************************************************************************
903 //*************************************************************************
904 size_type max_size() const
905 {
906 return refset_t::max_size();
907 }
908
909 //*************************************************************************
912 //*************************************************************************
913 size_t available() const
914 {
915 return refset_t::available();
916 }
917
918 protected:
919
920 //*********************************************************************
922 //*********************************************************************
923 iflat_set(lookup_t& lookup_, storage_t& storage_)
924 : refset_t(lookup_)
925 , storage(storage_)
926 {
927 }
928
929#if ETL_USING_CPP11
930 //*************************************************************************
933 //*************************************************************************
934 void move_container(iflat_set&& rhs)
935 {
936 if (&rhs != this)
937 {
938 this->clear();
939
940 etl::iflat_set<T, TKeyCompare>::iterator first = rhs.begin();
941 etl::iflat_set<T, TKeyCompare>::iterator last = rhs.end();
942
943 // Move all of the elements.
944 while (first != last)
945 {
946 typename etl::iflat_set<T, TKeyCompare>::iterator temp = first;
947 ++temp;
948
949 this->insert(etl::move(*first));
950 first = temp;
951 }
952 }
953 }
954#endif
955
956 private:
957
958 // Disable copy construction.
959 iflat_set(const iflat_set&);
960
961 storage_t& storage;
962
963 TKeyCompare compare;
964
966 ETL_DECLARE_DEBUG_COUNT;
967
968 //*************************************************************************
970 //*************************************************************************
971#if defined(ETL_POLYMORPHIC_FLAT_SET) || defined(ETL_POLYMORPHIC_CONTAINERS)
972
973 public:
974
975 virtual ~iflat_set() {}
976#else
977
978 protected:
979
981#endif
982 };
983
984 //***************************************************************************
990 //***************************************************************************
991 template <typename T, typename TKeyCompare>
993 {
994 return (lhs.size() == rhs.size()) && etl::equal(lhs.begin(), lhs.end(), rhs.begin());
995 }
996
997 //***************************************************************************
1003 //***************************************************************************
1004 template <typename T, typename TKeyCompare>
1006 {
1007 return !(lhs == rhs);
1008 }
1009
1010 //***************************************************************************
1016 //***************************************************************************
1017 template <typename T, const size_t MAX_SIZE_, typename TCompare = etl::less<T> >
1018 class flat_set : public etl::iflat_set<T, TCompare>
1019 {
1020 public:
1021
1022 static ETL_CONSTANT size_t MAX_SIZE = MAX_SIZE_;
1023
1024 //*************************************************************************
1026 //*************************************************************************
1028 : etl::iflat_set<T, TCompare>(lookup, storage)
1029 {
1030 }
1031
1032 //*************************************************************************
1034 //*************************************************************************
1035 flat_set(const flat_set& other)
1036 : etl::iflat_set<T, TCompare>(lookup, storage)
1037 {
1038 this->assign(other.cbegin(), other.cend());
1039 }
1040
1041#if ETL_USING_CPP11
1042 //*************************************************************************
1044 //*************************************************************************
1045 flat_set(flat_set&& other)
1046 : etl::iflat_set<T, TCompare>(lookup, storage)
1047 {
1048 if (&other != this)
1049 {
1050 this->move_container(etl::move(other));
1051 }
1052 }
1053#endif
1054
1055 //*************************************************************************
1060 //*************************************************************************
1061 template <typename TIterator>
1062 flat_set(TIterator first, TIterator last)
1063 : etl::iflat_set<T, TCompare>(lookup, storage)
1064 {
1065 this->assign(first, last);
1066 }
1067
1068#if ETL_HAS_INITIALIZER_LIST
1069 //*************************************************************************
1071 //*************************************************************************
1072 flat_set(std::initializer_list<T> init)
1073 : etl::iflat_set<T, TCompare>(lookup, storage)
1074 {
1075 this->assign(init.begin(), init.end());
1076 }
1077#endif
1078
1079 //*************************************************************************
1081 //*************************************************************************
1083 {
1084 this->clear();
1085 }
1086
1087 //*************************************************************************
1089 //*************************************************************************
1091 {
1092 if (&rhs != this)
1093 {
1094 this->assign(rhs.cbegin(), rhs.cend());
1095 }
1096
1097 return *this;
1098 }
1099
1100#if ETL_USING_CPP11
1101 //*************************************************************************
1103 //*************************************************************************
1105 {
1106 if (&rhs != this)
1107 {
1108 this->move_container(etl::move(rhs));
1109 }
1110
1111 return *this;
1112 }
1113#endif
1114
1115 private:
1116
1117 typedef typename etl::iflat_set<T, TCompare>::value_type node_t;
1118
1119 // The pool of nodes.
1120 etl::pool<node_t, MAX_SIZE> storage;
1121
1122 // The vector that stores pointers to the nodes.
1123 etl::vector<node_t*, MAX_SIZE> lookup;
1124 };
1125
1126 template <typename T, const size_t MAX_SIZE_, typename TCompare>
1127 ETL_CONSTANT size_t flat_set<T, MAX_SIZE_, TCompare>::MAX_SIZE;
1128
1129 //*************************************************************************
1131 //*************************************************************************
1132#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1133 template <typename... T>
1134 flat_set(T...) -> flat_set<etl::nth_type_t<0, T...>, sizeof...(T)>;
1135#endif
1136
1137 //*************************************************************************
1139 //*************************************************************************
1140#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1141 template <typename TKey, typename TKeyCompare = etl::less<TKey>, typename... T>
1142 constexpr auto make_flat_set(T&&... keys) -> etl::flat_set<TKey, sizeof...(T), TKeyCompare>
1143 {
1144 return {etl::forward<T>(keys)...};
1145 }
1146#endif
1147} // namespace etl
1148
1149#endif
Definition reference_flat_set.h:71
Definition reference_flat_set.h:102
size_type capacity() const
Definition reference_flat_set.h:840
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, reference value)
Definition reference_flat_set.h:878
size_t available() const
Definition reference_flat_set.h:858
iterator upper_bound(parameter_t key)
Definition reference_flat_set.h:721
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:493
iterator end()
Definition reference_flat_set.h:326
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition reference_flat_set.h:759
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:570
size_type max_size() const
Definition reference_flat_set.h:849
const_reverse_iterator crend() const
Definition reference_flat_set.h:414
bool empty() const
Definition reference_flat_set.h:822
size_type size() const
Definition reference_flat_set.h:813
reverse_iterator rbegin()
Definition reference_flat_set.h:363
size_t count(parameter_t key) const
Definition reference_flat_set.h:664
bool full() const
Definition reference_flat_set.h:831
void clear()
Definition reference_flat_set.h:560
iterator lower_bound(parameter_t key)
Definition reference_flat_set.h:683
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:980
iterator upper_bound(key_parameter_t key)
Definition flat_set.h:751
size_t available() const
Definition flat_set.h:913
flat_set()
Constructor.
Definition flat_set.h:1027
size_t erase(key_parameter_t key)
Definition flat_set.h:539
iterator begin()
Definition flat_set.h:98
iflat_set(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition flat_set.h:923
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:583
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1)
Emplaces a value to the set.
Definition flat_set.h:405
size_type max_size() const
Definition flat_set.h:904
iterator find(key_parameter_t key)
Definition flat_set.h:656
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition flat_set.h:789
size_type capacity() const
Definition flat_set.h:895
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:504
size_t count(key_parameter_t key) const
Definition flat_set.h:694
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:610
iterator lower_bound(key_parameter_t key)
Definition flat_set.h:713
ETL_OR_STD::pair< iterator, bool > emplace()
Emplaces a value to the set.
Definition flat_set.h:372
bool empty() const
Definition flat_set.h:877
const_iterator find(key_parameter_t key) const
Definition flat_set.h:675
~flat_set()
Destructor.
Definition flat_set.h:1082
iflat_set & operator=(const iflat_set &rhs)
Assignment operator.
Definition flat_set.h:842
const_iterator end() const
Definition flat_set.h:125
bool full() const
Definition flat_set.h:886
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:825
iterator erase(const_iterator i_element)
Definition flat_set.h:595
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:438
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:1090
flat_set(const flat_set &other)
Copy constructor.
Definition flat_set.h:1035
size_type size() const
Definition flat_set.h:868
const_iterator lower_bound(key_parameter_t key) const
Definition flat_set.h:732
reverse_iterator rbegin()
Definition flat_set.h:152
const_iterator upper_bound(key_parameter_t key) const
Definition flat_set.h:770
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:808
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:471
flat_set(TIterator first, TIterator last)
Definition flat_set.h:1062
void clear()
Clears the flat_set.
Definition flat_set.h:628
Definition flat_set.h:1019
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:1511
T * allocate()
Definition ipool.h:333
void release(const void *const p_object)
Definition ipool.h:460
Definition ipool.h:109
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
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
Definition compare.h:51
iterator
Definition iterator.h:424