31#ifndef ETL_REFERENCE_FLAT_SET_INCLUDED
32#define ETL_REFERENCE_FLAT_SET_INCLUDED
60 flat_set_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
61 :
exception(reason_, file_name_, line_number_)
70 class flat_set_full :
public flat_set_exception
74 flat_set_full(string_type file_name_, numeric_type line_number_)
75 : flat_set_exception(ETL_ERROR_TEXT(
"flat_set:full", ETL_REFERENCE_FLAT_SET_FILE_ID
"A"), file_name_, line_number_)
84 class flat_set_iterator :
public flat_set_exception
88 flat_set_iterator(string_type file_name_, numeric_type line_number_)
89 : flat_set_exception(ETL_ERROR_TEXT(
"flat_set:iterator", ETL_REFERENCE_FLAT_SET_FILE_ID
"B"), file_name_, line_number_)
100 template <
typename T,
typename TKeyCompare = etl::less<T> >
106 typedef T value_type;
107 typedef TKeyCompare key_compare;
108 typedef value_type& reference;
109 typedef const value_type& const_reference;
110 typedef value_type* pointer;
111 typedef const value_type* const_pointer;
112 typedef size_t size_type;
121 class iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, value_type>
125 friend class ireference_flat_set;
126 friend class const_iterator;
130 iterator(
typename lookup_t::iterator ilookup_)
135 iterator(
const iterator& other)
136 : ilookup(other.ilookup)
140 iterator& operator=(
const iterator& other)
142 ilookup = other.ilookup;
146 iterator& operator++()
152 iterator operator++(
int)
154 iterator temp(*
this);
159 iterator& operator--()
165 iterator operator--(
int)
167 iterator temp(*
this);
172 reference operator*()
const
177 pointer operator&()
const
182 pointer operator->()
const
187 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
189 return lhs.ilookup == rhs.ilookup;
192 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
194 return !(lhs == rhs);
199 typename lookup_t::iterator ilookup;
203 class const_iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, const value_type>
207 friend class ireference_flat_set;
211 const_iterator(
typename lookup_t::const_iterator ilookup_)
217 : ilookup(other.ilookup)
221 const_iterator(
const const_iterator& other)
222 : ilookup(other.ilookup)
226 const_iterator& operator=(
const iterator& other)
228 ilookup = other.ilookup;
232 const_iterator& operator=(
const const_iterator& other)
234 ilookup = other.ilookup;
238 const_iterator& operator++()
244 const_iterator operator++(
int)
246 const_iterator temp(*
this);
251 const_iterator& operator--()
257 const_iterator operator--(
int)
259 const_iterator temp(*
this);
264 const_reference operator*()
const
269 const_pointer operator&()
const
274 const_pointer operator->()
const
279 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
281 return lhs.ilookup == rhs.ilookup;
284 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
286 return !(lhs == rhs);
291 typename lookup_t::const_iterator ilookup;
300 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
301 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
302 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
310 return iterator(lookup.begin());
319 return const_iterator(lookup.begin());
328 return iterator(lookup.end());
335 const_iterator
end()
const
337 return const_iterator(lookup.end());
346 return const_iterator(lookup.cbegin());
355 return const_iterator(lookup.cend());
365 return reverse_iterator(lookup.rbegin());
376 return const_reverse_iterator(lookup.rbegin());
385 return reverse_iterator(lookup.rend());
393 const_reverse_iterator
rend()
const
395 return const_reverse_iterator(lookup.rend());
406 return const_reverse_iterator(lookup.crbegin());
414 const_reverse_iterator
crend()
const
416 return const_reverse_iterator(lookup.crend());
428 template <
typename TIterator>
429 void assign(TIterator first, TIterator last)
431#if ETL_IS_DEBUG_BUILD
432 difference_type d = etl::distance(first, last);
438 while (first != last)
451 ETL_OR_STD::pair<iterator, bool>
insert(reference value)
465 ETL_OR_STD::pair<iterator, bool>
emplace(reference value)
477 iterator
insert(const_iterator , reference value)
479 return insert(value).first;
490 template <
class TIterator>
491 void insert(TIterator first, TIterator last)
493 while (first != last)
507 iterator i_element =
find(key);
509 if (i_element ==
end())
515 lookup.erase(i_element.ilookup);
522 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
523 size_t erase(K&& key)
527 if (i_element ==
end())
533 lookup.erase(i_element.ilookup);
545 return lookup.erase(i_element.ilookup);
552 iterator
erase(const_iterator i_element)
554 return lookup.erase(i_element.ilookup);
564 iterator
erase(const_iterator first, const_iterator last)
566 return lookup.erase(first.ilookup, last.ilookup);
584 iterator itr = etl::lower_bound(
begin(),
end(), key, compare);
588 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
603 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
610 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
629 const_iterator
find(parameter_t key)
const
631 const_iterator itr = etl::lower_bound(
begin(),
end(), key, compare);
635 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
650 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
657 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
678 return (
find(key) ==
end()) ? 0 : 1;
683 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
684 size_t count(
const K& key)
const
686 return (
find(key) ==
end()) ? 0 : 1;
697 return etl::lower_bound(
begin(),
end(), key, compare);
702 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
716 return etl::lower_bound(
cbegin(),
cend(), key, compare);
721 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
735 return etl::upper_bound(
begin(),
end(), key, compare);
740 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
754 return etl::upper_bound(
cbegin(),
cend(), key, compare);
759 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
773 return etl::equal_range(
begin(),
end(), key, compare);
778 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
779 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
790 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(parameter_t key)
const
792 return etl::upper_bound(
cbegin(),
cend(), key, compare);
797 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
798 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
814 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
827 return lookup.size();
836 return lookup.empty();
845 return lookup.full();
854 return lookup.capacity();
863 return lookup.max_size();
872 return lookup.available();
890 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, reference value)
892 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
894 if (i_element ==
end())
899 lookup.push_back(&value);
900 result.first = --
end();
901 result.second =
true;
906 result.first = i_element;
909 if (compare(value, *i_element) || compare(*i_element, value))
913 lookup.insert(i_element.ilookup, &value);
914 result.second =
true;
934#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_SET) || defined(ETL_POLYMORPHIC_CONTAINERS)
951 template <
typename TKey, const
size_t MAX_SIZE_,
typename TKeyCompare = etl::less<TKey> >
956 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
958 using typename ireference_flat_set<TKey, TKeyCompare>::value_type;
983 template <
typename TIterator>
1004 template <
typename TKey, const
size_t MAX_SIZE_,
typename TCompare>
1005 ETL_CONSTANT
size_t reference_flat_set<TKey, MAX_SIZE_, TCompare>::MAX_SIZE;
1010#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1011 template <
typename... T>
1012 reference_flat_set(T...) -> reference_flat_set<etl::nth_type_t<0, T...>,
sizeof...(T)>;
1018#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1019 template <
typename TKey,
typename TKeyCompare = etl::less<TKey>,
typename... T>
1020 constexpr auto make_reference_flat_set(T&&... keys) ->
etl::reference_flat_set<TKey,
sizeof...(T), TKeyCompare>
1022 return {etl::forward<T>(keys)...};
1033 template <
typename T,
typename TKeyCompare>
1046 template <
typename T,
typename TKeyCompare>
1049 return !(lhs == rhs);
Definition reference_flat_set.h:71
Definition reference_flat_set.h:122
Definition reference_flat_set.h:102
const_iterator lower_bound(parameter_t key) const
Definition reference_flat_set.h:714
~ireference_flat_set()
Destructor.
Definition reference_flat_set.h:943
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
ETL_OR_STD::pair< iterator, bool > insert(reference value)
Definition reference_flat_set.h:451
const_iterator begin() const
Definition reference_flat_set.h:317
iterator upper_bound(parameter_t key)
Definition reference_flat_set.h:733
const_iterator find(parameter_t key) const
Definition reference_flat_set.h:629
iterator erase(iterator i_element)
Definition reference_flat_set.h:543
void assign(TIterator first, TIterator last)
Definition reference_flat_set.h:429
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_set.h:564
const_reverse_iterator rend() const
Definition reference_flat_set.h:393
const_reverse_iterator crbegin() const
Definition reference_flat_set.h:404
const_iterator end() const
Definition reference_flat_set.h:335
iterator begin()
Definition reference_flat_set.h:308
size_t erase(parameter_t key)
Definition reference_flat_set.h:505
bool contains(parameter_t key) const
Check if the set contains the key.
Definition reference_flat_set.h:807
iterator insert(const_iterator, reference value)
Definition reference_flat_set.h:477
iterator end()
Definition reference_flat_set.h:326
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(parameter_t key) const
Definition reference_flat_set.h:790
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition reference_flat_set.h:771
const_iterator upper_bound(parameter_t key) const
Definition reference_flat_set.h:752
const_iterator cend() const
Definition reference_flat_set.h:353
const_iterator cbegin() const
Definition reference_flat_set.h:344
ETL_OR_STD::pair< iterator, bool > emplace(reference value)
Definition reference_flat_set.h:465
iterator find(parameter_t key)
Definition reference_flat_set.h:582
const_reverse_iterator rbegin() const
Definition reference_flat_set.h:374
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
ireference_flat_set(lookup_t &lookup_)
Constructor.
Definition reference_flat_set.h:880
size_t count(parameter_t key) const
Definition reference_flat_set.h:676
void insert(TIterator first, TIterator last)
Definition reference_flat_set.h:491
bool full() const
Definition reference_flat_set.h:843
void clear()
Clears the reference_flat_set.
Definition reference_flat_set.h:572
iterator erase(const_iterator i_element)
Definition reference_flat_set.h:552
iterator lower_bound(parameter_t key)
Definition reference_flat_set.h:695
reverse_iterator rend()
Definition reference_flat_set.h:383
Definition reference_flat_set.h:953
reference_flat_set(TIterator first, TIterator last)
Definition reference_flat_set.h:984
reference_flat_set(const reference_flat_set &other)
Copy constructor.
Definition reference_flat_set.h:971
reference_flat_set()
Constructor.
Definition reference_flat_set.h:963
~reference_flat_set()
Destructor.
Definition reference_flat_set.h:993
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
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
etl::conditional< etl::is_fundamental< T >::value||etl::is_pointer< T >::value, T, constT & >::type type
By default fundamental and pointer types are passed by value.
Definition parameter_type.h:46
ETL_CONSTEXPR14 bool operator==(const etl::to_arithmetic_result< T > &lhs, const etl::to_arithmetic_result< T > &rhs)
Equality test for etl::to_arithmetic_result.
Definition to_arithmetic.h:903
ETL_CONSTEXPR14 bool operator!=(const etl::to_arithmetic_result< T > &lhs, const etl::to_arithmetic_result< T > &rhs)
Inequality test for etl::to_arithmetic_result.
Definition to_arithmetic.h:937