31#ifndef ETL_UNORDERED_MULTIMAP_INCLUDED
32#define ETL_UNORDERED_MULTIMAP_INCLUDED
72 unordered_multimap_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
86 unordered_multimap_full(string_type file_name_, numeric_type line_number_)
100 unordered_multimap_out_of_range(string_type file_name_, numeric_type line_number_)
114 unordered_multimap_iterator(string_type file_name_, numeric_type line_number_)
126 template <
typename TKey,
typename T,
typename THash = etl::hash<TKey>,
typename TKeyEqual = etl::equal_to<TKey> >
131 typedef ETL_OR_STD::pair<const TKey, T> value_type;
133 typedef TKey key_type;
134 typedef T mapped_type;
135 typedef THash hasher;
136 typedef TKeyEqual key_equal;
137 typedef value_type& reference;
138 typedef const value_type& const_reference;
140 typedef value_type&& rvalue_reference;
142 typedef value_type* pointer;
143 typedef const value_type* const_pointer;
144 typedef size_t size_type;
146 typedef const key_type& const_key_reference;
148 typedef key_type&& rvalue_key_reference;
155 struct node_t :
public link_t
157 node_t(const_reference key_value_pair_)
158 : key_value_pair(key_value_pair_)
162 value_type key_value_pair;
165 friend bool operator==(
const node_t& lhs,
const node_t& rhs)
167 return (lhs.key_value_pair.first == rhs.key_value_pair.first) && (lhs.key_value_pair.second == rhs.key_value_pair.second);
170 friend bool operator!=(
const node_t& lhs,
const node_t& rhs)
172 return !(lhs == rhs);
183 typedef typename bucket_t::iterator local_iterator;
184 typedef typename bucket_t::const_iterator const_local_iterator;
191 typedef typename etl::iterator<ETL_OR_STD::forward_iterator_tag, T>::value_type value_type;
192 typedef typename iunordered_multimap::key_type key_type;
193 typedef typename iunordered_multimap::mapped_type mapped_type;
194 typedef typename iunordered_multimap::hasher hasher;
195 typedef typename iunordered_multimap::key_equal key_equal;
196 typedef typename iunordered_multimap::reference reference;
197 typedef typename iunordered_multimap::const_reference const_reference;
198 typedef typename iunordered_multimap::pointer pointer;
199 typedef typename iunordered_multimap::const_pointer const_pointer;
200 typedef typename iunordered_multimap::size_type size_type;
202 friend class iunordered_multimap;
203 friend class const_iterator;
209 iterator(
const iterator& other)
210 : pbuckets_end(other.pbuckets_end)
211 , pbucket(other.pbucket)
217 iterator& operator++()
222 if (inode == pbucket->end())
226 while ((pbucket != pbuckets_end) && (pbucket->empty()))
232 if (pbucket != pbuckets_end)
234 inode = pbucket->begin();
242 iterator operator++(
int)
244 iterator temp(*
this);
250 iterator& operator=(
const iterator& other)
252 pbuckets_end = other.pbuckets_end;
253 pbucket = other.pbucket;
259 reference operator*()
const
261 return inode->key_value_pair;
265 pointer operator&()
const
267 return &(inode->key_value_pair);
271 pointer operator->()
const
273 return &(inode->key_value_pair);
277 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
279 return lhs.compare(rhs);
283 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
285 return !(lhs == rhs);
291 iterator(bucket_t* pbuckets_end_, bucket_t* pbucket_, local_iterator inode_)
292 : pbuckets_end(pbuckets_end_)
299 bool compare(
const iterator& rhs)
const
301 return rhs.inode == inode;
305 bucket_t& get_bucket()
311 bucket_t*& get_bucket_list_iterator()
317 local_iterator get_local_iterator()
322 bucket_t* pbuckets_end;
324 local_iterator inode;
328 class const_iterator :
public etl::iterator<ETL_OR_STD::forward_iterator_tag, const T>
332 typedef typename etl::iterator<ETL_OR_STD::forward_iterator_tag, const T>::value_type value_type;
333 typedef typename iunordered_multimap::key_type key_type;
334 typedef typename iunordered_multimap::mapped_type mapped_type;
335 typedef typename iunordered_multimap::hasher hasher;
336 typedef typename iunordered_multimap::key_equal key_equal;
337 typedef typename iunordered_multimap::reference reference;
338 typedef typename iunordered_multimap::const_reference const_reference;
339 typedef typename iunordered_multimap::pointer pointer;
340 typedef typename iunordered_multimap::const_pointer const_pointer;
341 typedef typename iunordered_multimap::size_type size_type;
343 friend class iunordered_multimap;
344 friend class iterator;
351 : pbuckets_end(other.pbuckets_end)
352 , pbucket(other.pbucket)
358 const_iterator(
const const_iterator& other)
359 : pbuckets_end(other.pbuckets_end)
360 , pbucket(other.pbucket)
366 const_iterator& operator++()
371 if (inode == pbucket->end())
376 while ((pbucket != pbuckets_end) && (pbucket->empty()))
382 if (pbucket != pbuckets_end)
384 inode = pbucket->begin();
392 const_iterator operator++(
int)
394 const_iterator temp(*
this);
400 const_iterator& operator=(
const const_iterator& other)
402 pbuckets_end = other.pbuckets_end;
403 pbucket = other.pbucket;
409 const_reference operator*()
const
411 return inode->key_value_pair;
415 const_pointer operator&()
const
417 return &(inode->key_value_pair);
421 const_pointer operator->()
const
423 return &(inode->key_value_pair);
427 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
429 return lhs.compare(rhs);
433 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
435 return !(lhs == rhs);
441 const_iterator(bucket_t* pbuckets_end_, bucket_t* pbucket_, local_iterator inode_)
442 : pbuckets_end(pbuckets_end_)
449 bool compare(
const const_iterator& rhs)
const
451 return rhs.inode == inode;
455 bucket_t& get_bucket()
461 bucket_t*& get_bucket_list_iterator()
467 local_iterator get_local_iterator()
472 bucket_t* pbuckets_end;
474 local_iterator inode;
477 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
485 return iterator((pbuckets + number_of_buckets), first, first->begin());
494 return const_iterator((pbuckets + number_of_buckets), first, first->begin());
503 return const_iterator((pbuckets + number_of_buckets), first, first->begin());
512 return pbuckets[i].begin();
521 const_local_iterator
begin(
size_t i)
const
523 return pbuckets[i].cbegin();
532 const_local_iterator
cbegin(
size_t i)
const
534 return pbuckets[i].cbegin();
543 return iterator((pbuckets + number_of_buckets), last, last->end());
550 const_iterator
end()
const
552 return const_iterator((pbuckets + number_of_buckets), last, last->end());
561 return const_iterator((pbuckets + number_of_buckets), last, last->end());
568 local_iterator
end(
size_t i)
570 return pbuckets[i].end();
577 const_local_iterator
end(
size_t i)
const
579 return pbuckets[i].cend();
586 const_local_iterator
cend(
size_t i)
const
588 return pbuckets[i].cend();
597 return key_hash_function(key) % number_of_buckets;
605 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
608 return key_hash_function(key) % number_of_buckets;
618 size_t index = bucket(key);
620 return etl::distance(pbuckets[index].
begin(), pbuckets[index].
end());
628 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
631 size_t index = bucket(key);
633 return etl::distance(pbuckets[index].
begin(), pbuckets[index].
end());
643 return number_of_buckets;
652 return number_of_buckets;
664 template <
typename TIterator>
665 void assign(TIterator first_, TIterator last_)
667#if ETL_IS_DEBUG_BUILD
668 difference_type d = etl::distance(first_, last_);
675 while (first_ != last_)
688 iterator
insert(const_reference key_value_pair)
692 iterator result =
end();
694 const_key_reference key = key_value_pair.first;
700 bucket_t* pbucket = pbuckets + index;
701 bucket_t& bucket = *pbucket;
707 node_t* node = allocate_data_node();
709 ::new (&node->key_value_pair) value_type(key_value_pair);
710 ETL_INCREMENT_DEBUG_COUNT;
714 adjust_first_last_markers_after_insert(pbucket);
716 result = iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
722 local_iterator inode = bucket.
begin();
724 while (inode != bucket.
end())
727 if (key_equal_function(inode->key_value_pair.first, key))
737 node_t* node = allocate_data_node();
739 ::new (&node->key_value_pair) value_type(key_value_pair);
740 ETL_INCREMENT_DEBUG_COUNT;
744 adjust_first_last_markers_after_insert(&bucket);
747 result = iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
766 const_key_reference key = key_value_pair.first;
772 bucket_t* pbucket = pbuckets + index;
773 bucket_t& bucket = *pbucket;
779 node_t* node = allocate_data_node();
781 ::new (&node->key_value_pair)
value_type(
etl::move(key_value_pair));
782 ETL_INCREMENT_DEBUG_COUNT;
785 bucket.insert_after(bucket.before_begin(), *node);
786 adjust_first_last_markers_after_insert(pbucket);
788 result =
iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
793 local_iterator inode_previous = bucket.before_begin();
794 local_iterator inode = bucket.begin();
796 while (inode != bucket.end())
799 if (key_equal_function(inode->key_value_pair.first, key))
809 node_t* node = allocate_data_node();
811 ::new (&node->key_value_pair) value_type(
etl::move(key_value_pair));
812 ETL_INCREMENT_DEBUG_COUNT;
815 bucket.insert_after(inode_previous, *node);
816 adjust_first_last_markers_after_insert(&bucket);
819 result = iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
833 iterator
insert(const_iterator, const_reference key_value_pair)
835 return insert(key_value_pair);
848 return insert(etl::move(key_value_pair));
860 template <
class TIterator>
861 void insert(TIterator first_, TIterator last_)
863 while (first_ != last_)
870#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
875 template <
typename... Args>
883 node_t* node = allocate_data_node();
886 ETL_INCREMENT_DEBUG_COUNT;
888 const_key_reference key = node->key_value_pair.first;
894 bucket_t* pbucket = pbuckets + index;
895 bucket_t& bucket = *pbucket;
901 bucket.insert_after(bucket.before_begin(), *node);
902 adjust_first_last_markers_after_insert(pbucket);
904 result =
iterator((pbuckets + number_of_buckets), pbucket, pbucket->begin());
909 local_iterator inode_previous = bucket.before_begin();
910 local_iterator inode = bucket.begin();
912 while (inode != bucket.end())
915 if (key_equal_function(inode->key_value_pair.first, key))
925 bucket.insert_after(inode_previous, *node);
926 adjust_first_last_markers_after_insert(&bucket);
929 result =
iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
939 iterator
emplace(const_reference key_value_pair)
941 return insert(key_value_pair);
949 size_t erase(const_key_reference key)
954 bucket_t& bucket = pbuckets[bucket_id];
957 local_iterator icurrent = bucket.
begin();
959 while (icurrent != bucket.
end())
961 if (key_equal_function(icurrent->key_value_pair.first, key))
963 delete_data_node(iprevious, icurrent, bucket);
965 icurrent = iprevious;
984 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
985 size_t erase(
const K& key)
990 bucket_t& bucket = pbuckets[bucket_id];
993 local_iterator icurrent = bucket.begin();
995 while (icurrent != bucket.end())
997 if (key_equal_function(icurrent->key_value_pair.first, key))
999 delete_data_node(iprevious, icurrent, bucket);
1001 icurrent = iprevious;
1022 iterator inext((pbuckets + number_of_buckets), ielement.get_bucket_list_iterator(), ielement.get_local_iterator());
1025 bucket_t& bucket = ielement.get_bucket();
1027 local_iterator icurrent = ielement.get_local_iterator();
1030 while (iprevious->etl_next != &*icurrent)
1035 delete_data_node(iprevious, icurrent, bucket);
1047 iterator
erase(const_iterator first_, const_iterator last_)
1050 if ((first_ ==
begin()) && (last_ ==
end()))
1057 bucket_t* pbucket = first_.get_bucket_list_iterator();
1058 bucket_t* pend_bucket = last_.get_bucket_list_iterator();
1060 local_iterator icurrent = first_.get_local_iterator();
1061 local_iterator iend = last_.get_local_iterator();
1065 while (iprevious->etl_next != &*icurrent)
1071 iterator ibefore_erased = iterator((pbuckets + number_of_buckets), pbucket, iprevious);
1074 while ((icurrent != iend) || (pbucket != pend_bucket))
1076 icurrent = delete_data_node(iprevious, icurrent, *pbucket);
1079 if ((icurrent != iend) || (pbucket != pend_bucket))
1082 if ((icurrent == pbucket->
end()))
1087 }
while (pbucket->
empty());
1090 icurrent = pbucket->
begin();
1095 return ++ibefore_erased;
1111 size_t count(const_key_reference key)
const
1114 const_iterator f =
find(key);
1115 const_iterator l = f;
1122 while ((l !=
end()) && key_equal_function(key, l->first))
1138 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1139 size_t count(
const K& key)
const
1150 while ((l !=
end()) && key_equal_function(key, l->first))
1166 iterator
find(const_key_reference key)
1170 bucket_t* pbucket = pbuckets + index;
1171 bucket_t& bucket = *pbucket;
1174 if (!bucket.
empty())
1177 local_iterator inode = bucket.
begin();
1178 local_iterator iend = bucket.
end();
1180 while (inode != iend)
1183 if (key_equal_function(key, inode->key_value_pair.first))
1185 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1200 const_iterator
find(const_key_reference key)
const
1204 bucket_t* pbucket = pbuckets + index;
1205 bucket_t& bucket = *pbucket;
1208 if (!bucket.
empty())
1211 local_iterator inode = bucket.
begin();
1212 local_iterator iend = bucket.
end();
1214 while (inode != iend)
1217 if (key_equal_function(key, inode->key_value_pair.first))
1219 return const_iterator((pbuckets + number_of_buckets), pbucket, inode);
1235 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1240 bucket_t* pbucket = pbuckets + index;
1241 bucket_t& bucket = *pbucket;
1244 if (!bucket.empty())
1247 local_iterator inode = bucket.begin();
1248 local_iterator iend = bucket.end();
1250 while (inode != iend)
1253 if (key_equal_function(key, inode->key_value_pair.first))
1255 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1272 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1277 bucket_t* pbucket = pbuckets + index;
1278 bucket_t& bucket = *pbucket;
1281 if (!bucket.empty())
1284 local_iterator inode = bucket.begin();
1285 local_iterator iend = bucket.end();
1287 while (inode != iend)
1290 if (key_equal_function(key, inode->key_value_pair.first))
1292 return const_iterator((pbuckets + number_of_buckets), pbucket, inode);
1312 ETL_OR_STD::pair<iterator, iterator>
equal_range(const_key_reference key)
1314 iterator f =
find(key);
1321 while ((l !=
end()) && key_equal_function(key, l->first))
1327 return ETL_OR_STD::pair<iterator, iterator>(f, l);
1339 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(const_key_reference key)
const
1341 const_iterator f =
find(key);
1342 const_iterator l = f;
1348 while ((l !=
end()) && key_equal_function(key, l->first))
1354 return ETL_OR_STD::pair<const_iterator, const_iterator>(f, l);
1367 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1368 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
1377 while ((l !=
end()) && key_equal_function(key, l->first))
1383 return ETL_OR_STD::pair<iterator, iterator>(f, l);
1397 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1398 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
1407 while ((l !=
end()) && key_equal_function(key, l->first))
1413 return ETL_OR_STD::pair<const_iterator, const_iterator>(f, l);
1422 return pnodepool->size();
1430 return pnodepool->max_size();
1438 return pnodepool->max_size();
1446 return pnodepool->empty();
1454 return pnodepool->full();
1463 return pnodepool->available();
1481 return key_hash_function;
1490 return key_equal_function;
1502 key_equal_function = rhs.
key_eq();
1519 key_hash_function = rhs.hash_function();
1520 key_equal_function = rhs.key_eq();
1521 move(rhs.begin(), rhs.end());
1540 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1552 iunordered_multimap(pool_t& node_pool_, bucket_t* pbuckets_,
size_t number_of_buckets_, hasher key_hash_function_, key_equal key_equal_function_)
1553 : pnodepool(&node_pool_)
1554 , pbuckets(pbuckets_)
1555 , number_of_buckets(number_of_buckets_)
1558 , key_hash_function(key_hash_function_)
1559 , key_equal_function(key_equal_function_)
1571 for (
size_t i = 0UL; i < number_of_buckets; ++i)
1573 bucket_t& bucket = pbuckets[i];
1575 if (!bucket.
empty())
1578 local_iterator it = bucket.
begin();
1580 while (it != bucket.
end())
1583 it->key_value_pair.~value_type();
1585 ETL_DECREMENT_DEBUG_COUNT;
1594 pnodepool->release_all();
1622 node_t* allocate_data_node()
1625 return (pnodepool->*func)();
1631 void adjust_first_last_markers_after_insert(bucket_t* pbucket)
1640 if (pbucket < first)
1644 else if (pbucket > last)
1654 void adjust_first_last_markers_after_erase(bucket_t* pbucket)
1663 if (pbucket == first)
1667 while (first->empty())
1672 else if (pbucket == last)
1677 bucket_t* pend = last;
1681 while (pbucket != pend)
1683 if (!pbucket->empty())
1697 local_iterator delete_data_node(local_iterator iprevious, local_iterator icurrent, bucket_t& bucket)
1699 local_iterator inext = bucket.erase_after(iprevious);
1700 icurrent->key_value_pair.~value_type();
1701 pnodepool->release(&*icurrent);
1702 adjust_first_last_markers_after_erase(&bucket);
1703 ETL_DECREMENT_DEBUG_COUNT;
1718 const size_t number_of_buckets;
1725 hasher key_hash_function;
1728 key_equal key_equal_function;
1731 ETL_DECLARE_DEBUG_COUNT;
1736#if defined(ETL_POLYMORPHIC_UNORDERED_MULTIMAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
1756 template <
typename TKey,
typename T,
typename THash,
typename TKeyEqual>
1759 const bool sizes_match = (lhs.
size() == rhs.
size());
1760 bool elements_match =
true;
1766 itr_t l_begin = lhs.
begin();
1767 itr_t l_end = lhs.
end();
1769 while ((l_begin != l_end) && elements_match)
1771 const TKey key = l_begin->first;
1772 const T l_value = l_begin->second;
1775 ETL_OR_STD::pair<itr_t, itr_t> l_range = lhs.
equal_range(key);
1776 ETL_OR_STD::pair<itr_t, itr_t> r_range = rhs.
equal_range(key);
1778 if (r_range.first != rhs.
end())
1780 bool distance_match = (etl::distance(l_range.first, l_range.second) == etl::distance(r_range.first, r_range.second));
1784 elements_match =
etl::is_permutation(l_range.first, l_range.second, r_range.first, r_range.second);
1788 elements_match =
false;
1793 elements_match =
false;
1800 return (sizes_match && elements_match);
1810 template <
typename TKey,
typename T,
typename THash,
typename TKeyEqual>
1813 return !(lhs == rhs);
1820 template <
typename TKey,
typename TValue, const
size_t MAX_SIZE_, const
size_t MAX_BUCKETS_ = MAX_SIZE_,
typename THash = etl::hash<TKey>,
1821 typename TKeyEqual = etl::equal_to<TKey> >
1830 static ETL_CONSTANT
size_t MAX_SIZE = MAX_SIZE_;
1831 static ETL_CONSTANT
size_t MAX_BUCKETS = MAX_BUCKETS_;
1837 : base(node_pool, buckets, MAX_BUCKETS, hash, equal)
1859 : base(node_pool, buckets, MAX_BUCKETS, other.hash_function(), other.key_eq())
1864 base::move(other.begin(), other.end());
1875 template <
typename TIterator>
1876 unordered_multimap(TIterator first_, TIterator last_,
const THash& hash = THash(),
const TKeyEqual& equal = TKeyEqual())
1877 : base(node_pool, buckets, MAX_BUCKETS, hash, equal)
1882#if ETL_HAS_INITIALIZER_LIST
1886 unordered_multimap(std::initializer_list<ETL_OR_STD::pair<TKey, TValue>> init,
const THash& hash = THash(),
const TKeyEqual& equal = TKeyEqual())
1887 : base(node_pool, buckets, MAX_BUCKETS_, hash, equal)
1889 base::assign(init.begin(), init.end());
1917 base::operator=(etl::move(rhs));
1929 typename base::bucket_t buckets[MAX_BUCKETS_];
1935#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
1936 template <
typename... TPairs>
1937 unordered_multimap(TPairs...)
1938 -> unordered_multimap<
typename etl::nth_type_t<0, TPairs...>::first_type,
typename etl::nth_type_t<0, TPairs...>::second_type,
sizeof...(TPairs)>;
1944#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
1945 template <
typename TKey,
typename T,
typename THash = etl::hash<TKey>,
typename TKeyEqual = etl::equal_to<TKey>,
typename... TPairs>
1947 make_unordered_multimap(TPairs&&... pairs) -> etl::unordered_multimap<TKey, T,
sizeof...(TPairs),
sizeof...(TPairs), THash, TKeyEqual>
1949 return {etl::forward<TPairs>(pairs)...};
bool empty() const
Returns true if the list has no elements.
Definition intrusive_forward_list.h:250
void clear()
Clears the intrusive_forward_list.
Definition intrusive_forward_list.h:154
Definition intrusive_forward_list.h:457
iterator insert_after(iterator position, value_type &value)
Definition intrusive_forward_list.h:760
iterator end()
Gets the end of the intrusive_forward_list.
Definition intrusive_forward_list.h:713
iterator before_begin()
Gets before the beginning of the intrusive_forward_list.
Definition intrusive_forward_list.h:689
iterator begin()
Gets the beginning of the intrusive_forward_list.
Definition intrusive_forward_list.h:673
Definition unordered_multimap.h:329
Definition unordered_multimap.h:188
Definition unordered_multimap.h:1823
unordered_multimap(const unordered_multimap &other)
Copy constructor.
Definition unordered_multimap.h:1844
unordered_multimap & operator=(const unordered_multimap &rhs)
Assignment operator.
Definition unordered_multimap.h:1904
unordered_multimap(TIterator first_, TIterator last_, const THash &hash=THash(), const TKeyEqual &equal=TKeyEqual())
Definition unordered_multimap.h:1876
unordered_multimap(const THash &hash=THash(), const TKeyEqual &equal=TKeyEqual())
Default constructor.
Definition unordered_multimap.h:1836
~unordered_multimap()
Destructor.
Definition unordered_multimap.h:1896
ETL_NODISCARD ETL_CONSTEXPR14 bool is_permutation(TIterator1 begin1, TIterator1 end1, TIterator2 begin2)
Definition algorithm.h:1810
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
Definition exception.h:59
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
T * allocate()
Definition ipool.h:334
iterator end()
Definition unordered_multimap.h:541
iunordered_multimap & operator=(const iunordered_multimap &rhs)
Assignment operator.
Definition unordered_multimap.h:1496
const_local_iterator cend(size_t i) const
Definition unordered_multimap.h:586
const_local_iterator cbegin(size_t i) const
Definition unordered_multimap.h:532
float load_factor() const
Definition unordered_multimap.h:1470
void assign(TIterator first_, TIterator last_)
Definition unordered_multimap.h:665
size_t available() const
Definition unordered_multimap.h:1461
const_local_iterator end(size_t i) const
Definition unordered_multimap.h:577
key_equal key_eq() const
Definition unordered_multimap.h:1488
const_iterator find(const_key_reference key) const
Definition unordered_multimap.h:1200
bool contains(const_key_reference key) const
Check if the unordered_multimap contains the key.
Definition unordered_multimap.h:1531
bool empty() const
Checks to see if the unordered_multimap is empty.
Definition unordered_multimap.h:1444
size_type bucket_count() const
Definition unordered_multimap.h:650
iterator insert(const_reference key_value_pair)
Definition unordered_multimap.h:688
iterator erase(const_iterator ielement)
Definition unordered_multimap.h:1019
local_iterator end(size_t i)
Definition unordered_multimap.h:568
size_type capacity() const
Gets the maximum possible size of the unordered_multimap.
Definition unordered_multimap.h:1436
const_local_iterator begin(size_t i) const
Definition unordered_multimap.h:521
void initialise()
Initialise the unordered_multimap.
Definition unordered_multimap.h:1566
const_iterator end() const
Definition unordered_multimap.h:550
size_t count(const_key_reference key) const
Definition unordered_multimap.h:1111
iterator find(const_key_reference key)
Definition unordered_multimap.h:1166
size_type size() const
Gets the size of the unordered_multimap.
Definition unordered_multimap.h:1420
void clear()
Clears the unordered_multimap.
Definition unordered_multimap.h:1101
const_iterator begin() const
Definition unordered_multimap.h:492
hasher hash_function() const
Definition unordered_multimap.h:1479
iterator erase(const_iterator first_, const_iterator last_)
Definition unordered_multimap.h:1047
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const_key_reference key) const
Definition unordered_multimap.h:1339
iterator insert(const_iterator, const_reference key_value_pair)
Definition unordered_multimap.h:833
size_type max_size() const
Gets the maximum possible size of the unordered_multimap.
Definition unordered_multimap.h:1428
const_iterator cbegin() const
Definition unordered_multimap.h:501
local_iterator begin(size_t i)
Definition unordered_multimap.h:510
ETL_OR_STD::pair< iterator, iterator > equal_range(const_key_reference key)
Definition unordered_multimap.h:1312
~iunordered_multimap()
Destructor.
Definition unordered_multimap.h:1745
iunordered_multimap(pool_t &node_pool_, bucket_t *pbuckets_, size_t number_of_buckets_, hasher key_hash_function_, key_equal key_equal_function_)
Constructor.
Definition unordered_multimap.h:1552
size_type bucket_size(const_key_reference key) const
Definition unordered_multimap.h:616
size_type max_bucket_count() const
Definition unordered_multimap.h:641
const_iterator cend() const
Definition unordered_multimap.h:559
void insert(TIterator first_, TIterator last_)
Definition unordered_multimap.h:861
bool full() const
Checks to see if the unordered_multimap is full.
Definition unordered_multimap.h:1452
iterator emplace(const_reference key_value_pair)
Emplaces a value to the unordered_multimap.
Definition unordered_multimap.h:939
size_t erase(const_key_reference key)
Definition unordered_multimap.h:949
size_type get_bucket_index(const_key_reference key) const
Definition unordered_multimap.h:595
iterator begin()
Definition unordered_multimap.h:483
Definition unordered_multimap.h:128
Definition unordered_multimap.h:69
Definition unordered_multimap.h:83
Definition unordered_multimap.h:111
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1090
TContainer::iterator begin(TContainer &container)
Definition iterator.h:1136
A forward link.
Definition intrusive_links.h:87
iterator
Definition iterator.h:482
Definition unordered_multimap.h:156
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