[libcxx-commits] [PATCH] D128021: [libc++] Don't call key_eq in unordered_map/set rehashing routine

Mark de Wever via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jun 27 11:58:47 PDT 2022

Mordante added a comment.

I had a look at the code and I wonder whether a different approach might be better. Instead of adding a template argument we change `__rehash` to two function `__rehash_unique` and `__rehash_multi`. This seems the approach already taken for other functions in the `__hash_table` class.

This means the public functions `rehash` and `resize` also need two versions. The other functions calling `rehash` are already specific for unique and multi. I think we can keep the unique key argument on these rehash functions. So I would suggest something along the lines of.

  // These were rehash, keep them public and adjust the callers
  _LIBCPP_INLINE_VISIBILITY void __rehash_unique(size_type __n) { __rehash<true>(__n); }
  _LIBCPP_INLINE_VISIBILITY void __rehash_multi(size_type __n) { __rehash<false>(__n); }
  // These were reserve, keep them public and adjust the callers
  _LIBCPP_INLINE_VISIBILITY void __reserve_unique(size_type __n)
        {__rehash_unique(static_cast<size_type>(ceil(__n / max_load_factor())));}                                              
  _LIBCPP_INLINE_VISIBILITY void __reserve_multi(size_type __n)
        {__rehash_multi(static_cast<size_type>(ceil(__n / max_load_factor())));}
  // rename __rehash to __do_rehash and make it templated
  template<class _UniqueKeys>
  void __do_rehash(size_type __n);
  // rename rehash to __rehash, make it private and make it templated
  template<class _UniqueKeys>
  void __rehash(size_type __n);

Then we can keep the templated rehashing you added but only have the template arguments on these two function instead of the entire class.


  rG LLVM Github Monorepo



More information about the libcxx-commits mailing list