31#ifndef ETL_FLAT_SET_INCLUDED
32#define ETL_FLAT_SET_INCLUDED
59 template <
typename T,
typename TKeyCompare = etl::less<T> >
65 typedef typename refset_t::lookup_t lookup_t;
68 typedef const T& key_parameter_t;
74 typedef TKeyCompare key_compare;
75 typedef value_type& reference;
76 typedef const value_type& const_reference;
78 typedef value_type&& rvalue_reference;
80 typedef value_type* pointer;
81 typedef const value_type* const_pointer;
82 typedef size_t size_type;
84 typedef typename refset_t::iterator iterator;
85 typedef typename refset_t::const_iterator const_iterator;
87 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
88 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
89 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
124 const_iterator
end()
const
178 const_reverse_iterator
rend()
const
196 const_reverse_iterator
crend()
const
208 template <
typename TIterator>
209 void assign(TIterator first, TIterator last)
211#if ETL_IS_DEBUG_BUILD
212 difference_type d = etl::distance(first, last);
218 while (first != last)
230 ETL_OR_STD::pair<iterator, bool>
insert(const_reference value)
234 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
237 if ((i_element ==
end()) || compare(value, *i_element))
241 value_type* pvalue = storage.allocate<value_type>();
242 ::new (pvalue) value_type(value);
243 ETL_INCREMENT_DEBUG_COUNT;
256 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
260 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
263 if ((i_element ==
end()) ||
compare(value, *i_element))
269 ETL_INCREMENT_DEBUG_COUNT;
283 iterator
insert(const_iterator , const_reference value)
285 return insert(value).first;
297 return insert(etl::move(value)).first;
308 template <
class TIterator>
309 void insert(TIterator first, TIterator last)
311 while (first != last)
321 ETL_OR_STD::pair<iterator, bool>
emplace(const_reference value)
329#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_FLAT_SET_FORCE_CPP03_IMPLEMENTATION)
330 template <
typename ... Args>
331 ETL_OR_STD::pair<iterator, bool>
emplace(Args && ... args)
335 ETL_OR_STD::pair<iterator, bool> result;
339 ::new (pvalue)
value_type(etl::forward<Args>(args)...);
344 if ((i_element ==
end()) ||
compare(*pvalue, *i_element))
346 ETL_INCREMENT_DEBUG_COUNT;
352 pvalue->~value_type();
354 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
367 ETL_OR_STD::pair<iterator, bool> result;
370 value_type* pvalue = storage.allocate<value_type>();
371 ::new (pvalue) value_type();
376 if ((i_element ==
end()) || compare(*pvalue, *i_element))
378 ETL_INCREMENT_DEBUG_COUNT;
384 pvalue->~value_type();
385 storage.release(pvalue);
386 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
395 template <
typename T1>
396 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1)
400 ETL_OR_STD::pair<iterator, bool> result;
403 value_type* pvalue = storage.allocate<value_type>();
404 ::new (pvalue) value_type(value1);
409 if ((i_element ==
end()) || compare(*pvalue, *i_element))
411 ETL_INCREMENT_DEBUG_COUNT;
417 pvalue->~value_type();
418 storage.release(pvalue);
419 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
428 template <
typename T1,
typename T2>
429 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2)
433 ETL_OR_STD::pair<iterator, bool> result;
436 value_type* pvalue = storage.allocate<value_type>();
437 ::new (pvalue) value_type(value1, value2);
442 if ((i_element ==
end()) || compare(*pvalue, *i_element))
444 ETL_INCREMENT_DEBUG_COUNT;
450 pvalue->~value_type();
451 storage.release(pvalue);
452 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
461 template <
typename T1,
typename T2,
typename T3>
462 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3)
466 ETL_OR_STD::pair<iterator, bool> result;
469 value_type* pvalue = storage.allocate<value_type>();
470 ::new (pvalue) value_type(value1, value2, value3);
475 if ((i_element ==
end()) || compare(*pvalue, *i_element))
477 ETL_INCREMENT_DEBUG_COUNT;
483 pvalue->~value_type();
484 storage.release(pvalue);
485 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
494 template <
typename T1,
typename T2,
typename T3,
typename T4>
495 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
499 ETL_OR_STD::pair<iterator, bool> result;
502 value_type* pvalue = storage.allocate<value_type>();
503 ::new (pvalue) value_type(value1, value2, value3, value4);
508 if ((i_element ==
end()) || compare(*pvalue, *i_element))
510 ETL_INCREMENT_DEBUG_COUNT;
516 pvalue->~value_type();
517 storage.release(pvalue);
518 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
532 iterator i_element =
find(key);
534 if (i_element ==
end())
543 ETL_DECREMENT_DEBUG_COUNT;
550 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
551 size_t erase(K&& key)
555 if (i_element ==
end())
564 ETL_DECREMENT_DEBUG_COUNT;
578 ETL_DECREMENT_DEBUG_COUNT;
586 iterator
erase(const_iterator i_element)
590 ETL_DECREMENT_DEBUG_COUNT;
601 iterator
erase(const_iterator first, const_iterator last)
603 const_iterator itr = first;
610 ETL_DECREMENT_DEBUG_COUNT;
621 if ETL_IF_CONSTEXPR(etl::is_trivially_destructible<value_type>::value)
623 storage.release_all();
627 iterator itr =
begin();
634 ETL_DECREMENT_DEBUG_COUNT;
638 ETL_RESET_DEBUG_COUNT;
647 iterator
find(key_parameter_t key)
654 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
666 const_iterator
find(key_parameter_t key)
const
673 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
685 size_t count(key_parameter_t key)
const
692 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
693 size_t count(
const K& key)
const
711 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
730 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
749 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
768 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
780 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
787 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
788 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
799 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
806 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
807 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
823 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
849 move_container(etl::move(rhs));
931 etl::iflat_set<T, TKeyCompare>::iterator first = rhs.begin();
932 etl::iflat_set<T, TKeyCompare>::iterator last = rhs.end();
935 while (first != last)
937 typename etl::iflat_set<T, TKeyCompare>::iterator temp = first;
940 this->
insert(etl::move(*first));
957 ETL_DECLARE_DEBUG_COUNT;
962#if defined(ETL_POLYMORPHIC_FLAT_SET) || defined(ETL_POLYMORPHIC_CONTAINERS)
982 template <
typename T,
typename TKeyCompare>
995 template <
typename T,
typename TKeyCompare>
998 return !(lhs == rhs);
1008 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare = etl::less<T> >
1013 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1041 this->move_container(etl::move(other));
1052 template <
typename TIterator>
1056 this->
assign(first, last);
1059#if ETL_HAS_INITIALIZER_LIST
1063 flat_set(std::initializer_list<T> init)
1066 this->
assign(init.begin(), init.end());
1099 this->move_container(etl::move(rhs));
1108 typedef typename etl::iflat_set<T, TCompare>::value_type node_t;
1111 etl::pool<node_t, MAX_SIZE> storage;
1114 etl::vector<node_t*, MAX_SIZE> lookup;
1117 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare>
1118 ETL_CONSTANT
size_t flat_set<T, MAX_SIZE_, TCompare>::MAX_SIZE;
1123#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1124 template <
typename... T>
1131#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1132 template <
typename TKey,
typename TKeyCompare = etl::less<TKey>,
typename... T>
1133 constexpr auto make_flat_set(T&&... keys) -> etl::flat_set<TKey,
sizeof...(T), TKeyCompare>
1135 return { etl::forward<T>(keys)... };
Definition reference_flat_set.h:72
Definition reference_flat_set.h:102
size_type capacity() const
Definition reference_flat_set.h:832
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, reference value)
Definition reference_flat_set.h:870
size_t available() const
Definition reference_flat_set.h:850
iterator upper_bound(parameter_t key)
Definition reference_flat_set.h:713
const_reverse_iterator crbegin() const
Definition reference_flat_set.h:402
iterator begin()
Definition reference_flat_set.h:312
size_t erase(parameter_t key)
Definition reference_flat_set.h:485
iterator end()
Definition reference_flat_set.h:330
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition reference_flat_set.h:751
const_iterator cend() const
Definition reference_flat_set.h:357
const_iterator cbegin() const
Definition reference_flat_set.h:348
iterator find(parameter_t key)
Definition reference_flat_set.h:562
size_type max_size() const
Definition reference_flat_set.h:841
const_reverse_iterator crend() const
Definition reference_flat_set.h:411
bool empty() const
Definition reference_flat_set.h:814
size_type size() const
Definition reference_flat_set.h:805
reverse_iterator rbegin()
Definition reference_flat_set.h:366
size_t count(parameter_t key) const
Definition reference_flat_set.h:656
bool full() const
Definition reference_flat_set.h:823
void clear()
Definition reference_flat_set.h:552
iterator lower_bound(parameter_t key)
Definition reference_flat_set.h:675
reverse_iterator rend()
Definition reference_flat_set.h:384
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
const_iterator cbegin() const
Definition flat_set.h:133
iterator insert(const_iterator, const_reference value)
Definition flat_set.h:283
~iflat_set()
Destructor.
Definition flat_set.h:969
iterator upper_bound(key_parameter_t key)
Definition flat_set.h:742
size_t available() const
Definition flat_set.h:904
flat_set()
Constructor.
Definition flat_set.h:1018
size_t erase(key_parameter_t key)
Definition flat_set.h:530
iterator begin()
Definition flat_set.h:97
iflat_set(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition flat_set.h:914
const_iterator begin() const
Definition flat_set.h:106
const_reverse_iterator crbegin() const
Definition flat_set.h:187
iterator erase(iterator i_element)
Definition flat_set.h:574
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1)
Emplaces a value to the set.
Definition flat_set.h:396
size_type max_size() const
Definition flat_set.h:895
iterator find(key_parameter_t key)
Definition flat_set.h:647
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition flat_set.h:780
size_type capacity() const
Definition flat_set.h:886
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:495
size_t count(key_parameter_t key) const
Definition flat_set.h:685
ETL_OR_STD::pair< iterator, bool > emplace(const_reference value)
Emplaces a value to the set.
Definition flat_set.h:321
iterator erase(const_iterator first, const_iterator last)
Definition flat_set.h:601
iterator lower_bound(key_parameter_t key)
Definition flat_set.h:704
ETL_OR_STD::pair< iterator, bool > emplace()
Emplaces a value to the set.
Definition flat_set.h:363
bool empty() const
Definition flat_set.h:868
const_iterator find(key_parameter_t key) const
Definition flat_set.h:666
~flat_set()
Destructor.
Definition flat_set.h:1073
iflat_set & operator=(const iflat_set &rhs)
Assignment operator.
Definition flat_set.h:833
const_iterator end() const
Definition flat_set.h:124
bool full() const
Definition flat_set.h:877
iterator end()
Definition flat_set.h:115
bool contains(key_parameter_t key) const
Check if the map contains the key.
Definition flat_set.h:816
iterator erase(const_iterator i_element)
Definition flat_set.h:586
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition flat_set.h:230
const_reverse_iterator rbegin() const
Definition flat_set.h:160
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2)
Emplaces a value to the set.
Definition flat_set.h:429
void insert(TIterator first, TIterator last)
Definition flat_set.h:309
const_reverse_iterator crend() const
Definition flat_set.h:196
void assign(TIterator first, TIterator last)
Definition flat_set.h:209
reverse_iterator rend()
Definition flat_set.h:169
flat_set & operator=(const flat_set &rhs)
Assignment operator.
Definition flat_set.h:1081
flat_set(const flat_set &other)
Copy constructor.
Definition flat_set.h:1026
size_type size() const
Definition flat_set.h:859
const_iterator lower_bound(key_parameter_t key) const
Definition flat_set.h:723
reverse_iterator rbegin()
Definition flat_set.h:151
const_iterator upper_bound(key_parameter_t key) const
Definition flat_set.h:761
const_reverse_iterator rend() const
Definition flat_set.h:178
const_iterator cend() const
Definition flat_set.h:142
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(key_parameter_t key) const
Definition flat_set.h:799
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:462
flat_set(TIterator first, TIterator last)
Definition flat_set.h:1053
void clear()
Clears the flat_set.
Definition flat_set.h:619
Definition flat_set.h:1010
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:1027
T * allocate()
Definition ipool.h:316
void release(const void *const p_object)
Definition ipool.h:442
bitset_ext
Definition absolute.h:39
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1151
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1139
iterator
Definition iterator.h:399