[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.

WDYT?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D128021/new/

https://reviews.llvm.org/D128021



More information about the libcxx-commits mailing list