31#ifndef ETL_FLAT_SET_INCLUDED
32#define ETL_FLAT_SET_INCLUDED
60 template <
typename T,
typename TKeyCompare = etl::less<T> >
66 typedef typename refset_t::lookup_t lookup_t;
69 typedef const T& key_parameter_t;
75 typedef TKeyCompare key_compare;
76 typedef value_type& reference;
77 typedef const value_type& const_reference;
79 typedef value_type&& rvalue_reference;
81 typedef value_type* pointer;
82 typedef const value_type* const_pointer;
83 typedef size_t size_type;
85 typedef typename refset_t::iterator iterator;
86 typedef typename refset_t::const_iterator const_iterator;
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;
125 const_iterator
end()
const
180 const_reverse_iterator
rend()
const
199 const_reverse_iterator
crend()
const
212 template <
typename TIterator>
213 void assign(TIterator first, TIterator last)
215#if ETL_IS_DEBUG_BUILD
216 difference_type d = etl::distance(first, last);
222 while (first != last)
235 ETL_OR_STD::pair<iterator, bool>
insert(const_reference value)
239 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
242 if ((i_element ==
end()) || compare(value, *i_element))
246 value_type* pvalue = storage.allocate<value_type>();
247 ::new (pvalue) value_type(value);
248 ETL_INCREMENT_DEBUG_COUNT;
262 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
266 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
269 if ((i_element ==
end()) ||
compare(value, *i_element))
275 ETL_INCREMENT_DEBUG_COUNT;
290 iterator
insert(const_iterator , const_reference value)
292 return insert(value).first;
305 return insert(etl::move(value)).first;
317 template <
class TIterator>
318 void insert(TIterator first, TIterator last)
320 while (first != last)
330 ETL_OR_STD::pair<iterator, bool>
emplace(const_reference value)
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)
348 value_type temp_value(etl::forward<Args>(args)...);
351 if (position ==
end())
354 return ETL_OR_STD::pair<iterator, bool>(
end(),
false);
357 return ETL_OR_STD::pair<iterator, bool>(position,
false);
360 ETL_OR_STD::pair<iterator, bool> result;
363 value_type* pvalue = storage.allocate<value_type>();
364 ::new (pvalue) value_type(etl::forward<Args>(args)...);
369 if ((i_element ==
end()) || compare(*pvalue, *i_element))
371 ETL_INCREMENT_DEBUG_COUNT;
377 pvalue->~value_type();
378 storage.release(pvalue);
379 result = ETL_OR_STD::pair<iterator, bool>(i_element,
false);
392 ETL_OR_STD::pair<iterator, bool> result;
395 value_type* pvalue = storage.allocate<value_type>();
396 ::new (pvalue) value_type();
401 if ((i_element ==
end()) || compare(*pvalue, *i_element))
403 ETL_INCREMENT_DEBUG_COUNT;
409 pvalue->~value_type();
410 storage.release(pvalue);
411 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
420 template <
typename T1>
421 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1)
425 ETL_OR_STD::pair<iterator, bool> result;
428 value_type* pvalue = storage.allocate<value_type>();
429 ::new (pvalue) value_type(value1);
434 if ((i_element ==
end()) || compare(*pvalue, *i_element))
436 ETL_INCREMENT_DEBUG_COUNT;
442 pvalue->~value_type();
443 storage.release(pvalue);
444 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
453 template <
typename T1,
typename T2>
454 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2)
458 ETL_OR_STD::pair<iterator, bool> result;
461 value_type* pvalue = storage.allocate<value_type>();
462 ::new (pvalue) value_type(value1, value2);
467 if ((i_element ==
end()) || compare(*pvalue, *i_element))
469 ETL_INCREMENT_DEBUG_COUNT;
475 pvalue->~value_type();
476 storage.release(pvalue);
477 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
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)
491 ETL_OR_STD::pair<iterator, bool> result;
494 value_type* pvalue = storage.allocate<value_type>();
495 ::new (pvalue) value_type(value1, value2, value3);
500 if ((i_element ==
end()) || compare(*pvalue, *i_element))
502 ETL_INCREMENT_DEBUG_COUNT;
508 pvalue->~value_type();
509 storage.release(pvalue);
510 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
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)
524 ETL_OR_STD::pair<iterator, bool> result;
527 value_type* pvalue = storage.allocate<value_type>();
528 ::new (pvalue) value_type(value1, value2, value3, value4);
533 if ((i_element ==
end()) || compare(*pvalue, *i_element))
535 ETL_INCREMENT_DEBUG_COUNT;
541 pvalue->~value_type();
542 storage.release(pvalue);
543 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
557 iterator i_element =
find(key);
559 if (i_element ==
end())
568 ETL_DECREMENT_DEBUG_COUNT;
575 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
576 size_t erase(K&& key)
580 if (i_element ==
end())
589 ETL_DECREMENT_DEBUG_COUNT;
603 ETL_DECREMENT_DEBUG_COUNT;
611 iterator
erase(const_iterator i_element)
615 ETL_DECREMENT_DEBUG_COUNT;
626 iterator
erase(const_iterator first, const_iterator last)
628 const_iterator itr = first;
635 ETL_DECREMENT_DEBUG_COUNT;
646 if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<value_type>::value)
648 storage.release_all();
652 iterator itr =
begin();
659 ETL_DECREMENT_DEBUG_COUNT;
663 ETL_RESET_DEBUG_COUNT;
672 iterator
find(key_parameter_t key)
679 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
691 const_iterator
find(key_parameter_t key)
const
698 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
710 size_t count(key_parameter_t key)
const
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
736 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
755 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
774 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
793 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
805 ETL_OR_STD::pair<iterator, iterator>
equal_range(key_parameter_t key)
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)
824 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(key_parameter_t key)
const
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
848 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
874 move_container(etl::move(rhs));
956 etl::iflat_set<T, TKeyCompare>::iterator first = rhs.begin();
957 etl::iflat_set<T, TKeyCompare>::iterator last = rhs.end();
960 while (first != last)
962 typename etl::iflat_set<T, TKeyCompare>::iterator temp = first;
965 this->
insert(etl::move(*first));
982 ETL_DECLARE_DEBUG_COUNT;
987#if defined(ETL_POLYMORPHIC_FLAT_SET) || defined(ETL_POLYMORPHIC_CONTAINERS)
1007 template <
typename T,
typename TKeyCompare>
1020 template <
typename T,
typename TKeyCompare>
1023 return !(lhs == rhs);
1033 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare = etl::less<T> >
1038 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1066 this->move_container(etl::move(other));
1077 template <
typename TIterator>
1081 this->
assign(first, last);
1084#if ETL_HAS_INITIALIZER_LIST
1088 flat_set(std::initializer_list<T> init)
1091 this->
assign(init.begin(), init.end());
1124 this->move_container(etl::move(rhs));
1133 typedef typename etl::iflat_set<T, TCompare>::value_type node_t;
1136 etl::pool<node_t, MAX_SIZE> storage;
1139 etl::vector<node_t*, MAX_SIZE> lookup;
1142 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare>
1143 ETL_CONSTANT
size_t flat_set<T, MAX_SIZE_, TCompare>::MAX_SIZE;
1148#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1149 template <
typename... T>
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>
1160 return {etl::forward<T>(keys)...};
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
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
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
iterator
Definition iterator.h:482