void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::erase(const __const_iterator__& __it) { // const iterator& __it = __REINTERPRET_CAST(const iterator&,_c_it); const _Node* __p = __it._M_cur; if (__p) { const size_type __n = _M_bkt_num(__p->_M_val); _Node* __cur = (_Node*)_M_buckets[__n]; if (__cur == __p) { _M_buckets[__n] = __cur->_M_next; _M_delete_node(__cur); --_M_num_elements._M_data; } else { _Node* __next = __cur->_M_next; while (__next) { if (__next == __p) { __cur->_M_next = __next->_M_next; _M_delete_node(__next); --_M_num_elements._M_data; break; } else { __cur = __next; __next = __cur->_M_next; } } } } }
void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All> ::resize(__size_type__ __num_elements_hint) { const size_type __old_n = _M_buckets.size(); if (__num_elements_hint > __old_n) { const size_type __n = _M_next_size(__num_elements_hint); if (__n > __old_n) { _BucketVector __tmp(__n, (void*)(0), _M_buckets.get_allocator()); __STL_TRY { for (size_type __bucket = 0; __bucket < __old_n; ++__bucket) { _Node* __first = (_Node*)_M_buckets[__bucket]; while (__first) { size_type __new_bucket = _M_bkt_num(__first->_M_val, __n); _M_buckets[__bucket] = __first->_M_next; __first->_M_next = (_Node*)__tmp[__new_bucket]; __tmp[__new_bucket] = __first; __first = (_Node*)_M_buckets[__bucket]; } } _M_buckets.swap(__tmp); } # ifdef __STL_USE_EXCEPTIONS catch(...) { for (size_type __bucket = 0; __bucket < __tmp.size(); ++__bucket) { while (__tmp[__bucket]) { _Node* __next = ((_Node*)__tmp[__bucket])->_M_next; _M_delete_node((_Node*)__tmp[__bucket]); __tmp[__bucket] = __next; } } throw; } # endif /* __STL_USE_EXCEPTIONS */ }
void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All> ::erase(__const_iterator__ _c_first, __const_iterator__ _c_last) { iterator& __first = (iterator&)_c_first; iterator& __last = (iterator&)_c_last; size_type __f_bucket = __first._M_cur ? _M_bkt_num(__first._M_cur->_M_val) : _M_buckets.size(); size_type __l_bucket = __last._M_cur ? _M_bkt_num(__last._M_cur->_M_val) : _M_buckets.size(); if (__first._M_cur == __last._M_cur) return; else if (__f_bucket == __l_bucket) _M_erase_bucket(__f_bucket, __first._M_cur, __last._M_cur); else { _M_erase_bucket(__f_bucket, __first._M_cur, 0); for (size_type __n = __f_bucket + 1; __n < __l_bucket; ++__n) _M_erase_bucket(__n, 0); if (__l_bucket != _M_buckets.size()) _M_erase_bucket(__l_bucket, __last._M_cur); } }
__reference__ hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_insert(const value_type& __obj) { resize(_M_num_elements._M_data + 1); size_type __n = _M_bkt_num(__obj); _Node* __first = (_Node*)_M_buckets[__n]; _Node* __tmp = _M_new_node(__obj); __tmp->_M_next = __first; _M_buckets[__n] = __tmp; ++_M_num_elements._M_data; return __tmp->_M_val; }
pair< _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All> , bool> hashtable<_Val,_Key,_HF,_ExK,_EqK,_All> ::insert_unique_noresize(const __value_type__& __obj) { const size_type __n = _M_bkt_num(__obj); _Node* __first = (_Node*)_M_buckets[__n]; for (_Node* __cur = __first; __cur; __cur = __cur->_M_next) if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj))) return pair<iterator, bool>(iterator(__cur, this), false); _Node* __tmp = _M_new_node(__obj); __tmp->_M_next = __first; _M_buckets[__n] = __tmp; ++_M_num_elements._M_data; return pair<iterator, bool>(iterator(__tmp, this), true); }
__reference__ hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::find_or_insert(const __value_type__& __obj) { resize(_M_num_elements._M_data + 1); size_type __n = _M_bkt_num(__obj); _Node* __first = (_Node*)_M_buckets[__n]; for (_Node* __cur = __first; __cur; __cur = __cur->_M_next) if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj))) return __cur->_M_val; _Node* __tmp = _M_new_node(__obj); __tmp->_M_next = __first; _M_buckets[__n] = __tmp; ++_M_num_elements._M_data; return __tmp->_M_val; }
__iterator__ hashtable<_Val,_Key,_HF,_ExK,_EqK,_All> ::insert_equal_noresize(const __value_type__& __obj) { const size_type __n = _M_bkt_num(__obj); _Node* __first = (_Node*)_M_buckets[__n]; for (_Node* __cur = __first; __cur; __cur = __cur->_M_next) if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj))) { _Node* __tmp = _M_new_node(__obj); __tmp->_M_next = __cur->_M_next; __cur->_M_next = __tmp; ++_M_num_elements._M_data; return iterator(__tmp, this); } _Node* __tmp = _M_new_node(__obj); __tmp->_M_next = __first; _M_buckets[__n] = __tmp; ++_M_num_elements._M_data; return iterator(__tmp, this); }