- // We need to find previous non-empty bucket to link the new node.
- // There are several ways to find this previous bucket:
- // 1. Move backward until we find it (the current method)
- // 2. Start from the begin bucket index and move forward until we
- // cross __n position.
- // 3. Move forward until we find a non-empty bucket that will
- // contain the previous node.
- size_type __prev_bkt;
- for (__prev_bkt = __bkt; __prev_bkt-- != 0;)
- if (_M_buckets[__prev_bkt])
- break;
- __prev_n = _M_bucket_end(__prev_bkt);
- _M_insert_after(__prev_bkt, __prev_n, __new_node);
- }
- _M_buckets[__bkt] = __prev_n;
- }
-
- template<typename _Key, typename _Value,
- typename _Allocator, typename _ExtractKey, typename _Equal,
- typename _H1, typename _H2, typename _Hash, typename _RehashPolicy,
- bool __chc, bool __cit, bool __uk>
- void
- _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
- _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>::
- _M_insert_after(size_type __bkt, _Node* __prev_n, _Node* __new_n)
- {
- if (__prev_n->_M_next)
- {
- size_type __next_bkt = _M_bucket_index(__prev_n->_M_next);
- if (__next_bkt != __bkt)
- _M_buckets[__next_bkt] = __new_n;
+ // The bucket is empty, the new node is inserted at the beginning of
+ // the singly linked list and the bucket will contain _M_before_begin
+ // pointer.
+ __new_node->_M_nxt = _M_before_begin._M_nxt;
+ _M_before_begin._M_nxt = __new_node;
+ if (__new_node->_M_nxt)
+ // We must update former begin bucket that is pointing to
+ // _M_before_begin.
+ _M_buckets[_M_bucket_index(__new_node->_M_next())] = __new_node;
+ _M_buckets[__bkt] = &_M_before_begin;