132 typedef ETL_OR_STD::pair<const TKey, T> value_type;
134 typedef TKey key_type;
135 typedef T mapped_type;
136 typedef THash hasher;
137 typedef TKeyEqual key_equal;
138 typedef value_type& reference;
139 typedef const value_type& const_reference;
141 typedef value_type&& rvalue_reference;
143 typedef value_type* pointer;
144 typedef const value_type* const_pointer;
145 typedef size_t size_type;
150 typedef key_type&& rvalue_key_reference;
152 typedef mapped_type& mapped_reference;
153 typedef const mapped_type& const_mapped_reference;
159 struct node_t :
public link_t
161 node_t(const_reference key_value_pair_)
162 : key_value_pair(key_value_pair_)
166 value_type key_value_pair;
169 friend bool operator==(
const node_t& lhs,
const node_t& rhs)
171 return (lhs.key_value_pair.first == rhs.key_value_pair.first) && (lhs.key_value_pair.second == rhs.key_value_pair.second);
174 friend bool operator!=(
const node_t& lhs,
const node_t& rhs)
176 return !(lhs == rhs);
187 typedef typename bucket_t::iterator local_iterator;
188 typedef typename bucket_t::const_iterator const_local_iterator;
195 typedef typename etl::iterator<ETL_OR_STD::forward_iterator_tag, T>::value_type value_type;
196 typedef typename iunordered_map::key_type key_type;
197 typedef typename iunordered_map::mapped_type mapped_type;
198 typedef typename iunordered_map::hasher hasher;
199 typedef typename iunordered_map::key_equal key_equal;
200 typedef typename iunordered_map::reference reference;
201 typedef typename iunordered_map::const_reference const_reference;
202 typedef typename iunordered_map::pointer pointer;
203 typedef typename iunordered_map::const_pointer const_pointer;
204 typedef typename iunordered_map::size_type size_type;
206 friend class iunordered_map;
207 friend class const_iterator;
213 iterator(
const iterator& other)
214 : pbuckets_end(other.pbuckets_end)
215 , pbucket(other.pbucket)
221 iterator& operator++()
226 if (inode == pbucket->end())
230 while ((pbucket != pbuckets_end) && (pbucket->empty()))
236 if (pbucket != pbuckets_end)
238 inode = pbucket->begin();
246 iterator operator++(
int)
248 iterator temp(*
this);
254 iterator& operator=(
const iterator& other)
256 pbuckets_end = other.pbuckets_end;
257 pbucket = other.pbucket;
263 reference operator*()
const
265 return inode->key_value_pair;
269 pointer operator&()
const
271 return &(inode->key_value_pair);
275 pointer operator->()
const
277 return &(inode->key_value_pair);
281 friend bool operator==(
const iterator& lhs,
const iterator& rhs)
283 return lhs.compare(rhs);
287 friend bool operator!=(
const iterator& lhs,
const iterator& rhs)
289 return !(lhs == rhs);
295 iterator(bucket_t* pbuckets_end_, bucket_t* pbucket_, local_iterator inode_)
296 : pbuckets_end(pbuckets_end_)
303 bool compare(
const iterator& rhs)
const
305 return rhs.inode == inode;
309 bucket_t& get_bucket()
315 bucket_t* get_bucket_list_iterator()
321 local_iterator get_local_iterator()
326 bucket_t* pbuckets_end;
328 local_iterator inode;
332 class const_iterator :
public etl::iterator<ETL_OR_STD::forward_iterator_tag, const T>
336 typedef typename etl::iterator<ETL_OR_STD::forward_iterator_tag, const T>::value_type value_type;
337 typedef typename iunordered_map::key_type key_type;
338 typedef typename iunordered_map::mapped_type mapped_type;
339 typedef typename iunordered_map::hasher hasher;
340 typedef typename iunordered_map::key_equal key_equal;
341 typedef typename iunordered_map::reference reference;
342 typedef typename iunordered_map::const_reference const_reference;
343 typedef typename iunordered_map::pointer pointer;
344 typedef typename iunordered_map::const_pointer const_pointer;
345 typedef typename iunordered_map::size_type size_type;
347 friend class iunordered_map;
348 friend class iterator;
355 : pbuckets_end(other.pbuckets_end)
356 , pbucket(other.pbucket)
362 const_iterator(
const const_iterator& other)
363 : pbuckets_end(other.pbuckets_end)
364 , pbucket(other.pbucket)
370 const_iterator& operator++()
375 if (inode == pbucket->end())
379 while ((pbucket != pbuckets_end) && (pbucket->empty()))
385 if (pbucket != pbuckets_end)
387 inode = pbucket->begin();
395 const_iterator operator++(
int)
397 const_iterator temp(*
this);
403 const_iterator& operator=(
const const_iterator& other)
405 pbuckets_end = other.pbuckets_end;
406 pbucket = other.pbucket;
412 const_reference operator*()
const
414 return inode->key_value_pair;
418 const_pointer operator&()
const
420 return &(inode->key_value_pair);
424 const_pointer operator->()
const
426 return &(inode->key_value_pair);
430 friend bool operator==(
const const_iterator& lhs,
const const_iterator& rhs)
432 return lhs.compare(rhs);
436 friend bool operator!=(
const const_iterator& lhs,
const const_iterator& rhs)
438 return !(lhs == rhs);
444 const_iterator(bucket_t* pbuckets_end_, bucket_t* pbucket_, local_iterator inode_)
445 : pbuckets_end(pbuckets_end_)
452 bool compare(
const const_iterator& rhs)
const
454 return rhs.inode == inode;
458 bucket_t& get_bucket()
464 bucket_t* get_bucket_list_iterator()
470 local_iterator get_local_iterator()
475 bucket_t* pbuckets_end;
477 local_iterator inode;
480 typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
488 return iterator((pbuckets + number_of_buckets), first, first->begin());
497 return const_iterator((pbuckets + number_of_buckets), first, first->begin());
506 return const_iterator((pbuckets + number_of_buckets), first, first->begin());
515 return pbuckets[i].begin();
522 const_local_iterator
begin(
size_t i)
const
524 return pbuckets[i].cbegin();
531 const_local_iterator
cbegin(
size_t i)
const
533 return pbuckets[i].cbegin();
542 return iterator((pbuckets + number_of_buckets), last, last->end());
549 const_iterator
end()
const
551 return const_iterator((pbuckets + number_of_buckets), last, last->end());
560 return const_iterator((pbuckets + number_of_buckets), last, last->end());
567 local_iterator
end(
size_t i)
569 return pbuckets[i].end();
576 const_local_iterator
end(
size_t i)
const
578 return pbuckets[i].cend();
585 const_local_iterator
cend(
size_t i)
const
587 return pbuckets[i].cend();
596 return key_hash_function(key) % number_of_buckets;
604 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
607 return key_hash_function(key) % number_of_buckets;
617 size_t index = bucket(key);
619 return etl::distance(pbuckets[index].
begin(), pbuckets[index].
end());
627 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
630 size_t index = bucket(key);
632 return etl::distance(pbuckets[index].
begin(), pbuckets[index].
end());
642 return number_of_buckets;
651 return number_of_buckets;
660 mapped_reference
operator[](rvalue_key_reference key)
666 local_iterator inode = pbucket->begin();
669 while (inode != pbucket->end())
672 if (key_equal_function(key, inode->key_value_pair.first))
675 return inode->key_value_pair.second;
685 node_t* node = allocate_data_node();
687 ::new ((
void*)
etl::addressof(node->key_value_pair.first)) key_type(etl::move(key));
688 ::new ((
void*)etl::
addressof(node->key_value_pair.second)) mapped_type();
689 ETL_INCREMENT_DEBUG_COUNT;
691 pbucket->insert_after(pbucket->before_begin(), *node);
693 adjust_first_last_markers_after_insert(pbucket);
695 return pbucket->
begin()->key_value_pair.second;
710 local_iterator inode = pbucket->
begin();
713 while (inode != pbucket->
end())
716 if (key_equal_function(key, inode->key_value_pair.first))
719 return inode->key_value_pair.second;
729 node_t* node = allocate_data_node();
731 ::new ((
void*)
etl::addressof(node->key_value_pair.first)) key_type(key);
732 ::new ((
void*)
etl::addressof(node->key_value_pair.second)) mapped_type();
733 ETL_INCREMENT_DEBUG_COUNT;
737 adjust_first_last_markers_after_insert(pbucket);
739 return pbucket->
begin()->key_value_pair.second;
748 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
755 local_iterator inode = pbucket->begin();
758 while (inode != pbucket->end())
761 if (key_equal_function(key, inode->key_value_pair.first))
764 return inode->key_value_pair.second;
774 node_t* node = allocate_data_node();
776 ::new ((
void*)
etl::addressof(node->key_value_pair.first)) key_type(key);
777 ::new ((
void*)etl::
addressof(node->key_value_pair.second)) mapped_type();
778 ETL_INCREMENT_DEBUG_COUNT;
780 pbucket->insert_after(pbucket->before_begin(), *node);
782 adjust_first_last_markers_after_insert(pbucket);
784 return pbucket->
begin()->key_value_pair.second;
801 local_iterator inode = pbucket->
begin();
804 while (inode != pbucket->
end())
807 if (key_equal_function(key, inode->key_value_pair.first))
810 return inode->key_value_pair.second;
821 return begin()->second;
837 local_iterator inode = pbucket->
begin();
840 while (inode != pbucket->
end())
843 if (key_equal_function(key, inode->key_value_pair.first))
846 return inode->key_value_pair.second;
857 return begin()->second;
868 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
869 mapped_reference
at(
const K& key)
875 local_iterator inode = pbucket->begin();
878 while (inode != pbucket->end())
881 if (key_equal_function(key, inode->key_value_pair.first))
884 return inode->key_value_pair.second;
893 ETL_ASSERT(
false, ETL_ERROR(unordered_map_out_of_range));
895 return begin()->second;
907 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
908 const_mapped_reference
at(
const K& key)
const
914 local_iterator inode = pbucket->begin();
917 while (inode != pbucket->end())
920 if (key_equal_function(key, inode->key_value_pair.first))
923 return inode->key_value_pair.second;
932 ETL_ASSERT(
false, ETL_ERROR(unordered_map_out_of_range));
934 return begin()->second;
946 template <
typename TIterator>
947 void assign(TIterator first_, TIterator last_)
949#if ETL_IS_DEBUG_BUILD
950 difference_type d = etl::distance(first_, last_);
957 while (first_ != last_)
970 ETL_OR_STD::pair<iterator, bool>
insert(const_reference key_value_pair)
972 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
976 const key_type& key = key_value_pair.first;
982 bucket_t* pbucket = pbuckets + index;
983 bucket_t& bucket = *pbucket;
989 node_t* node = allocate_data_node();
991 ::new ((
void*)
etl::addressof(node->key_value_pair)) value_type(key_value_pair);
992 ETL_INCREMENT_DEBUG_COUNT;
997 adjust_first_last_markers_after_insert(pbucket);
999 result.first = iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
1000 result.second =
true;
1006 local_iterator inode = bucket.
begin();
1008 while (inode != bucket.
end())
1011 if (key_equal_function(inode->key_value_pair.first, key))
1021 if (inode == bucket.
end())
1024 node_t* node = allocate_data_node();
1026 ::new ((
void*)
etl::addressof(node->key_value_pair)) value_type(key_value_pair);
1027 ETL_INCREMENT_DEBUG_COUNT;
1031 adjust_first_last_markers_after_insert(&bucket);
1034 result.first = iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
1035 result.second =
true;
1049 ETL_OR_STD::pair<iterator, bool>
insert(rvalue_reference key_value_pair)
1051 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
1055 const key_type& key = key_value_pair.first;
1061 bucket_t* pbucket = pbuckets + index;
1062 bucket_t& bucket = *pbucket;
1068 node_t* node = allocate_data_node();
1071 ETL_INCREMENT_DEBUG_COUNT;
1074 bucket.insert_after(bucket.before_begin(), *node);
1076 adjust_first_last_markers_after_insert(pbucket);
1078 result.first =
iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
1079 result.second = true;
1084 local_iterator inode_previous = bucket.before_begin();
1085 local_iterator inode = bucket.begin();
1087 while (inode != bucket.end())
1090 if (key_equal_function(inode->key_value_pair.first, key))
1100 if (inode == bucket.end())
1103 node_t* node = allocate_data_node();
1105 ::new ((
void*)
etl::addressof(node->key_value_pair)) value_type(
etl::move(key_value_pair));
1106 ETL_INCREMENT_DEBUG_COUNT;
1109 bucket.insert_after(inode_previous, *node);
1110 adjust_first_last_markers_after_insert(&bucket);
1113 result.first = iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
1114 result.second = true;
1129 iterator
insert(const_iterator, const_reference key_value_pair)
1131 return insert(key_value_pair).first;
1144 return insert(etl::move(key_value_pair)).first;
1156 template <
class TIterator>
1157 void insert(TIterator first_, TIterator last_)
1159 while (first_ != last_)
1166#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
1171 template <
typename... Args>
1172 ETL_OR_STD::pair<iterator, bool>
emplace(Args&&... args)
1174 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
1179 node_t* node = allocate_data_node();
1182 ETL_INCREMENT_DEBUG_COUNT;
1190 bucket_t* pbucket = pbuckets + index;
1191 bucket_t& bucket = *pbucket;
1197 bucket.insert_after(bucket.before_begin(), *node);
1199 adjust_first_last_markers_after_insert(pbucket);
1201 result.first =
iterator((pbuckets + number_of_buckets), pbucket, pbucket->begin());
1202 result.second =
true;
1207 local_iterator inode_previous = bucket.before_begin();
1208 local_iterator inode = bucket.begin();
1210 while (inode != bucket.end())
1213 if (key_equal_function(inode->key_value_pair.first, key))
1223 if (inode == bucket.end())
1226 bucket.insert_after(inode_previous, *node);
1227 adjust_first_last_markers_after_insert(&bucket);
1230 result.first =
iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
1231 result.second =
true;
1236 node->key_value_pair.~value_type();
1237 pnodepool->release(node);
1238 ETL_DECREMENT_DEBUG_COUNT;
1249 template <
typename... Args>
1252 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
1258 bucket_t* pbucket = pbuckets + index;
1259 bucket_t& bucket = *pbucket;
1267 node_t* node = allocate_data_node();
1269 ::new ((
void*)
etl::addressof(node->key_value_pair.first)) key_type(key);
1270 ::new ((
void*)etl::
addressof(node->key_value_pair.second)) mapped_type(etl::forward<Args>(args)...);
1271 ETL_INCREMENT_DEBUG_COUNT;
1274 bucket.insert_after(bucket.before_begin(), *node);
1276 adjust_first_last_markers_after_insert(pbucket);
1278 result.first =
iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
1279 result.second = true;
1284 local_iterator inode_previous = bucket.before_begin();
1285 local_iterator inode = bucket.begin();
1287 while (inode != bucket.end())
1290 if (key_equal_function(inode->key_value_pair.first, key))
1293 result.first = iterator((pbuckets + number_of_buckets), pbucket, inode);
1305 node_t* node = allocate_data_node();
1307 ::new ((
void*)
etl::addressof(node->key_value_pair.first)) key_type(key);
1308 ::new ((
void*)etl::
addressof(node->key_value_pair.second)) mapped_type(etl::forward<Args>(args)...);
1309 ETL_INCREMENT_DEBUG_COUNT;
1312 bucket.insert_after(inode_previous, *node);
1313 adjust_first_last_markers_after_insert(&bucket);
1316 result.first =
iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
1317 result.second = true;
1327 template <typename... Args>
1328 ETL_OR_STD::pair<
iterator,
bool> try_emplace(rvalue_key_reference key, Args&&... args)
1330 ETL_OR_STD::pair<iterator, bool> result(
end(),
false);
1336 bucket_t* pbucket = pbuckets + index;
1337 bucket_t& bucket = *pbucket;
1345 node_t* node = allocate_data_node();
1347 ::new ((
void*)
etl::addressof(node->key_value_pair.first)) key_type(etl::move(key));
1348 ::new ((
void*)etl::
addressof(node->key_value_pair.second)) mapped_type(etl::forward<Args>(args)...);
1349 ETL_INCREMENT_DEBUG_COUNT;
1352 bucket.insert_after(bucket.before_begin(), *node);
1354 adjust_first_last_markers_after_insert(pbucket);
1356 result.first =
iterator((pbuckets + number_of_buckets), pbucket, pbucket->
begin());
1357 result.second = true;
1362 local_iterator inode_previous = bucket.before_begin();
1363 local_iterator inode = bucket.begin();
1365 while (inode != bucket.end())
1368 if (key_equal_function(inode->key_value_pair.first, key))
1371 result.first = iterator((pbuckets + number_of_buckets), pbucket, inode);
1383 node_t* node = allocate_data_node();
1385 ::new ((
void*)
etl::addressof(node->key_value_pair.first)) key_type(etl::move(key));
1386 ::new ((
void*)etl::
addressof(node->key_value_pair.second)) mapped_type(etl::forward<Args>(args)...);
1387 ETL_INCREMENT_DEBUG_COUNT;
1390 bucket.insert_after(inode_previous, *node);
1391 adjust_first_last_markers_after_insert(&bucket);
1394 result.first =
iterator((pbuckets + number_of_buckets), pbucket, inode_previous);
1395 result.second = true;
1405 ETL_OR_STD::pair<iterator, bool>
emplace(const_reference key_value_pair)
1407 return insert(key_value_pair);
1420 bucket_t& bucket = pbuckets[index];
1423 local_iterator icurrent = bucket.
begin();
1426 while ((icurrent != bucket.
end()) && (!key_equal_function(icurrent->key_value_pair.first, key)))
1433 if (icurrent != bucket.
end())
1435 delete_data_node(iprevious, icurrent, bucket);
1448 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1449 size_t erase(
const K& key)
1454 bucket_t& bucket = pbuckets[index];
1457 local_iterator icurrent = bucket.begin();
1460 while ((icurrent != bucket.end()) && (!key_equal_function(icurrent->key_value_pair.first, key)))
1467 if (icurrent != bucket.end())
1469 delete_data_node(iprevious, icurrent, bucket);
1484 iterator inext((pbuckets + number_of_buckets), ielement.get_bucket_list_iterator(), ielement.get_local_iterator());
1487 bucket_t& bucket = ielement.get_bucket();
1489 local_iterator icurrent = ielement.get_local_iterator();
1492 while (iprevious->etl_next != &*icurrent)
1497 delete_data_node(iprevious, icurrent, bucket);
1509 iterator
erase(const_iterator first_, const_iterator last_)
1512 if ((first_ ==
begin()) && (last_ ==
end()))
1519 bucket_t* pbucket = first_.get_bucket_list_iterator();
1520 bucket_t* pend_bucket = last_.get_bucket_list_iterator();
1522 local_iterator icurrent = first_.get_local_iterator();
1523 local_iterator iend = last_.get_local_iterator();
1527 while (iprevious->etl_next != &*icurrent)
1533 iterator ibefore_erased = iterator((pbuckets + number_of_buckets), pbucket, iprevious);
1536 while ((icurrent != iend) || (pbucket != pend_bucket))
1538 icurrent = delete_data_node(iprevious, icurrent, *pbucket);
1541 if ((icurrent != iend) || (pbucket != pend_bucket))
1544 if ((icurrent == pbucket->
end()))
1549 }
while (pbucket->
empty());
1552 icurrent = pbucket->
begin();
1557 return ++ibefore_erased;
1575 return (
find(key) ==
end()) ? 0 : 1;
1584 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1585 size_t count(
const K& key)
const
1587 return (
find(key) ==
end()) ? 0 : 1;
1600 bucket_t* pbucket = pbuckets + index;
1601 bucket_t& bucket = *pbucket;
1604 if (!bucket.
empty())
1607 local_iterator inode = bucket.
begin();
1608 local_iterator iend = bucket.
end();
1610 while (inode != iend)
1613 if (key_equal_function(key, inode->key_value_pair.first))
1615 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1634 bucket_t* pbucket = pbuckets + index;
1635 bucket_t& bucket = *pbucket;
1638 if (!bucket.
empty())
1641 local_iterator inode = bucket.
begin();
1642 local_iterator iend = bucket.
end();
1644 while (inode != iend)
1647 if (key_equal_function(key, inode->key_value_pair.first))
1649 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1665 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1670 bucket_t* pbucket = pbuckets + index;
1671 bucket_t& bucket = *pbucket;
1674 if (!bucket.empty())
1677 local_iterator inode = bucket.begin();
1678 local_iterator iend = bucket.end();
1680 while (inode != iend)
1683 if (key_equal_function(key, inode->key_value_pair.first))
1685 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1702 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1707 bucket_t* pbucket = pbuckets + index;
1708 bucket_t& bucket = *pbucket;
1711 if (!bucket.empty())
1714 local_iterator inode = bucket.begin();
1715 local_iterator iend = bucket.end();
1717 while (inode != iend)
1720 if (key_equal_function(key, inode->key_value_pair.first))
1722 return iterator((pbuckets + number_of_buckets), pbucket, inode);
1744 iterator f =
find(key);
1752 return ETL_OR_STD::pair<iterator, iterator>(f, l);
1766 const_iterator f =
find(key);
1767 const_iterator l = f;
1774 return ETL_OR_STD::pair<const_iterator, const_iterator>(f, l);
1787 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1788 ETL_OR_STD::pair<iterator, iterator>
equal_range(
const K& key)
1798 return ETL_OR_STD::pair<iterator, iterator>(f, l);
1812 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1813 ETL_OR_STD::pair<const_iterator, const_iterator>
equal_range(
const K& key)
const
1823 return ETL_OR_STD::pair<const_iterator, const_iterator>(f, l);
1832 return pnodepool->size();
1840 return pnodepool->max_size();
1848 return pnodepool->max_size();
1856 return pnodepool->empty();
1864 return pnodepool->full();
1873 return pnodepool->available();
1891 return key_hash_function;
1900 return key_equal_function;
1912 key_equal_function = rhs.
key_eq();
1928 key_hash_function = rhs.hash_function();
1929 key_equal_function = rhs.key_eq();
1930 this->move(rhs.begin(), rhs.end());
1949 template <typename K, typename KE = TKeyEqual, etl::enable_if_t<comparator_is_transparent<KE>::value,
int> = 0>
1961 iunordered_map(pool_t& node_pool_, bucket_t* pbuckets_,
size_t number_of_buckets_, hasher key_hash_function_, key_equal key_equal_function_)
1962 : pnodepool(&node_pool_)
1963 , pbuckets(pbuckets_)
1964 , number_of_buckets(number_of_buckets_)
1967 , key_hash_function(key_hash_function_)
1968 , key_equal_function(key_equal_function_)
1980 for (
size_t i = 0UL; i < number_of_buckets; ++i)
1982 bucket_t& bucket = pbuckets[i];
1984 if (!bucket.
empty())
1987 local_iterator it = bucket.
begin();
1989 while (it != bucket.
end())
1992 it->key_value_pair.~value_type();
1993 ETL_DECREMENT_DEBUG_COUNT;
2004 pnodepool->release_all();
2032 node_t* allocate_data_node()
2035 return (pnodepool->*func)();
2041 void adjust_first_last_markers_after_insert(bucket_t* pbucket)
2050 if (pbucket < first)
2054 else if (pbucket > last)
2064 void adjust_first_last_markers_after_erase(bucket_t* pbucket)
2073 if (pbucket == first)
2077 while (first->empty())
2082 else if (pbucket == last)
2087 bucket_t* pend = last;
2091 while (pbucket != pend)
2093 if (!pbucket->empty())
2107 local_iterator delete_data_node(local_iterator iprevious, local_iterator icurrent, bucket_t& bucket)
2109 local_iterator inext = bucket.erase_after(iprevious);
2110 icurrent->key_value_pair.~value_type();
2111 pnodepool->release(&*icurrent);
2112 adjust_first_last_markers_after_erase(&bucket);
2113 ETL_DECREMENT_DEBUG_COUNT;
2128 const size_t number_of_buckets;
2135 hasher key_hash_function;
2138 key_equal key_equal_function;
2141 ETL_DECLARE_DEBUG_COUNT;
2146#if defined(ETL_POLYMORPHIC_UNORDERED_MAP) || defined(ETL_POLYMORPHIC_CONTAINERS)