31 #ifndef ETL_FLAT_MULTISET_INCLUDED
32 #define ETL_FLAT_MULTISET_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)
231 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
237 value_type* pvalue = storage.
allocate<value_type>();
238 ::new (pvalue) value_type(value);
239 ETL_INCREMENT_DEBUG_COUNT
245 #if ETL_CPP11_SUPPORTED
251 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference value)
253 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
259 value_type* pvalue = storage.
allocate<value_type>();
260 ::new (pvalue) value_type(etl::move(value));
261 ETL_INCREMENT_DEBUG_COUNT
276 return insert(value).first;
279 #if ETL_CPP11_SUPPORTED
288 return insert(etl::move(value)).first;
299 template <
class TIterator>
300 void insert(TIterator first, TIterator last)
302 while (first != last)
311 template <
typename T1>
312 ETL_OR_STD::pair<iterator, bool>
emplace(const_reference value)
320 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT
321 template <
typename ... Args>
322 ETL_OR_STD::pair<iterator, bool>
emplace(Args && ... args)
327 value_type* pvalue = storage.
allocate<value_type>();
328 ::new (pvalue) value_type(etl::forward<Args>(args)...);
332 ETL_INCREMENT_DEBUG_COUNT
339 template <
typename T1>
340 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1)
345 value_type* pvalue = storage.
allocate<value_type>();
346 ::new (pvalue) value_type(value1);
350 ETL_INCREMENT_DEBUG_COUNT
357 template <
typename T1,
typename T2>
358 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2)
363 value_type* pvalue = storage.
allocate<value_type>();
364 ::new (pvalue) value_type(value1, value2);
368 ETL_INCREMENT_DEBUG_COUNT
375 template <
typename T1,
typename T2,
typename T3>
376 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3)
381 value_type* pvalue = storage.
allocate<value_type>();
382 ::new (pvalue) value_type(value1, value2, value3);
386 ETL_INCREMENT_DEBUG_COUNT
393 template <
typename T1,
typename T2,
typename T3,
typename T4>
394 ETL_OR_STD::pair<iterator, bool>
emplace(
const T1& value1,
const T2& value2,
const T3& value3,
const T4& value4)
399 value_type* pvalue = storage.
allocate<value_type>();
400 ::new (pvalue) value_type(value1, value2, value3, value4);
404 ETL_INCREMENT_DEBUG_COUNT
416 ETL_OR_STD::pair<iterator, iterator> range =
equal_range(key);
418 if (range.first ==
end())
424 size_t d = etl::distance(range.first, range.second);
425 erase(range.first, range.second);
439 ETL_DECREMENT_DEBUG_COUNT
458 ETL_DECREMENT_DEBUG_COUNT
485 ETL_RESET_DEBUG_COUNT
514 size_t count(const_reference key)
const
564 ETL_OR_STD::pair<iterator, iterator>
equal_range(const_reference key)
574 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(const_reference key)
const
592 #if ETL_CPP11_SUPPORTED
598 move_container(etl::move(rhs));
669 #if ETL_CPP11_SUPPORTED
684 while (first != last)
686 this->
insert(etl::move(*first++));
702 ETL_DECLARE_DEBUG_COUNT
707 #if defined(ETL_POLYMORPHIC_FLAT_MULTISET) || defined(ETL_POLYMORPHIC_CONTAINERS)
727 template <
typename T,
typename TKeyCompare>
740 template <
typename T,
typename TKeyCompare>
743 return !(lhs == rhs);
753 template <
typename T, const
size_t MAX_SIZE_,
typename TCompare = etl::less<T> >
758 static const size_t MAX_SIZE = MAX_SIZE_;
777 #if ETL_CPP11_SUPPORTED
786 this->move_container(etl::move(other));
797 template <
typename TIterator>
801 this->
assign(first, last);
804 #if ETL_CPP11_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
811 this->
assign(init.begin(), init.end());
836 #if ETL_CPP11_SUPPORTED
844 this->move_container(etl::move(rhs));
853 typedef typename etl::iflat_multiset<T, TCompare>::value_type node_t;
865 #if ETL_CPP17_SUPPORTED && ETL_NOT_USING_STLPORT && ETL_USING_STL
866 template <
typename T,
typename... Ts>
867 flat_multiset(T, Ts...)
868 ->flat_multiset<etl::enable_if_t<(etl::is_same_v<T, Ts> && ...), T>, 1U +
sizeof...(Ts)>;
Definition: reference_flat_multiset.h:73
Definition: reference_flat_multiset.h:221
Definition: reference_flat_multiset.h:123
Definition: reference_flat_multiset.h:103
iterator upper_bound(parameter_t key)
Definition: reference_flat_multiset.h:647
size_t count(parameter_t key) const
Definition: reference_flat_multiset.h:615
iterator begin()
Definition: reference_flat_multiset.h:327
reverse_iterator rbegin()
Definition: reference_flat_multiset.h:381
size_t erase(parameter_t key)
Definition: reference_flat_multiset.h:517
bool empty() const
Definition: reference_flat_multiset.h:695
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, reference value)
Definition: reference_flat_multiset.h:751
reverse_iterator rend()
Definition: reference_flat_multiset.h:399
size_t available() const
Definition: reference_flat_multiset.h:731
iterator find(parameter_t key)
Definition: reference_flat_multiset.h:567
size_type size() const
Definition: reference_flat_multiset.h:686
ETL_OR_STD::pair< iterator, iterator > equal_range(parameter_t key)
Definition: reference_flat_multiset.h:667
bool full() const
Definition: reference_flat_multiset.h:704
void clear()
Clears the reference_flat_multiset.
Definition: reference_flat_multiset.h:557
iterator end()
Definition: reference_flat_multiset.h:345
iterator lower_bound(parameter_t key)
Definition: reference_flat_multiset.h:627
size_type capacity() const
Definition: reference_flat_multiset.h:713
const_reverse_iterator crbegin() const
Definition: reference_flat_multiset.h:417
const_reverse_iterator crend() const
Definition: reference_flat_multiset.h:426
const_iterator cend() const
Definition: reference_flat_multiset.h:372
size_type max_size() const
Definition: reference_flat_multiset.h:722
const_iterator cbegin() const
Definition: reference_flat_multiset.h:363
#define ETL_ASSERT(b, e)
Definition: error_handler.h:290
void clear()
Clears the flat_multiset.
Definition: flat_multiset.h:467
iterator lower_bound(const_reference key)
Definition: flat_multiset.h:524
const_reverse_iterator crbegin() const
Definition: flat_multiset.h:187
const_iterator end() const
Definition: flat_multiset.h:124
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const_reference key) const
Definition: flat_multiset.h:574
const_reverse_iterator rbegin() const
Definition: flat_multiset.h:160
const_reverse_iterator rend() const
Definition: flat_multiset.h:178
const_iterator upper_bound(const_reference key) const
Definition: flat_multiset.h:554
flat_multiset()
Constructor.
Definition: flat_multiset.h:763
iflat_multiset(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition: flat_multiset.h:663
iterator begin()
Definition: flat_multiset.h:97
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_multiset.h:394
void erase(iterator first, iterator last)
Definition: flat_multiset.h:449
void insert(TIterator first, TIterator last)
Definition: flat_multiset.h:300
iterator find(const_reference key)
Definition: flat_multiset.h:494
const_iterator cend() const
Definition: flat_multiset.h:142
iterator upper_bound(const_reference key)
Definition: flat_multiset.h:544
void assign(TIterator first, TIterator last)
Definition: flat_multiset.h:209
~iflat_multiset()
Internal debugging.
Definition: flat_multiset.h:714
iterator insert(iterator position, const_reference value)
Definition: flat_multiset.h:274
reverse_iterator rend()
Definition: flat_multiset.h:169
const_iterator lower_bound(const_reference key) const
Definition: flat_multiset.h:534
flat_multiset & operator=(const flat_multiset &rhs)
Assignment operator.
Definition: flat_multiset.h:826
const_iterator find(const_reference key) const
Definition: flat_multiset.h:504
bool empty() const
Definition: flat_multiset.h:617
~flat_multiset()
Destructor.
Definition: flat_multiset.h:818
const_reverse_iterator crend() const
Definition: flat_multiset.h:196
iflat_multiset & operator=(const iflat_multiset &rhs)
Assignment operator.
Definition: flat_multiset.h:582
flat_multiset(TIterator first, TIterator last)
Definition: flat_multiset.h:798
size_type max_size() const
Definition: flat_multiset.h:644
ETL_OR_STD::pair< iterator, bool > emplace(const_reference value)
Emplaces a value to the set.
Definition: flat_multiset.h:312
ETL_OR_STD::pair< iterator, iterator > equal_range(const_reference key)
Definition: flat_multiset.h:564
size_type capacity() const
Definition: flat_multiset.h:635
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2, const T3 &value3)
Emplaces a value to the set.
Definition: flat_multiset.h:376
iterator end()
Definition: flat_multiset.h:115
ETL_OR_STD::pair< iterator, bool > insert(const_reference value)
Definition: flat_multiset.h:229
const_iterator begin() const
Definition: flat_multiset.h:106
const_iterator cbegin() const
Definition: flat_multiset.h:133
void erase(iterator i_element)
Definition: flat_multiset.h:434
reverse_iterator rbegin()
Definition: flat_multiset.h:151
bool full() const
Definition: flat_multiset.h:626
size_t erase(const_reference key)
Definition: flat_multiset.h:414
size_type size() const
Definition: flat_multiset.h:608
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1, const T2 &value2)
Emplaces a value to the set.
Definition: flat_multiset.h:358
ETL_OR_STD::pair< iterator, bool > emplace(const T1 &value1)
Emplaces a value to the set.
Definition: flat_multiset.h:340
size_t available() const
Definition: flat_multiset.h:653
flat_multiset(const flat_multiset &other)
Copy constructor.
Definition: flat_multiset.h:771
size_t count(const_reference key) const
Definition: flat_multiset.h:514
Definition: flat_multiset.h:755
Definition: flat_multiset.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