Sounds like a very good idea.
Moreover friend declaration could be limited to another _Hashtable<>
type with same _Key, _Value and _Alloc types to be compatible.
On 08/11/2024 11:33, Jonathan Wakely wrote:
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.