diff options
author | Abseil Team <absl-team@google.com> | 2021-06-23 09:44:41 -0700 |
---|---|---|
committer | rogeeff <rogeeff@google.com> | 2021-06-24 11:32:25 -0400 |
commit | a2419e63b8ae3b924152822f3c9f9da67ff6e215 (patch) | |
tree | 7a2f329a5baad755f80c78c21ee61d439fb76373 /absl/container/internal/raw_hash_set.h | |
parent | 4a23151e7ee089f54f0575f0a6d499e3a3fb6728 (diff) |
Export of internal Abseil changes
--
2684e80d877b688b8d9e0af1b7acddbadc973152 by Evan Brown <ezb@google.com>:
Add an insert codegen function for raw_hash_set_benchmark.
PiperOrigin-RevId: 381052237
--
8394ef3071714a41484cb5b271cba0611d954a7a by Abseil Team <absl-team@google.com>:
Optimize raw_hash_set ctor for random-access iterators
PiperOrigin-RevId: 380832215
GitOrigin-RevId: 2684e80d877b688b8d9e0af1b7acddbadc973152
Change-Id: Icf7929fdfab50a1b26f3dc5505575363b4f5838d
Diffstat (limited to 'absl/container/internal/raw_hash_set.h')
-rw-r--r-- | absl/container/internal/raw_hash_set.h | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h index 508f2124..03f199a5 100644 --- a/absl/container/internal/raw_hash_set.h +++ b/absl/container/internal/raw_hash_set.h @@ -502,6 +502,22 @@ inline size_t GrowthToLowerboundCapacity(size_t growth) { return growth + static_cast<size_t>((static_cast<int64_t>(growth) - 1) / 7); } +template <class InputIter> +size_t SelectBucketCountForIterRange(InputIter first, InputIter last, + size_t bucket_count) { + if (bucket_count != 0) { + return bucket_count; + } + using InputIterCategory = + typename std::iterator_traits<InputIter>::iterator_category; + if (std::is_base_of<std::random_access_iterator_tag, + InputIterCategory>::value) { + return GrowthToLowerboundCapacity( + static_cast<size_t>(std::distance(first, last))); + } + return 0; +} + inline void AssertIsFull(ctrl_t* ctrl) { ABSL_HARDENING_ASSERT((ctrl != nullptr && IsFull(*ctrl)) && "Invalid operation on iterator. The element might have " @@ -820,7 +836,8 @@ class raw_hash_set { raw_hash_set(InputIter first, InputIter last, size_t bucket_count = 0, const hasher& hash = hasher(), const key_equal& eq = key_equal(), const allocator_type& alloc = allocator_type()) - : raw_hash_set(bucket_count, hash, eq, alloc) { + : raw_hash_set(SelectBucketCountForIterRange(first, last, bucket_count), + hash, eq, alloc) { insert(first, last); } |