On Thu, 7 Nov 2024 at 22:18, Jonathan Wakely wrote: > > I realised that _M_merge_unique and _M_merge_multi call extract(iter) > which then has to call _M_get_previous_node to iterate through the > bucket to find the node before the one iter points to. Since the merge > function is already iterating over the entire container, we had the > previous node a moment ago. Walking the whole bucket to find it again is > wasteful. We could just rewrite the loop in terms of node pointers > instead of iterators, and then call _M_extract_node directly. However, > this is only possible when the source container is the same type as the > destination, because otherwise we can't access the source's private > members (_M_before_begin, _M_begin, _M_extract_node etc.)
Of course we could just make _Hashtable<A...> a friend of _Hashtable<B...> so that we can always access the private members, and not need the separateimplementations using the private and public APIs. That would compile faster, be less code to maintain, and have more test coverage (because all the tests would use the same code). I tend to avoid granting friendship when possible, but maybe here it's the better option.