31 #ifndef ETL_FLAT_SET_INCLUDED
32 #define ETL_FLAT_SET_INCLUDED
39 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
40 #include <initializer_list>
61 template <
typename T,
typename TKeyCompare = etl::less<T> >
74 typedef TKeyCompare key_compare;
75 typedef value_type& reference;
76 typedef const value_type& const_reference;
77 #if ETL_CPP11_SUPPORTED
78 typedef value_type&& rvalue_reference;
80 typedef value_type* pointer;
81 typedef const value_type* const_pointer;
82 typedef size_t size_type;
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;
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 defined(ETL_DEBUG)
212 difference_type d = etl::distance(first, last);
218 while (first != last)
229 ETL_OR_STD::pair<iterator, bool>
insert(const_reference value)
233 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
236 if ((i_element ==
end()) ||
compare(value, *i_element))
240 value_type* pvalue = storage.
allocate<value_type>();
241 ::new (pvalue) value_type(value);
242 ETL_INCREMENT_DEBUG_COUNT
249 #if ETL_CPP11_SUPPORTED
255 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
259 ETL_OR_STD::pair<iterator, bool> result(i_element,
false);
262 if ((i_element ==
end()) ||
compare(value, *i_element))
266 value_type* pvalue = storage.
allocate<value_type>();
267 ::new (pvalue) value_type(etl::move(value));
268 ETL_INCREMENT_DEBUG_COUNT
284 return insert(value).first;
287 #if ETL_CPP11_SUPPORTED
296 return insert(etl::move(value)).first;
307 template <
class TIterator>
308 void insert(TIterator first, TIterator last)
310 while (first != last)
319 ETL_OR_STD::pair<iterator, bool>
emplace(const_reference value)
327 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT
328 template <
typename ... Args>
329 ETL_OR_STD::pair<iterator, bool>
emplace(Args && ... args)
333 ETL_OR_STD::pair<iterator, bool> result;
336 value_type* pvalue = storage.
allocate<value_type>();
337 ::new (pvalue) value_type(etl::forward<Args>(args)...);
342 if ((i_element ==
end()) ||
compare(*pvalue, *i_element))
344 ETL_INCREMENT_DEBUG_COUNT
350 pvalue->~value_type();
352 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
361 template <
typename T1>
362 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1)
366 ETL_OR_STD::pair<iterator, bool> result;
369 value_type* pvalue = storage.
allocate<value_type>();
370 ::new (pvalue) value_type(value1);
375 if ((i_element ==
end()) ||
compare(*pvalue, *i_element))
377 ETL_INCREMENT_DEBUG_COUNT
383 pvalue->~value_type();
385 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
394 template <
typename T1,
typename T2>
395 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2)
399 ETL_OR_STD::pair<iterator, bool> result;
402 value_type* pvalue = storage.
allocate<value_type>();
403 ::new (pvalue) value_type(value1, value2);
408 if ((i_element ==
end()) ||
compare(*pvalue, *i_element))
410 ETL_INCREMENT_DEBUG_COUNT
416 pvalue->~value_type();
418 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
427 template <
typename T1,
typename T2,
typename T3>
428 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3)
432 ETL_OR_STD::pair<iterator, bool> result;
435 value_type* pvalue = storage.
allocate<value_type>();
436 ::new (pvalue) value_type(value1, value2, value3);
441 if ((i_element ==
end()) ||
compare(*pvalue, *i_element))
443 ETL_INCREMENT_DEBUG_COUNT
449 pvalue->~value_type();
451 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
460 template <
typename T1,
typename T2,
typename T3,
typename T4>
461 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
465 ETL_OR_STD::pair<iterator, bool> result;
468 value_type* pvalue = storage.
allocate<value_type>();
469 ::new (pvalue) value_type(value1, value2, value3, value4);
474 if ((i_element ==
end()) ||
compare(*pvalue, *i_element))
476 ETL_INCREMENT_DEBUG_COUNT
482 pvalue->~value_type();
484 result = ETL_OR_STD::pair<iterator, bool>(
end(),
false);
500 if (i_element ==
end())
509 ETL_DECREMENT_DEBUG_COUNT
523 ETL_DECREMENT_DEBUG_COUNT
542 ETL_DECREMENT_DEBUG_COUNT
566 ETL_DECREMENT_DEBUG_COUNT
570 ETL_RESET_DEBUG_COUNT
599 size_t count(const_reference key)
const
649 ETL_OR_STD::pair<iterator, iterator>
equal_range(const_reference key)
659 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(const_reference key)
const
677 #if ETL_CPP11_SUPPORTED
683 move_container(etl::move(rhs));
754 #if ETL_CPP11_SUPPORTED
769 while (first != last)
771 this->
insert(etl::move(*first++));
787 ETL_DECLARE_DEBUG_COUNT
792 #if defined(ETL_POLYMORPHIC_FLAT_SET) || defined(ETL_POLYMORPHIC_CONTAINERS)
812 template <
typename T,
typename TKeyCompare>
825 template <
typename T,
typename TKeyCompare>
828 return !(lhs == rhs);
838 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare = etl::less<T> >
843 static const size_t MAX_SIZE = MAX_SIZE_;
862 #if ETL_CPP11_SUPPORTED
871 this->move_container(etl::move(other));
882 template <
typename TIterator>
886 this->
assign(first, last);
889 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
893 flat_set(std::initializer_list<T> init)
896 this->
assign(init.begin(), init.end());
921 #if ETL_CPP11_SUPPORTED
929 this->move_container(etl::move(rhs));
938 typedef typename etl::iflat_set<T, TCompare>::value_type node_t;
950 #if ETL_CPP17_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
951 template <
typename T,
typename... Ts>
953 ->flat_set<etl::enable_if_t<(etl::is_same_v<T, Ts> && ...), T>, 1U +
sizeof...(Ts)>;
Definition: reference_flat_set.h:74
Definition: reference_flat_set.h:223
Definition: reference_flat_set.h:124
Definition: reference_flat_set.h:104
size_type capacity() const
Definition: reference_flat_set.h:693
size_t available() const
Definition: reference_flat_set.h:711
iterator upper_bound(parameter_t key)
Definition: reference_flat_set.h:627
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, reference value)
Definition: reference_flat_set.h:731
const_reverse_iterator crbegin() const
Definition: reference_flat_set.h:419
iterator begin()
Definition: reference_flat_set.h:329
size_t erase(parameter_t key)
Definition: reference_flat_set.h:500
iterator end()
Definition: reference_flat_set.h:347
const_iterator cend() const
Definition: reference_flat_set.h:374
const_iterator cbegin() const
Definition: reference_flat_set.h:365
iterator find(parameter_t key)
Definition: reference_flat_set.h:549
size_type max_size() const
Definition: reference_flat_set.h:702
const_reverse_iterator crend() const
Definition: reference_flat_set.h:428
bool empty() const
Definition: reference_flat_set.h:675
size_type size() const
Definition: reference_flat_set.h:666
reverse_iterator rbegin()
Definition: reference_flat_set.h:383
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition: reference_flat_set.h:647
size_t count(parameter_t key) const
Definition: reference_flat_set.h:597
bool full() const
Definition: reference_flat_set.h:684
void clear()
Clears the reference_flat_set.
Definition: reference_flat_set.h:539
iterator lower_bound(parameter_t key)
Definition: reference_flat_set.h:607
reverse_iterator rend()
Definition: reference_flat_set.h:401
#define ETL_ASSERT(b, e)
Definition: error_handler.h:290
const_iterator cbegin() const
Definition: flat_set.h:133
ETL_OR_STD::pair< iterator, bool > emplace(const_reference value)
Emplaces a value to the set.
Definition: flat_set.h:319
~iflat_set()
Internal debugging.
Definition: flat_set.h:799
size_t available() const
Definition: flat_set.h:738
flat_set()
Constructor.
Definition: flat_set.h:848
iterator lower_bound(const_reference key)
Definition: flat_set.h:609
iterator begin()
Definition: flat_set.h:97
iflat_set & operator=(const iflat_set &rhs)
Assignment operator.
Definition: flat_set.h:667
iflat_set(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition: flat_set.h:748
size_t erase(const_reference key)
Definition: flat_set.h:496
void erase(iterator i_element)
Definition: flat_set.h:518
const_iterator begin() const
Definition: flat_set.h:106
const_reverse_iterator crbegin() const
Definition: flat_set.h:187
size_type max_size() const
Definition: flat_set.h:729
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1)
Emplaces a value to the set.
Definition: flat_set.h:362
size_type capacity() const
Definition: flat_set.h:720
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2)
Emplaces a value to the set.
Definition: flat_set.h:395
size_t count(const_reference key) const
Definition: flat_set.h:599
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:428
iterator find(const_reference key)
Definition: flat_set.h:579
void erase(iterator first, iterator last)
Definition: flat_set.h:533
bool empty() const
Definition: flat_set.h:702
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:461
ETL_OR_STD::pair< iterator, iterator > equal_range(const_reference key)
Definition: flat_set.h:649
const_iterator upper_bound(const_reference key) const
Definition: flat_set.h:639
~flat_set()
Destructor.
Definition: flat_set.h:903
iterator insert(iterator position, const_reference value)
Definition: flat_set.h:282
const_iterator end() const
Definition: flat_set.h:124
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const_reference key) const
Definition: flat_set.h:659
bool full() const
Definition: flat_set.h:711
iterator end()
Definition: flat_set.h:115
const_iterator find(const_reference key) const
Definition: flat_set.h:589
const_reverse_iterator rbegin() const
Definition: flat_set.h:160
void insert(TIterator first, TIterator last)
Definition: flat_set.h:308
flat_set & operator=(const flat_set &rhs)
Assignment operator.
Definition: flat_set.h:911
const_reverse_iterator crend() const
Definition: flat_set.h:196
iterator upper_bound(const_reference key)
Definition: flat_set.h:629
void assign(TIterator first, TIterator last)
Definition: flat_set.h:209
reverse_iterator rend()
Definition: flat_set.h:169
flat_set(const flat_set &other)
Copy constructor.
Definition: flat_set.h:856
size_type size() const
Definition: flat_set.h:693
reverse_iterator rbegin()
Definition: flat_set.h:151
const_reverse_iterator rend() const
Definition: flat_set.h:178
const_iterator cend() const
Definition: flat_set.h:142
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition: flat_set.h:229
flat_set(TIterator first, TIterator last)
Definition: flat_set.h:883
void clear()
Clears the flat_set.
Definition: flat_set.h:551
const_iterator lower_bound(const_reference key) const
Definition: flat_set.h:619
Definition: flat_set.h:840
Definition: flat_set.h:63
etl::enable_if< etl::is_trivially_destructible< T >::value, void >::type destroy_at(T *)
Definition: memory.h:949
T * addressof(T &t)
Definition: memory.h:61
void release_all()
Release all objects in the pool.
Definition: pool.h:264
void release(const void *const p_object)
Definition: pool.h:255
T * allocate()
Definition: pool.h:129
is_trivially_destructible
Definition: type_traits_generator.h:1171
Definition: absolute.h:37
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:594
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition: array.h:582
iterator
Definition: iterator.h:422