31#ifndef ETL_REFERENCE_FLAT_SET_INCLUDED
32#define ETL_REFERENCE_FLAT_SET_INCLUDED
61 flat_set_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
62 :
exception(reason_, file_name_, line_number_)
71 class flat_set_full :
public flat_set_exception
75 flat_set_full(string_type file_name_, numeric_type line_number_)
76 : flat_set_exception(ETL_ERROR_TEXT(
"flat_set:full", ETL_REFERENCE_FLAT_SET_FILE_ID
"A"), file_name_, line_number_)
85 class flat_set_iterator :
public flat_set_exception
89 flat_set_iterator(string_type file_name_, numeric_type line_number_)
90 : 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;
132 iterator(
typename lookup_t::iterator ilookup_)
137 iterator(
const iterator& other)
138 : ilookup(other.ilookup)
142 iterator& operator =(
const iterator& other)
144 ilookup = other.ilookup;
148 iterator& operator ++()
154 iterator operator ++(
int)
156 iterator temp(*
this);
161 iterator& operator --()
167 iterator operator --(
int)
169 iterator temp(*
this);
174 reference operator *()
const
179 pointer operator &()
const
184 pointer operator ->()
const
189 friend bool operator == (
const iterator& lhs,
const iterator& rhs)
191 return lhs.ilookup == rhs.ilookup;
194 friend bool operator != (
const iterator& lhs,
const iterator& rhs)
196 return !(lhs == rhs);
201 typename lookup_t::iterator ilookup;
205 class const_iterator :
public etl::iterator<ETL_OR_STD::bidirectional_iterator_tag, const value_type>
209 friend class ireference_flat_set;
215 const_iterator(
typename lookup_t::const_iterator ilookup_)
221 : ilookup(other.ilookup)
225 const_iterator(
const const_iterator& other)
226 : ilookup(other.ilookup)
230 const_iterator& operator =(
const iterator& other)
232 ilookup = other.ilookup;
236 const_iterator& operator =(
const const_iterator& other)
238 ilookup = other.ilookup;
242 const_iterator& operator ++()
248 const_iterator operator ++(
int)
250 const_iterator temp(*
this);
255 const_iterator& operator --()
261 const_iterator operator --(
int)
263 const_iterator temp(*
this);
268 const_reference operator *()
const
273 const_pointer operator &()
const
278 const_pointer operator ->()
const
283 friend bool operator == (
const const_iterator& lhs,
const const_iterator& rhs)
285 return lhs.ilookup == rhs.ilookup;
288 friend bool operator != (
const const_iterator& lhs,
const const_iterator& rhs)
290 return !(lhs == rhs);
295 typename lookup_t::const_iterator ilookup;
304 typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
305 typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
306 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
314 return iterator(lookup.begin());
323 return const_iterator(lookup.begin());
332 return iterator(lookup.end());
339 const_iterator
end()
const
341 return const_iterator(lookup.end());
350 return const_iterator(lookup.cbegin());
359 return const_iterator(lookup.cend());
368 return reverse_iterator(lookup.rbegin());
377 return const_reverse_iterator(lookup.rbegin());
386 return reverse_iterator(lookup.rend());
393 const_reverse_iterator
rend()
const
395 return const_reverse_iterator(lookup.rend());
404 return const_reverse_iterator(lookup.crbegin());
411 const_reverse_iterator
crend()
const
413 return const_reverse_iterator(lookup.crend());
423 template <
typename TIterator>
424 void assign(TIterator first, TIterator last)
426#if ETL_IS_DEBUG_BUILD
427 difference_type d = etl::distance(first, last);
433 while (first != last)
445 ETL_OR_STD::pair<iterator, bool>
insert(reference value)
458 iterator
insert(const_iterator , reference value)
460 return insert(value).first;
470 template <
class TIterator>
471 void insert(TIterator first, TIterator last)
473 while (first != last)
487 iterator i_element =
find(key);
489 if (i_element ==
end())
495 lookup.erase(i_element.ilookup);
502 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
503 size_t erase(K&& key)
507 if (i_element ==
end())
513 lookup.
erase(i_element.ilookup);
525 return lookup.erase(i_element.ilookup);
532 iterator
erase(const_iterator i_element)
534 return lookup.erase(i_element.ilookup);
544 iterator
erase(const_iterator first, const_iterator last)
546 return lookup.erase(first.ilookup, last.ilookup);
564 iterator itr = etl::lower_bound(
begin(),
end(), key, compare);
568 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
583 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
590 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
609 const_iterator
find(parameter_t key)
const
611 const_iterator itr = etl::lower_bound(
begin(),
end(), key, compare);
615 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
630 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
637 if (!key_compare()(*itr, key) && !key_compare()(key, *itr))
658 return (
find(key) ==
end()) ? 0 : 1;
663 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
664 size_t count(
const K& key)
const
666 return (
find(key) ==
end()) ? 0 : 1;
677 return etl::lower_bound(
begin(),
end(), key, compare);
682 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
696 return etl::lower_bound(
cbegin(),
cend(), key, compare);
701 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
715 return etl::upper_bound(
begin(),
end(), key, compare);
720 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
734 return etl::upper_bound(
cbegin(),
cend(), key, compare);
739 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
753 return etl::equal_range(
begin(),
end(), key, compare);
758 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
759 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
770 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(parameter_t key)
const
772 return etl::upper_bound(
cbegin(),
cend(), key, compare);
777 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
778 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
794 template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value,
int> = 0>
807 return lookup.size();
816 return lookup.empty();
825 return lookup.full();
834 return lookup.capacity();
843 return lookup.max_size();
852 return lookup.available();
870 ETL_OR_STD::pair<iterator, bool>
insert_at(iterator i_element, reference value)
872 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
874 if (i_element ==
end())
879 lookup.push_back(&value);
880 result.first = --
end();
881 result.second =
true;
886 result.first = i_element;
889 if (compare(value, *i_element) || compare(*i_element, value))
893 lookup.insert(i_element.ilookup, &value);
894 result.second =
true;
914#if defined(ETL_POLYMORPHIC_REFERENCE_FLAT_SET) || defined(ETL_POLYMORPHIC_CONTAINERS)
931 template <
typename TKey, const
size_t MAX_SIZE_,
typename TKeyCompare = etl::less<TKey> >
936 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
938 using typename ireference_flat_set<TKey, TKeyCompare>::value_type;
963 template <
typename TIterator>
984 template <
typename TKey, const
size_t MAX_SIZE_,
typename TCompare>
985 ETL_CONSTANT
size_t reference_flat_set<TKey, MAX_SIZE_, TCompare>::MAX_SIZE;
990#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
991 template <
typename... T>
992 reference_flat_set(T...) -> reference_flat_set<etl::nth_type_t<0, T...>,
sizeof...(T)>;
998#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
999 template <
typename TKey,
typename TKeyCompare = etl::less<TKey>,
typename... T>
1000 constexpr auto make_reference_flat_set(T&&... keys) ->
etl::reference_flat_set<TKey,
sizeof...(T), TKeyCompare>
1002 return { etl::forward<T>(keys)... };
1013 template <
typename T,
typename TKeyCompare>
1026 template <
typename T,
typename TKeyCompare>
1029 return !(lhs == rhs);
Definition reference_flat_set.h:72
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:694
~ireference_flat_set()
Destructor.
Definition reference_flat_set.h:921
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
ETL_OR_STD::pair< iterator, bool > insert(reference value)
Definition reference_flat_set.h:445
const_iterator begin() const
Definition reference_flat_set.h:321
iterator upper_bound(parameter_t key)
Definition reference_flat_set.h:713
const_iterator find(parameter_t key) const
Definition reference_flat_set.h:609
iterator erase(iterator i_element)
Definition reference_flat_set.h:523
void assign(TIterator first, TIterator last)
Definition reference_flat_set.h:424
iterator erase(const_iterator first, const_iterator last)
Definition reference_flat_set.h:544
const_reverse_iterator rend() const
Definition reference_flat_set.h:393
const_reverse_iterator crbegin() const
Definition reference_flat_set.h:402
const_iterator end() const
Definition reference_flat_set.h:339
iterator begin()
Definition reference_flat_set.h:312
size_t erase(parameter_t key)
Definition reference_flat_set.h:485
bool contains(parameter_t key) const
Check if the set contains the key.
Definition reference_flat_set.h:787
iterator insert(const_iterator, reference value)
Definition reference_flat_set.h:458
iterator end()
Definition reference_flat_set.h:330
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(parameter_t key) const
Definition reference_flat_set.h:770
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition reference_flat_set.h:751
const_iterator upper_bound(parameter_t key) const
Definition reference_flat_set.h:732
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
const_reverse_iterator rbegin() const
Definition reference_flat_set.h:375
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
ireference_flat_set(lookup_t &lookup_)
Constructor.
Definition reference_flat_set.h:860
size_t count(parameter_t key) const
Definition reference_flat_set.h:656
void insert(TIterator first, TIterator last)
Definition reference_flat_set.h:471
bool full() const
Definition reference_flat_set.h:823
void clear()
Clears the reference_flat_set.
Definition reference_flat_set.h:552
iterator erase(const_iterator i_element)
Definition reference_flat_set.h:532
iterator lower_bound(parameter_t key)
Definition reference_flat_set.h:675
reverse_iterator rend()
Definition reference_flat_set.h:384
Definition reference_flat_set.h:933
reference_flat_set(TIterator first, TIterator last)
Definition reference_flat_set.h:964
reference_flat_set(const reference_flat_set &other)
Copy constructor.
Definition reference_flat_set.h:951
reference_flat_set()
Constructor.
Definition reference_flat_set.h:943
~reference_flat_set()
Destructor.
Definition reference_flat_set.h:973
ETL_CONSTEXPR14 bool operator==(const etl::expected< TValue, TError > &lhs, const etl::expected< TValue2, TError2 > &rhs)
Equivalence operators.
Definition expected.h:962
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
iterator erase(iterator i_element)
Definition vector.h:890
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
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:48