re2 1.22.2 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +60 -4
  2. package/binding.gyp +5 -1
  3. package/lib/addon.cc +4 -0
  4. package/lib/new.cc +1 -246
  5. package/lib/pattern.cc +252 -0
  6. package/lib/pattern.h +10 -0
  7. package/lib/set.cc +777 -0
  8. package/lib/wrapped_re2_set.h +42 -0
  9. package/package.json +21 -9
  10. package/re2.d.ts +46 -9
  11. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
  12. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
  13. package/vendor/abseil-cpp/CMake/README.md +2 -2
  14. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  15. package/vendor/abseil-cpp/MODULE.bazel +6 -9
  16. package/vendor/abseil-cpp/README.md +6 -8
  17. package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
  18. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
  19. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
  20. package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
  21. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
  22. package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
  23. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
  24. package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
  25. package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
  26. package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
  27. package/vendor/abseil-cpp/absl/base/config.h +22 -129
  28. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
  29. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  30. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
  31. package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  32. package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  33. package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
  34. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  35. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
  36. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
  37. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
  38. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
  39. package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
  40. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
  41. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
  42. package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
  43. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
  44. package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
  45. package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
  46. package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  47. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
  48. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  49. package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
  50. package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
  51. package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
  52. package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
  53. package/vendor/abseil-cpp/absl/base/options.h +3 -80
  54. package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
  55. package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
  56. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
  57. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
  58. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
  59. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  60. package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
  61. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  62. package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
  63. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
  64. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
  65. package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
  68. package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
  69. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
  70. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
  71. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
  72. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
  73. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
  74. package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
  75. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
  76. package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
  77. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  78. package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
  79. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  80. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
  81. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
  82. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
  83. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
  84. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
  87. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
  88. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
  89. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
  90. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
  91. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
  92. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
  93. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
  94. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
  95. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
  96. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  97. package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
  101. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
  102. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
  103. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
  104. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
  105. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
  106. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
  107. package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
  108. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
  109. package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
  110. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
  111. package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
  112. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
  113. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
  114. package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
  115. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
  116. package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
  117. package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
  118. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
  119. package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
  120. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
  121. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
  122. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  123. package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
  124. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
  125. package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
  126. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
  127. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
  128. package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  129. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  130. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  131. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  132. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  133. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
  134. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  135. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  136. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
  137. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  138. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  139. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  140. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  141. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  142. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  143. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
  144. package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
  145. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
  146. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  147. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
  148. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
  149. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  150. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  151. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
  152. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
  153. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  154. package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
  155. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  156. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
  157. package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
  158. package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
  159. package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
  160. package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
  161. package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
  162. package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
  163. package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
  164. package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
  165. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
  166. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
  167. package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
  168. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
  169. package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
  170. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
  171. package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
  172. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
  173. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  174. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  175. package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
  176. package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
  177. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
  178. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
  179. package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
  180. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
  181. package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
  182. package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
  183. package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
  184. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
  185. package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
  186. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
  187. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
  188. package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
  189. package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
  190. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
  191. package/vendor/abseil-cpp/absl/log/check.h +2 -1
  192. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
  193. package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
  194. package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
  195. package/vendor/abseil-cpp/absl/log/globals.h +4 -5
  196. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
  197. package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  198. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
  199. package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
  200. package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  201. package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
  202. package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
  203. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  204. package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
  205. package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
  206. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  207. package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
  208. package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
  209. package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
  210. package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
  211. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
  212. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  213. package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
  214. package/vendor/abseil-cpp/absl/log/log.h +48 -35
  215. package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
  216. package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
  217. package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
  218. package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
  219. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
  220. package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  221. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
  222. package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
  223. package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
  224. package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
  225. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  226. package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
  227. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
  228. package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
  229. package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
  230. package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
  231. package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
  232. package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
  233. package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
  234. package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
  235. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
  236. package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
  237. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
  238. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
  239. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
  240. package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
  241. package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  242. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
  243. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
  244. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
  245. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
  246. package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
  247. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
  248. package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
  249. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  250. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
  251. package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
  252. package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  253. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
  254. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  255. package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
  256. package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
  257. package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
  258. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
  259. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  260. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
  261. package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
  262. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  263. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  264. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  265. package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
  266. package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
  267. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
  268. package/vendor/abseil-cpp/absl/random/random.h +88 -53
  269. package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  270. package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
  271. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  272. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  273. package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
  274. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
  275. package/vendor/abseil-cpp/absl/status/status.cc +4 -8
  276. package/vendor/abseil-cpp/absl/status/status.h +8 -8
  277. package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
  278. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
  279. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  280. package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
  281. package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
  282. package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
  283. package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
  284. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
  285. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
  286. package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
  287. package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
  288. package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
  289. package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
  290. package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
  291. package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
  292. package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
  293. package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
  294. package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
  295. package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  296. package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  297. package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
  298. package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
  299. package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
  300. package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
  301. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
  302. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
  303. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  304. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
  305. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
  306. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  307. package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
  308. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
  309. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
  310. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
  311. package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
  312. package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
  313. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  314. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  315. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
  316. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  317. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
  318. package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  319. package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  320. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  321. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
  322. package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  323. package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  324. package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  325. package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
  326. package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
  327. package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
  328. package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
  329. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
  330. package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
  331. package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
  332. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
  333. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
  334. package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
  335. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
  336. package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
  337. package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
  338. package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
  339. package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
  340. package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
  341. package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
  342. package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
  343. package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
  344. package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
  345. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
  346. package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
  347. package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
  348. package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
  349. package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
  350. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
  351. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
  352. package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
  353. package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
  354. package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
  355. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  356. package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  357. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
  358. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
  359. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
  360. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  361. package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  362. package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  363. package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  364. package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
  365. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  366. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
  367. package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  368. package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
  369. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
  370. package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
  371. package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
  372. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
  373. package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
  374. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  375. package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
  376. package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
  377. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
  378. package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
  379. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
  380. package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
  381. package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
  382. package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
  383. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
  384. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
  385. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  386. package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
  387. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
  388. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
  389. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
  390. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
  391. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  392. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
  393. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  394. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
  395. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
  396. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
  397. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
  398. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
  399. package/vendor/abseil-cpp/absl/time/time.h +24 -18
  400. package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
  401. package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
  402. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
  403. package/vendor/abseil-cpp/absl/types/any.h +9 -484
  404. package/vendor/abseil-cpp/absl/types/optional.h +7 -747
  405. package/vendor/abseil-cpp/absl/types/span.h +46 -19
  406. package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
  407. package/vendor/abseil-cpp/absl/types/variant.h +5 -784
  408. package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
  409. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
  410. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
  411. package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
  412. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
  413. package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
  414. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
  415. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
  416. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
  417. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
  418. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
  419. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  420. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
  421. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
  422. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
  423. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
  424. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
  425. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
  426. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
  427. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
  428. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
  429. package/vendor/re2/.bazelrc +4 -4
  430. package/vendor/re2/.bcr/metadata.template.json +16 -0
  431. package/vendor/re2/.bcr/presubmit.yml +57 -0
  432. package/vendor/re2/.bcr/source.template.json +5 -0
  433. package/vendor/re2/.github/bazel.sh +1 -7
  434. package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
  435. package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
  436. package/vendor/re2/.github/workflows/ci.yml +5 -6
  437. package/vendor/re2/.github/workflows/pages.yml +3 -3
  438. package/vendor/re2/.github/workflows/python.yml +29 -24
  439. package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
  440. package/vendor/re2/.github/workflows/release.yml +15 -4
  441. package/vendor/re2/BUILD.bazel +25 -0
  442. package/vendor/re2/CMakeLists.txt +100 -85
  443. package/vendor/re2/CONTRIBUTING.md +0 -1
  444. package/vendor/re2/MODULE.bazel +10 -10
  445. package/vendor/re2/Makefile +1 -1
  446. package/vendor/re2/README.md +259 -0
  447. package/vendor/re2/python/BUILD.bazel +8 -0
  448. package/vendor/re2/python/re2.py +1 -1
  449. package/vendor/re2/python/re2_test.py +6 -0
  450. package/vendor/re2/python/setup.py +3 -3
  451. package/vendor/re2/re2/bitmap256.cc +3 -4
  452. package/vendor/re2/re2/bitstate.cc +15 -10
  453. package/vendor/re2/re2/dfa.cc +1 -2
  454. package/vendor/re2/re2/parse.cc +3 -4
  455. package/vendor/re2/re2/prog.cc +1 -2
  456. package/vendor/re2/re2/prog.h +1 -0
  457. package/vendor/re2/re2/re2.cc +5 -0
  458. package/vendor/re2/re2/re2.h +9 -9
  459. package/vendor/re2/re2/set.cc +6 -0
  460. package/vendor/re2/re2/set.h +5 -0
  461. package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
  462. package/vendor/re2/re2/testing/re2_test.cc +8 -0
  463. package/vendor/re2/re2/testing/set_test.cc +5 -0
  464. package/vendor/re2/re2/walker-inl.h +1 -1
  465. package/vendor/abseil-cpp/WORKSPACE +0 -76
  466. package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
  467. package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
  468. package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  469. package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
  470. package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
  471. package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
  472. package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
  473. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
  474. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
  475. package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  476. package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
  477. package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
  478. package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
  479. package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
  480. package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
  481. package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  482. package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  483. package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  484. package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  485. package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
  486. package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
  487. package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
  488. package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
  489. package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
  490. package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
  491. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
  492. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
  493. package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
  494. package/vendor/re2/.github/workflows/pr.yml +0 -34
  495. package/vendor/re2/README +0 -47
@@ -24,15 +24,29 @@
24
24
  #include <TargetConditionals.h>
25
25
  #endif
26
26
 
27
+ // We include config.h here to make sure that ABSL_INTERNAL_CPLUSPLUS_LANG is
28
+ // defined.
27
29
  #include "absl/base/config.h"
28
30
 
31
+ // GCC15 warns that <ciso646> is deprecated in C++17 and suggests using
32
+ // <version> instead, even though <version> is not available in C++17 mode prior
33
+ // to GCC9.
34
+ #if defined(__has_include)
35
+ #if __has_include(<version>)
36
+ #define ABSL_INTERNAL_VERSION_HEADER_AVAILABLE 1
37
+ #endif
38
+ #endif
39
+
29
40
  // For feature testing and determining which headers can be included.
30
- #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L
41
+ #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 202002L || \
42
+ defined(ABSL_INTERNAL_VERSION_HEADER_AVAILABLE)
31
43
  #include <version>
32
44
  #else
33
45
  #include <ciso646>
34
46
  #endif
35
47
 
48
+ #undef ABSL_INTERNAL_VERSION_HEADER_AVAILABLE
49
+
36
50
  #include <algorithm>
37
51
  #include <array>
38
52
  #include <bitset>
@@ -51,6 +65,7 @@
51
65
  #include <memory>
52
66
  #include <set>
53
67
  #include <string>
68
+ #include <string_view>
54
69
  #include <tuple>
55
70
  #include <type_traits>
56
71
  #include <unordered_map>
@@ -59,13 +74,12 @@
59
74
  #include <vector>
60
75
 
61
76
  #include "absl/base/attributes.h"
62
- #include "absl/base/internal/endian.h"
63
77
  #include "absl/base/internal/unaligned_access.h"
64
78
  #include "absl/base/optimization.h"
65
79
  #include "absl/base/port.h"
66
80
  #include "absl/container/fixed_array.h"
67
81
  #include "absl/hash/internal/city.h"
68
- #include "absl/hash/internal/low_level_hash.h"
82
+ #include "absl/hash/internal/weakly_mixed_integer.h"
69
83
  #include "absl/meta/type_traits.h"
70
84
  #include "absl/numeric/bits.h"
71
85
  #include "absl/numeric/int128.h"
@@ -74,18 +88,11 @@
74
88
  #include "absl/types/variant.h"
75
89
  #include "absl/utility/utility.h"
76
90
 
77
- #if defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L
91
+ #if defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L && \
92
+ !defined(__XTENSA__)
78
93
  #include <filesystem> // NOLINT
79
94
  #endif
80
95
 
81
- #ifdef ABSL_HAVE_STD_STRING_VIEW
82
- #include <string_view>
83
- #endif
84
-
85
- #ifdef __ARM_ACLE
86
- #include <arm_acle.h>
87
- #endif
88
-
89
96
  namespace absl {
90
97
  ABSL_NAMESPACE_BEGIN
91
98
 
@@ -97,8 +104,6 @@ namespace hash_internal {
97
104
  // returns the size of these chunks.
98
105
  constexpr size_t PiecewiseChunkSize() { return 1024; }
99
106
 
100
- // PiecewiseCombiner
101
- //
102
107
  // PiecewiseCombiner is an internal-only helper class for hashing a piecewise
103
108
  // buffer of `char` or `unsigned char` as though it were contiguous. This class
104
109
  // provides two methods:
@@ -119,12 +124,10 @@ constexpr size_t PiecewiseChunkSize() { return 1024; }
119
124
  // return combiner.finalize(std::move(state));
120
125
  class PiecewiseCombiner {
121
126
  public:
122
- PiecewiseCombiner() : position_(0) {}
127
+ PiecewiseCombiner() = default;
123
128
  PiecewiseCombiner(const PiecewiseCombiner&) = delete;
124
129
  PiecewiseCombiner& operator=(const PiecewiseCombiner&) = delete;
125
130
 
126
- // PiecewiseCombiner::add_buffer()
127
- //
128
131
  // Appends the given range of bytes to the sequence to be hashed, which may
129
132
  // modify the provided hash state.
130
133
  template <typename H>
@@ -135,8 +138,6 @@ class PiecewiseCombiner {
135
138
  reinterpret_cast<const unsigned char*>(data), size);
136
139
  }
137
140
 
138
- // PiecewiseCombiner::finalize()
139
- //
140
141
  // Finishes combining the hash sequence, which may may modify the provided
141
142
  // hash state.
142
143
  //
@@ -149,21 +150,19 @@ class PiecewiseCombiner {
149
150
 
150
151
  private:
151
152
  unsigned char buf_[PiecewiseChunkSize()];
152
- size_t position_;
153
+ size_t position_ = 0;
154
+ bool added_something_ = false;
153
155
  };
154
156
 
155
- // is_hashable()
156
- //
157
157
  // Trait class which returns true if T is hashable by the absl::Hash framework.
158
158
  // Used for the AbslHashValue implementations for composite types below.
159
159
  template <typename T>
160
160
  struct is_hashable;
161
161
 
162
- // HashStateBase
163
- //
164
- // An internal implementation detail that contains common implementation details
165
- // for all of the "hash state objects" objects generated by Abseil. This is not
166
- // a public API; users should not create classes that inherit from this.
162
+ // HashStateBase is an internal implementation detail that contains common
163
+ // implementation details for all of the "hash state objects" objects generated
164
+ // by Abseil. This is not a public API; users should not create classes that
165
+ // inherit from this.
167
166
  //
168
167
  // A hash state object is the template argument `H` passed to `AbslHashValue`.
169
168
  // It represents an intermediate state in the computation of an unspecified hash
@@ -228,8 +227,6 @@ struct is_hashable;
228
227
  template <typename H>
229
228
  class HashStateBase {
230
229
  public:
231
- // HashStateBase::combine()
232
- //
233
230
  // Combines an arbitrary number of values into a hash state, returning the
234
231
  // updated state.
235
232
  //
@@ -249,8 +246,6 @@ class HashStateBase {
249
246
  static H combine(H state, const T& value, const Ts&... values);
250
247
  static H combine(H state) { return state; }
251
248
 
252
- // HashStateBase::combine_contiguous()
253
- //
254
249
  // Combines a contiguous array of `size` elements into a hash state, returning
255
250
  // the updated state.
256
251
  //
@@ -290,8 +285,6 @@ class HashStateBase {
290
285
  };
291
286
  };
292
287
 
293
- // is_uniquely_represented
294
- //
295
288
  // `is_uniquely_represented<T>` is a trait class that indicates whether `T`
296
289
  // is uniquely represented.
297
290
  //
@@ -326,8 +319,6 @@ class HashStateBase {
326
319
  template <typename T, typename Enable = void>
327
320
  struct is_uniquely_represented : std::false_type {};
328
321
 
329
- // is_uniquely_represented<unsigned char>
330
- //
331
322
  // unsigned char is a synonym for "byte", so it is guaranteed to be
332
323
  // uniquely represented.
333
324
  template <>
@@ -342,9 +333,6 @@ struct is_uniquely_represented<
342
333
  Integral, typename std::enable_if<std::is_integral<Integral>::value>::type>
343
334
  : std::true_type {};
344
335
 
345
- // is_uniquely_represented<bool>
346
- //
347
- //
348
336
  template <>
349
337
  struct is_uniquely_represented<bool> : std::false_type {};
350
338
 
@@ -366,8 +354,15 @@ struct CombineRaw {
366
354
  }
367
355
  };
368
356
 
369
- // hash_bytes()
370
- //
357
+ // For use in `raw_hash_set` to pass a seed to the hash function.
358
+ struct HashWithSeed {
359
+ template <typename Hasher, typename T>
360
+ size_t hash(const Hasher& hasher, const T& value, size_t seed) const {
361
+ // NOLINTNEXTLINE(clang-diagnostic-sign-conversion)
362
+ return hasher.hash_with_seed(value, seed);
363
+ }
364
+ };
365
+
371
366
  // Convenience function that combines `hash_state` with the byte representation
372
367
  // of `value`.
373
368
  template <typename H, typename T,
@@ -375,14 +370,14 @@ template <typename H, typename T,
375
370
  H hash_bytes(H hash_state, const T& value) {
376
371
  const unsigned char* start = reinterpret_cast<const unsigned char*>(&value);
377
372
  uint64_t v;
378
- if (sizeof(T) == 1) {
373
+ if constexpr (sizeof(T) == 1) {
379
374
  v = *start;
380
- } else if (sizeof(T) == 2) {
375
+ } else if constexpr (sizeof(T) == 2) {
381
376
  v = absl::base_internal::UnalignedLoad16(start);
382
- } else if (sizeof(T) == 4) {
377
+ } else if constexpr (sizeof(T) == 4) {
383
378
  v = absl::base_internal::UnalignedLoad32(start);
384
379
  } else {
385
- assert(sizeof(T) == 8);
380
+ static_assert(sizeof(T) == 8);
386
381
  v = absl::base_internal::UnalignedLoad64(start);
387
382
  }
388
383
  return CombineRaw()(std::move(hash_state), v);
@@ -394,6 +389,11 @@ H hash_bytes(H hash_state, const T& value) {
394
389
  return H::combine_contiguous(std::move(hash_state), start, sizeof(value));
395
390
  }
396
391
 
392
+ template <typename H>
393
+ H hash_weakly_mixed_integer(H hash_state, WeaklyMixedInteger value) {
394
+ return H::combine_weakly_mixed_integer(std::move(hash_state), value);
395
+ }
396
+
397
397
  // -----------------------------------------------------------------------------
398
398
  // AbslHashValue for Basic Types
399
399
  // -----------------------------------------------------------------------------
@@ -410,8 +410,10 @@ H hash_bytes(H hash_state, const T& value) {
410
410
  template <typename H, typename B>
411
411
  typename std::enable_if<std::is_same<B, bool>::value, H>::type AbslHashValue(
412
412
  H hash_state, B value) {
413
+ // We use ~size_t{} instead of 1 so that all bits are different between
414
+ // true/false instead of only 1.
413
415
  return H::combine(std::move(hash_state),
414
- static_cast<unsigned char>(value ? 1 : 0));
416
+ static_cast<size_t>(value ? ~size_t{} : 0));
415
417
  }
416
418
 
417
419
  // AbslHashValue() for hashing enum values
@@ -490,10 +492,10 @@ std::enable_if_t<std::is_pointer<T>::value, H> AbslHashValue(H hash_state,
490
492
  T ptr) {
491
493
  auto v = reinterpret_cast<uintptr_t>(ptr);
492
494
  // Due to alignment, pointers tend to have low bits as zero, and the next few
493
- // bits follow a pattern since they are also multiples of some base value. The
494
- // byte swap in WeakMix helps ensure we still have good entropy in low bits.
495
- // Mix pointers twice to ensure we have good entropy in low bits.
496
- return H::combine(std::move(hash_state), v, v);
495
+ // bits follow a pattern since they are also multiples of some base value.
496
+ // The PointerAlignment test verifies that our mixing is good enough to handle
497
+ // these cases.
498
+ return H::combine(std::move(hash_state), v);
497
499
  }
498
500
 
499
501
  // AbslHashValue() for hashing nullptr_t
@@ -512,7 +514,7 @@ H AbslHashValue(H hash_state, T C::*ptr) {
512
514
  // padding (namely when they have 1 or 3 ints). The value below is a lower
513
515
  // bound on the number of salient, non-padding bytes that we use for
514
516
  // hashing.
515
- if (alignof(T C::*) == alignof(int)) {
517
+ if constexpr (alignof(T C::*) == alignof(int)) {
516
518
  // No padding when all subobjects have the same size as the total
517
519
  // alignment. This happens in 32-bit mode.
518
520
  return n;
@@ -547,8 +549,6 @@ AbslHashValue(H hash_state, const std::pair<T1, T2>& p) {
547
549
  return H::combine(std::move(hash_state), p.first, p.second);
548
550
  }
549
551
 
550
- // hash_tuple()
551
- //
552
552
  // Helper function for hashing a tuple. The third argument should
553
553
  // be an index_sequence running from 0 to tuple_size<Tuple> - 1.
554
554
  template <typename H, typename Tuple, size_t... Is>
@@ -607,9 +607,7 @@ H AbslHashValue(H hash_state, const std::shared_ptr<T>& ptr) {
607
607
  // `eq()` member isn't equivalent to `==` on the underlying character type.
608
608
  template <typename H>
609
609
  H AbslHashValue(H hash_state, absl::string_view str) {
610
- return H::combine(
611
- H::combine_contiguous(std::move(hash_state), str.data(), str.size()),
612
- str.size());
610
+ return H::combine_contiguous(std::move(hash_state), str.data(), str.size());
613
611
  }
614
612
 
615
613
  // Support std::wstring, std::u16string and std::u32string.
@@ -620,31 +618,24 @@ template <typename Char, typename Alloc, typename H,
620
618
  H AbslHashValue(
621
619
  H hash_state,
622
620
  const std::basic_string<Char, std::char_traits<Char>, Alloc>& str) {
623
- return H::combine(
624
- H::combine_contiguous(std::move(hash_state), str.data(), str.size()),
625
- str.size());
621
+ return H::combine_contiguous(std::move(hash_state), str.data(), str.size());
626
622
  }
627
623
 
628
- #ifdef ABSL_HAVE_STD_STRING_VIEW
629
-
630
624
  // Support std::wstring_view, std::u16string_view and std::u32string_view.
631
625
  template <typename Char, typename H,
632
626
  typename = absl::enable_if_t<std::is_same<Char, wchar_t>::value ||
633
627
  std::is_same<Char, char16_t>::value ||
634
628
  std::is_same<Char, char32_t>::value>>
635
629
  H AbslHashValue(H hash_state, std::basic_string_view<Char> str) {
636
- return H::combine(
637
- H::combine_contiguous(std::move(hash_state), str.data(), str.size()),
638
- str.size());
630
+ return H::combine_contiguous(std::move(hash_state), str.data(), str.size());
639
631
  }
640
632
 
641
- #endif // ABSL_HAVE_STD_STRING_VIEW
642
-
643
633
  #if defined(__cpp_lib_filesystem) && __cpp_lib_filesystem >= 201703L && \
644
634
  (!defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) || \
645
635
  __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130000) && \
646
636
  (!defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) || \
647
- __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500)
637
+ __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500) && \
638
+ (!defined(__XTENSA__))
648
639
 
649
640
  #define ABSL_INTERNAL_STD_FILESYSTEM_PATH_HASH_AVAILABLE 1
650
641
 
@@ -685,7 +676,7 @@ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
685
676
  for (const auto& t : deque) {
686
677
  hash_state = H::combine(std::move(hash_state), t);
687
678
  }
688
- return H::combine(std::move(hash_state), deque.size());
679
+ return H::combine(std::move(hash_state), WeaklyMixedInteger{deque.size()});
689
680
  }
690
681
 
691
682
  // AbslHashValue for hashing std::forward_list
@@ -697,7 +688,7 @@ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
697
688
  hash_state = H::combine(std::move(hash_state), t);
698
689
  ++size;
699
690
  }
700
- return H::combine(std::move(hash_state), size);
691
+ return H::combine(std::move(hash_state), WeaklyMixedInteger{size});
701
692
  }
702
693
 
703
694
  // AbslHashValue for hashing std::list
@@ -707,7 +698,7 @@ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
707
698
  for (const auto& t : list) {
708
699
  hash_state = H::combine(std::move(hash_state), t);
709
700
  }
710
- return H::combine(std::move(hash_state), list.size());
701
+ return H::combine(std::move(hash_state), WeaklyMixedInteger{list.size()});
711
702
  }
712
703
 
713
704
  // AbslHashValue for hashing std::vector
@@ -719,9 +710,8 @@ template <typename H, typename T, typename Allocator>
719
710
  typename std::enable_if<is_hashable<T>::value && !std::is_same<T, bool>::value,
720
711
  H>::type
721
712
  AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
722
- return H::combine(H::combine_contiguous(std::move(hash_state), vector.data(),
723
- vector.size()),
724
- vector.size());
713
+ return H::combine_contiguous(std::move(hash_state), vector.data(),
714
+ vector.size());
725
715
  }
726
716
 
727
717
  // AbslHashValue special cases for hashing std::vector<bool>
@@ -742,7 +732,8 @@ AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
742
732
  unsigned char c = static_cast<unsigned char>(i);
743
733
  hash_state = combiner.add_buffer(std::move(hash_state), &c, sizeof(c));
744
734
  }
745
- return H::combine(combiner.finalize(std::move(hash_state)), vector.size());
735
+ return H::combine(combiner.finalize(std::move(hash_state)),
736
+ WeaklyMixedInteger{vector.size()});
746
737
  }
747
738
  #else
748
739
  // When not working around the libstdc++ bug above, we still have to contend
@@ -758,7 +749,7 @@ typename std::enable_if<is_hashable<T>::value && std::is_same<T, bool>::value,
758
749
  AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
759
750
  return H::combine(std::move(hash_state),
760
751
  std::hash<std::vector<T, Allocator>>{}(vector),
761
- vector.size());
752
+ WeaklyMixedInteger{vector.size()});
762
753
  }
763
754
  #endif
764
755
 
@@ -775,7 +766,7 @@ AbslHashValue(H hash_state, const std::map<Key, T, Compare, Allocator>& map) {
775
766
  for (const auto& t : map) {
776
767
  hash_state = H::combine(std::move(hash_state), t);
777
768
  }
778
- return H::combine(std::move(hash_state), map.size());
769
+ return H::combine(std::move(hash_state), WeaklyMixedInteger{map.size()});
779
770
  }
780
771
 
781
772
  // AbslHashValue for hashing std::multimap
@@ -788,7 +779,7 @@ AbslHashValue(H hash_state,
788
779
  for (const auto& t : map) {
789
780
  hash_state = H::combine(std::move(hash_state), t);
790
781
  }
791
- return H::combine(std::move(hash_state), map.size());
782
+ return H::combine(std::move(hash_state), WeaklyMixedInteger{map.size()});
792
783
  }
793
784
 
794
785
  // AbslHashValue for hashing std::set
@@ -798,7 +789,7 @@ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
798
789
  for (const auto& t : set) {
799
790
  hash_state = H::combine(std::move(hash_state), t);
800
791
  }
801
- return H::combine(std::move(hash_state), set.size());
792
+ return H::combine(std::move(hash_state), WeaklyMixedInteger{set.size()});
802
793
  }
803
794
 
804
795
  // AbslHashValue for hashing std::multiset
@@ -808,7 +799,7 @@ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
808
799
  for (const auto& t : set) {
809
800
  hash_state = H::combine(std::move(hash_state), t);
810
801
  }
811
- return H::combine(std::move(hash_state), set.size());
802
+ return H::combine(std::move(hash_state), WeaklyMixedInteger{set.size()});
812
803
  }
813
804
 
814
805
  // -----------------------------------------------------------------------------
@@ -822,7 +813,7 @@ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
822
813
  H hash_state, const std::unordered_set<Key, Hash, KeyEqual, Alloc>& s) {
823
814
  return H::combine(
824
815
  H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
825
- s.size());
816
+ WeaklyMixedInteger{s.size()});
826
817
  }
827
818
 
828
819
  // AbslHashValue for hashing std::unordered_multiset
@@ -833,7 +824,7 @@ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
833
824
  const std::unordered_multiset<Key, Hash, KeyEqual, Alloc>& s) {
834
825
  return H::combine(
835
826
  H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
836
- s.size());
827
+ WeaklyMixedInteger{s.size()});
837
828
  }
838
829
 
839
830
  // AbslHashValue for hashing std::unordered_set
@@ -845,7 +836,7 @@ AbslHashValue(H hash_state,
845
836
  const std::unordered_map<Key, T, Hash, KeyEqual, Alloc>& s) {
846
837
  return H::combine(
847
838
  H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
848
- s.size());
839
+ WeaklyMixedInteger{s.size()});
849
840
  }
850
841
 
851
842
  // AbslHashValue for hashing std::unordered_multiset
@@ -857,7 +848,7 @@ AbslHashValue(H hash_state,
857
848
  const std::unordered_multimap<Key, T, Hash, KeyEqual, Alloc>& s) {
858
849
  return H::combine(
859
850
  H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
860
- s.size());
851
+ WeaklyMixedInteger{s.size()});
861
852
  }
862
853
 
863
854
  // -----------------------------------------------------------------------------
@@ -879,7 +870,6 @@ typename std::enable_if<is_hashable<T>::value, H>::type AbslHashValue(
879
870
  return H::combine(std::move(hash_state), opt.has_value());
880
871
  }
881
872
 
882
- // VariantVisitor
883
873
  template <typename H>
884
874
  struct VariantVisitor {
885
875
  H&& hash_state;
@@ -928,8 +918,6 @@ H AbslHashValue(H hash_state, const std::bitset<N>& set) {
928
918
 
929
919
  // -----------------------------------------------------------------------------
930
920
 
931
- // hash_range_or_bytes()
932
- //
933
921
  // Mixes all values in the range [data, data+size) into the hash state.
934
922
  // This overload accepts only uniquely-represented types, and hashes them by
935
923
  // hashing the entire range of bytes.
@@ -940,14 +928,194 @@ hash_range_or_bytes(H hash_state, const T* data, size_t size) {
940
928
  return H::combine_contiguous(std::move(hash_state), bytes, sizeof(T) * size);
941
929
  }
942
930
 
943
- // hash_range_or_bytes()
944
931
  template <typename H, typename T>
945
932
  typename std::enable_if<!is_uniquely_represented<T>::value, H>::type
946
933
  hash_range_or_bytes(H hash_state, const T* data, size_t size) {
947
934
  for (const auto end = data + size; data < end; ++data) {
948
935
  hash_state = H::combine(std::move(hash_state), *data);
949
936
  }
950
- return hash_state;
937
+ return H::combine(std::move(hash_state),
938
+ hash_internal::WeaklyMixedInteger{size});
939
+ }
940
+
941
+ inline constexpr uint64_t kMul = uint64_t{0x79d5f9e0de1e8cf5};
942
+
943
+ // Random data taken from the hexadecimal digits of Pi's fractional component.
944
+ // https://en.wikipedia.org/wiki/Nothing-up-my-sleeve_number
945
+ ABSL_CACHELINE_ALIGNED inline constexpr uint64_t kStaticRandomData[] = {
946
+ 0x243f'6a88'85a3'08d3, 0x1319'8a2e'0370'7344, 0xa409'3822'299f'31d0,
947
+ 0x082e'fa98'ec4e'6c89, 0x4528'21e6'38d0'1377,
948
+ };
949
+
950
+ // Extremely weak mixture of length that is mixed into the state before
951
+ // combining the data. It is used only for small strings. This also ensures that
952
+ // we have high entropy in all bits of the state.
953
+ inline uint64_t PrecombineLengthMix(uint64_t state, size_t len) {
954
+ ABSL_ASSUME(len + sizeof(uint64_t) <= sizeof(kStaticRandomData));
955
+ uint64_t data = absl::base_internal::UnalignedLoad64(
956
+ reinterpret_cast<const unsigned char*>(&kStaticRandomData[0]) + len);
957
+ return state ^ data;
958
+ }
959
+
960
+ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t Mix(uint64_t lhs, uint64_t rhs) {
961
+ // Though the 128-bit product needs multiple instructions on non-x86-64
962
+ // platforms, it is still a good balance between speed and hash quality.
963
+ absl::uint128 m = lhs;
964
+ m *= rhs;
965
+ return Uint128High64(m) ^ Uint128Low64(m);
966
+ }
967
+
968
+ // Reads 8 bytes from p.
969
+ inline uint64_t Read8(const unsigned char* p) {
970
+ // Suppress erroneous array bounds errors on GCC.
971
+ #if defined(__GNUC__) && !defined(__clang__)
972
+ #pragma GCC diagnostic push
973
+ #pragma GCC diagnostic ignored "-Warray-bounds"
974
+ #endif
975
+ return absl::base_internal::UnalignedLoad64(p);
976
+ #if defined(__GNUC__) && !defined(__clang__)
977
+ #pragma GCC diagnostic pop
978
+ #endif
979
+ }
980
+
981
+ // Reads 9 to 16 bytes from p.
982
+ // The first 8 bytes are in .first, and the rest of the bytes are in .second
983
+ // along with duplicated bytes from .first if len<16.
984
+ inline std::pair<uint64_t, uint64_t> Read9To16(const unsigned char* p,
985
+ size_t len) {
986
+ return {Read8(p), Read8(p + len - 8)};
987
+ }
988
+
989
+ // Reads 4 to 8 bytes from p.
990
+ // Bytes are permuted and some input bytes may be duplicated in output.
991
+ inline uint64_t Read4To8(const unsigned char* p, size_t len) {
992
+ // If `len < 8`, we duplicate bytes. We always put low memory at the end.
993
+ // E.g., on little endian platforms:
994
+ // `ABCD` will be read as `ABCDABCD`.
995
+ // `ABCDE` will be read as `BCDEABCD`.
996
+ // `ABCDEF` will be read as `CDEFABCD`.
997
+ // `ABCDEFG` will be read as `DEFGABCD`.
998
+ // `ABCDEFGH` will be read as `EFGHABCD`.
999
+ // We also do not care about endianness. On big-endian platforms, bytes will
1000
+ // be permuted differently. We always shift low memory by 32, because that
1001
+ // can be pipelined earlier. Reading high memory requires computing
1002
+ // `p + len - 4`.
1003
+ uint64_t most_significant =
1004
+ static_cast<uint64_t>(absl::base_internal::UnalignedLoad32(p)) << 32;
1005
+ uint64_t least_significant =
1006
+ absl::base_internal::UnalignedLoad32(p + len - 4);
1007
+ return most_significant | least_significant;
1008
+ }
1009
+
1010
+ // Reads 1 to 3 bytes from p. Some input bytes may be duplicated in output.
1011
+ inline uint32_t Read1To3(const unsigned char* p, size_t len) {
1012
+ // The trick used by this implementation is to avoid branches.
1013
+ // We always read three bytes by duplicating.
1014
+ // E.g.,
1015
+ // `A` is read as `AAA`.
1016
+ // `AB` is read as `ABB`.
1017
+ // `ABC` is read as `ABC`.
1018
+ // We always shift `p[0]` so that it can be pipelined better.
1019
+ // Other bytes require extra computation to find indices.
1020
+ uint32_t mem0 = (static_cast<uint32_t>(p[0]) << 16) | p[len - 1];
1021
+ uint32_t mem1 = static_cast<uint32_t>(p[len / 2]) << 8;
1022
+ return mem0 | mem1;
1023
+ }
1024
+
1025
+ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t CombineRawImpl(uint64_t state,
1026
+ uint64_t value) {
1027
+ return Mix(state ^ value, kMul);
1028
+ }
1029
+
1030
+ // Slow dispatch path for calls to CombineContiguousImpl with a size argument
1031
+ // larger than inlined size. Has the same effect as calling
1032
+ // CombineContiguousImpl() repeatedly with the chunk stride size.
1033
+ uint64_t CombineLargeContiguousImplOn32BitLengthGt8(const unsigned char* first,
1034
+ size_t len, uint64_t state);
1035
+ uint64_t CombineLargeContiguousImplOn64BitLengthGt32(const unsigned char* first,
1036
+ size_t len,
1037
+ uint64_t state);
1038
+
1039
+ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t CombineSmallContiguousImpl(
1040
+ uint64_t state, const unsigned char* first, size_t len) {
1041
+ ABSL_ASSUME(len <= 8);
1042
+ uint64_t v;
1043
+ if (len >= 4) {
1044
+ v = Read4To8(first, len);
1045
+ } else if (len > 0) {
1046
+ v = Read1To3(first, len);
1047
+ } else {
1048
+ // Empty string must modify the state.
1049
+ v = 0x57;
1050
+ }
1051
+ return CombineRawImpl(state, v);
1052
+ }
1053
+
1054
+ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t CombineContiguousImpl9to16(
1055
+ uint64_t state, const unsigned char* first, size_t len) {
1056
+ ABSL_ASSUME(len >= 9);
1057
+ ABSL_ASSUME(len <= 16);
1058
+ // Note: any time one half of the mix function becomes zero it will fail to
1059
+ // incorporate any bits from the other half. However, there is exactly 1 in
1060
+ // 2^64 values for each side that achieve this, and only when the size is
1061
+ // exactly 16 -- for smaller sizes there is an overlapping byte that makes
1062
+ // this impossible unless the seed is *also* incredibly unlucky.
1063
+ auto p = Read9To16(first, len);
1064
+ return Mix(state ^ p.first, kMul ^ p.second);
1065
+ }
1066
+
1067
+ ABSL_ATTRIBUTE_ALWAYS_INLINE inline uint64_t CombineContiguousImpl17to32(
1068
+ uint64_t state, const unsigned char* first, size_t len) {
1069
+ ABSL_ASSUME(len >= 17);
1070
+ ABSL_ASSUME(len <= 32);
1071
+ // Do two mixes of overlapping 16-byte ranges in parallel to minimize
1072
+ // latency.
1073
+ const uint64_t m0 =
1074
+ Mix(Read8(first) ^ kStaticRandomData[1], Read8(first + 8) ^ state);
1075
+
1076
+ const unsigned char* tail_16b_ptr = first + (len - 16);
1077
+ const uint64_t m1 = Mix(Read8(tail_16b_ptr) ^ kStaticRandomData[3],
1078
+ Read8(tail_16b_ptr + 8) ^ state);
1079
+ return m0 ^ m1;
1080
+ }
1081
+
1082
+ // Implementation of the base case for combine_contiguous where we actually
1083
+ // mix the bytes into the state.
1084
+ // Dispatch to different implementations of combine_contiguous depending
1085
+ // on the value of `sizeof(size_t)`.
1086
+ inline uint64_t CombineContiguousImpl(
1087
+ uint64_t state, const unsigned char* first, size_t len,
1088
+ std::integral_constant<int, 4> /* sizeof_size_t */) {
1089
+ // For large values we use CityHash, for small ones we use custom low latency
1090
+ // hash.
1091
+ if (len <= 8) {
1092
+ return CombineSmallContiguousImpl(PrecombineLengthMix(state, len), first,
1093
+ len);
1094
+ }
1095
+ return CombineLargeContiguousImplOn32BitLengthGt8(first, len, state);
1096
+ }
1097
+
1098
+ inline uint64_t CombineContiguousImpl(
1099
+ uint64_t state, const unsigned char* first, size_t len,
1100
+ std::integral_constant<int, 8> /* sizeof_size_t */) {
1101
+ // For large values we use LowLevelHash or CityHash depending on the platform,
1102
+ // for small ones we use custom low latency hash.
1103
+ if (len <= 8) {
1104
+ return CombineSmallContiguousImpl(PrecombineLengthMix(state, len), first,
1105
+ len);
1106
+ }
1107
+ if (len <= 16) {
1108
+ return CombineContiguousImpl9to16(PrecombineLengthMix(state, len), first,
1109
+ len);
1110
+ }
1111
+ if (len <= 32) {
1112
+ return CombineContiguousImpl17to32(PrecombineLengthMix(state, len), first,
1113
+ len);
1114
+ }
1115
+ // We must not mix length into the state here because calling
1116
+ // CombineContiguousImpl twice with PiecewiseChunkSize() must be equivalent
1117
+ // to calling CombineLargeContiguousImpl once with 2 * PiecewiseChunkSize().
1118
+ return CombineLargeContiguousImplOn64BitLengthGt32(first, len, state);
951
1119
  }
952
1120
 
953
1121
  #if defined(ABSL_INTERNAL_LEGACY_HASH_NAMESPACE) && \
@@ -957,8 +1125,6 @@ hash_range_or_bytes(H hash_state, const T* data, size_t size) {
957
1125
  #define ABSL_HASH_INTERNAL_SUPPORT_LEGACY_HASH_ 0
958
1126
  #endif
959
1127
 
960
- // HashSelect
961
- //
962
1128
  // Type trait to select the appropriate hash implementation to use.
963
1129
  // HashSelect::type<T> will give the proper hash implementation, to be invoked
964
1130
  // as:
@@ -968,11 +1134,20 @@ hash_range_or_bytes(H hash_state, const T* data, size_t size) {
968
1134
  // `false`.
969
1135
  struct HashSelect {
970
1136
  private:
1137
+ struct WeaklyMixedIntegerProbe {
1138
+ template <typename H>
1139
+ static H Invoke(H state, WeaklyMixedInteger value) {
1140
+ return hash_internal::hash_weakly_mixed_integer(std::move(state), value);
1141
+ }
1142
+ };
1143
+
971
1144
  struct State : HashStateBase<State> {
972
1145
  static State combine_contiguous(State hash_state, const unsigned char*,
973
1146
  size_t);
974
1147
  using State::HashStateBase::combine_contiguous;
975
1148
  static State combine_raw(State state, uint64_t value);
1149
+ static State combine_weakly_mixed_integer(State hash_state,
1150
+ WeaklyMixedInteger value);
976
1151
  };
977
1152
 
978
1153
  struct UniquelyRepresentedProbe {
@@ -1034,6 +1209,7 @@ struct HashSelect {
1034
1209
  // disjunction provides short circuiting wrt instantiation.
1035
1210
  template <typename T>
1036
1211
  using Apply = absl::disjunction< //
1212
+ Probe<WeaklyMixedIntegerProbe, T>, //
1037
1213
  Probe<UniquelyRepresentedProbe, T>, //
1038
1214
  Probe<HashValueProbe, T>, //
1039
1215
  Probe<LegacyHashProbe, T>, //
@@ -1045,27 +1221,7 @@ template <typename T>
1045
1221
  struct is_hashable
1046
1222
  : std::integral_constant<bool, HashSelect::template Apply<T>::value> {};
1047
1223
 
1048
- // MixingHashState
1049
1224
  class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
1050
- // absl::uint128 is not an alias or a thin wrapper around the intrinsic.
1051
- // We use the intrinsic when available to improve performance.
1052
- #ifdef ABSL_HAVE_INTRINSIC_INT128
1053
- using uint128 = __uint128_t;
1054
- #else // ABSL_HAVE_INTRINSIC_INT128
1055
- using uint128 = absl::uint128;
1056
- #endif // ABSL_HAVE_INTRINSIC_INT128
1057
-
1058
- // Random data taken from the hexadecimal digits of Pi's fractional component.
1059
- // https://en.wikipedia.org/wiki/Nothing-up-my-sleeve_number
1060
- ABSL_CACHELINE_ALIGNED static constexpr uint64_t kStaticRandomData[] = {
1061
- 0x243f'6a88'85a3'08d3, 0x1319'8a2e'0370'7344, 0xa409'3822'299f'31d0,
1062
- 0x082e'fa98'ec4e'6c89, 0x4528'21e6'38d0'1377,
1063
- };
1064
-
1065
- static constexpr uint64_t kMul =
1066
- sizeof(size_t) == 4 ? uint64_t{0xcc9e2d51}
1067
- : uint64_t{0xdcb22ca68cb134ed};
1068
-
1069
1225
  template <typename T>
1070
1226
  using IntegralFastPath =
1071
1227
  conjunction<std::is_integral<T>, is_uniquely_represented<T>,
@@ -1076,8 +1232,6 @@ class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
1076
1232
  MixingHashState(MixingHashState&&) = default;
1077
1233
  MixingHashState& operator=(MixingHashState&&) = default;
1078
1234
 
1079
- // MixingHashState::combine_contiguous()
1080
- //
1081
1235
  // Fundamental base case for hash recursion: mixes the given range of bytes
1082
1236
  // into the hash state.
1083
1237
  static MixingHashState combine_contiguous(MixingHashState hash_state,
@@ -1089,56 +1243,44 @@ class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
1089
1243
  }
1090
1244
  using MixingHashState::HashStateBase::combine_contiguous;
1091
1245
 
1092
- // MixingHashState::hash()
1093
- //
1246
+ template <typename T>
1247
+ static size_t hash(const T& value) {
1248
+ return hash_with_seed(value, Seed());
1249
+ }
1250
+
1094
1251
  // For performance reasons in non-opt mode, we specialize this for
1095
1252
  // integral types.
1096
1253
  // Otherwise we would be instantiating and calling dozens of functions for
1097
1254
  // something that is just one multiplication and a couple xor's.
1098
1255
  // The result should be the same as running the whole algorithm, but faster.
1099
1256
  template <typename T, absl::enable_if_t<IntegralFastPath<T>::value, int> = 0>
1100
- static size_t hash(T value) {
1257
+ static size_t hash_with_seed(T value, size_t seed) {
1101
1258
  return static_cast<size_t>(
1102
- WeakMix(Seed() ^ static_cast<std::make_unsigned_t<T>>(value)));
1259
+ CombineRawImpl(seed, static_cast<std::make_unsigned_t<T>>(value)));
1103
1260
  }
1104
1261
 
1105
- // Overload of MixingHashState::hash()
1106
1262
  template <typename T, absl::enable_if_t<!IntegralFastPath<T>::value, int> = 0>
1107
- static size_t hash(const T& value) {
1108
- return static_cast<size_t>(combine(MixingHashState{}, value).state_);
1263
+ static size_t hash_with_seed(const T& value, size_t seed) {
1264
+ return static_cast<size_t>(combine(MixingHashState{seed}, value).state_);
1109
1265
  }
1110
1266
 
1111
1267
  private:
1112
- // Invoked only once for a given argument; that plus the fact that this is
1113
- // move-only ensures that there is only one non-moved-from object.
1114
- MixingHashState() : state_(Seed()) {}
1115
-
1116
1268
  friend class MixingHashState::HashStateBase;
1117
-
1118
- template <typename CombinerT>
1119
- static MixingHashState RunCombineUnordered(MixingHashState state,
1120
- CombinerT combiner) {
1121
- uint64_t unordered_state = 0;
1122
- combiner(MixingHashState{}, [&](MixingHashState& inner_state) {
1123
- // Add the hash state of the element to the running total, but mix the
1124
- // carry bit back into the low bit. This in intended to avoid losing
1125
- // entropy to overflow, especially when unordered_multisets contain
1126
- // multiple copies of the same value.
1127
- auto element_state = inner_state.state_;
1128
- unordered_state += element_state;
1129
- if (unordered_state < element_state) {
1130
- ++unordered_state;
1131
- }
1132
- inner_state = MixingHashState{};
1133
- });
1134
- return MixingHashState::combine(std::move(state), unordered_state);
1135
- }
1136
-
1269
+ template <typename H>
1270
+ friend H absl::hash_internal::hash_weakly_mixed_integer(H,
1271
+ WeaklyMixedInteger);
1137
1272
  // Allow the HashState type-erasure implementation to invoke
1138
1273
  // RunCombinedUnordered() directly.
1139
1274
  friend class absl::HashState;
1140
1275
  friend struct CombineRaw;
1141
1276
 
1277
+ // For use in Seed().
1278
+ static const void* const kSeed;
1279
+
1280
+ // Invoked only once for a given argument; that plus the fact that this is
1281
+ // move-only ensures that there is only one non-moved-from object.
1282
+ MixingHashState() : state_(Seed()) {}
1283
+
1142
1284
  // Workaround for MSVC bug.
1143
1285
  // We make the type copyable to fix the calling convention, even though we
1144
1286
  // never actually copy it. Keep it private to not affect the public API of the
@@ -1152,182 +1294,37 @@ class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
1152
1294
  // optimize Read1To3 and Read4To8 differently for the string case.
1153
1295
  static MixingHashState combine_raw(MixingHashState hash_state,
1154
1296
  uint64_t value) {
1155
- return MixingHashState(WeakMix(hash_state.state_ ^ value));
1156
- }
1157
-
1158
- // Implementation of the base case for combine_contiguous where we actually
1159
- // mix the bytes into the state.
1160
- // Dispatch to different implementations of the combine_contiguous depending
1161
- // on the value of `sizeof(size_t)`.
1162
- static uint64_t CombineContiguousImpl(uint64_t state,
1163
- const unsigned char* first, size_t len,
1164
- std::integral_constant<int, 4>
1165
- /* sizeof_size_t */);
1166
- static uint64_t CombineContiguousImpl(uint64_t state,
1167
- const unsigned char* first, size_t len,
1168
- std::integral_constant<int, 8>
1169
- /* sizeof_size_t */);
1170
-
1171
- ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t CombineSmallContiguousImpl(
1172
- uint64_t state, const unsigned char* first, size_t len) {
1173
- ABSL_ASSUME(len <= 8);
1174
- uint64_t v;
1175
- if (len >= 4) {
1176
- v = Read4To8(first, len);
1177
- } else if (len > 0) {
1178
- v = Read1To3(first, len);
1179
- } else {
1180
- // Empty ranges have no effect.
1181
- return state;
1182
- }
1183
- return WeakMix(state ^ v);
1184
- }
1185
-
1186
- ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t CombineContiguousImpl9to16(
1187
- uint64_t state, const unsigned char* first, size_t len) {
1188
- ABSL_ASSUME(len >= 9);
1189
- ABSL_ASSUME(len <= 16);
1190
- // Note: any time one half of the mix function becomes zero it will fail to
1191
- // incorporate any bits from the other half. However, there is exactly 1 in
1192
- // 2^64 values for each side that achieve this, and only when the size is
1193
- // exactly 16 -- for smaller sizes there is an overlapping byte that makes
1194
- // this impossible unless the seed is *also* incredibly unlucky.
1195
- auto p = Read9To16(first, len);
1196
- return Mix(state ^ p.first, kMul ^ p.second);
1297
+ return MixingHashState(CombineRawImpl(hash_state.state_, value));
1197
1298
  }
1198
1299
 
1199
- ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t CombineContiguousImpl17to32(
1200
- uint64_t state, const unsigned char* first, size_t len) {
1201
- ABSL_ASSUME(len >= 17);
1202
- ABSL_ASSUME(len <= 32);
1203
- // Do two mixes of overlapping 16-byte ranges in parallel to minimize
1204
- // latency.
1205
- const uint64_t m0 =
1206
- Mix(Read8(first) ^ kStaticRandomData[1], Read8(first + 8) ^ state);
1207
-
1208
- const unsigned char* tail_16b_ptr = first + (len - 16);
1209
- const uint64_t m1 = Mix(Read8(tail_16b_ptr) ^ kStaticRandomData[3],
1210
- Read8(tail_16b_ptr + 8) ^ state);
1211
- return m0 ^ m1;
1300
+ static MixingHashState combine_weakly_mixed_integer(
1301
+ MixingHashState hash_state, WeaklyMixedInteger value) {
1302
+ // Some transformation for the value is needed to make an empty
1303
+ // string/container change the mixing hash state.
1304
+ // We use constant smaller than 8 bits to make compiler use
1305
+ // `add` with an immediate operand with 1 byte value.
1306
+ return MixingHashState{hash_state.state_ + (0x57 + value.value)};
1212
1307
  }
1213
1308
 
1214
- // Slow dispatch path for calls to CombineContiguousImpl with a size argument
1215
- // larger than PiecewiseChunkSize(). Has the same effect as calling
1216
- // CombineContiguousImpl() repeatedly with the chunk stride size.
1217
- static uint64_t CombineLargeContiguousImpl32(uint64_t state,
1218
- const unsigned char* first,
1219
- size_t len);
1220
- static uint64_t CombineLargeContiguousImpl64(uint64_t state,
1221
- const unsigned char* first,
1222
- size_t len);
1223
-
1224
- // Reads 9 to 16 bytes from p.
1225
- // The least significant 8 bytes are in .first, the rest (zero padded) bytes
1226
- // are in .second.
1227
- static std::pair<uint64_t, uint64_t> Read9To16(const unsigned char* p,
1228
- size_t len) {
1229
- uint64_t low_mem = Read8(p);
1230
- uint64_t high_mem = Read8(p + len - 8);
1231
- #ifdef ABSL_IS_LITTLE_ENDIAN
1232
- uint64_t most_significant = high_mem;
1233
- uint64_t least_significant = low_mem;
1234
- #else
1235
- uint64_t most_significant = low_mem;
1236
- uint64_t least_significant = high_mem;
1237
- #endif
1238
- return {least_significant, most_significant};
1239
- }
1240
-
1241
- // Reads 8 bytes from p.
1242
- static uint64_t Read8(const unsigned char* p) {
1243
- // Suppress erroneous array bounds errors on GCC.
1244
- #if defined(__GNUC__) && !defined(__clang__)
1245
- #pragma GCC diagnostic push
1246
- #pragma GCC diagnostic ignored "-Warray-bounds"
1247
- #endif
1248
- return absl::base_internal::UnalignedLoad64(p);
1249
- #if defined(__GNUC__) && !defined(__clang__)
1250
- #pragma GCC diagnostic pop
1251
- #endif
1252
- }
1253
-
1254
- // Reads 4 to 8 bytes from p. Zero pads to fill uint64_t.
1255
- // TODO(b/384509507): consider optimizing this by not requiring the output to
1256
- // be equivalent to an integer load for 4/8 bytes. Currently, we rely on this
1257
- // behavior for the HashConsistentAcrossIntTypes test case. Ditto for
1258
- // Read1To3.
1259
- static uint64_t Read4To8(const unsigned char* p, size_t len) {
1260
- // If `len < 8`, we duplicate bytes in the middle.
1261
- // E.g.:
1262
- // `ABCD` will be read as `ABCDABCD`.
1263
- // `ABCDE` will be read as `ABCDBCDE`.
1264
- // `ABCDEF` will be read as `ABCDCDEF`.
1265
- // `ABCDEFG` will be read as `ABCDDEFG`.
1266
- // We also do not care about endianness. On big-endian platforms, bytes will
1267
- // be shuffled (it's fine). We always shift low memory by 32, because that
1268
- // can be pipelined earlier. Reading high memory requires computing
1269
- // `p + len - 4`.
1270
- uint64_t most_significant =
1271
- static_cast<uint64_t>(absl::base_internal::UnalignedLoad32(p)) << 32;
1272
- uint64_t least_significant =
1273
- absl::base_internal::UnalignedLoad32(p + len - 4);
1274
- return most_significant | least_significant;
1275
- }
1276
-
1277
- // Reads 1 to 3 bytes from p. Zero pads to fill uint32_t.
1278
- static uint32_t Read1To3(const unsigned char* p, size_t len) {
1279
- // The trick used by this implementation is to avoid branches.
1280
- // We always read three bytes by duplicating.
1281
- // E.g.,
1282
- // `A` is read as `AAA`.
1283
- // `AB` is read as `ABB`.
1284
- // `ABC` is read as `ABC`.
1285
- // We always shift `p[0]` so that it can be pipelined better.
1286
- // Other bytes require extra computation to find indices.
1287
- uint32_t mem0 = (static_cast<uint32_t>(p[0]) << 16) | p[len - 1];
1288
- uint32_t mem1 = static_cast<uint32_t>(p[len / 2]) << 8;
1289
- return mem0 | mem1;
1290
- }
1291
-
1292
- ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Mix(uint64_t lhs, uint64_t rhs) {
1293
- // Though the 128-bit product on AArch64 needs two instructions, it is
1294
- // still a good balance between speed and hash quality.
1295
- using MultType =
1296
- absl::conditional_t<sizeof(size_t) == 4, uint64_t, uint128>;
1297
- MultType m = lhs;
1298
- m *= rhs;
1299
- return static_cast<uint64_t>(m ^ (m >> (sizeof(m) * 8 / 2)));
1300
- }
1301
-
1302
- // Slightly lower latency than Mix, but with lower quality. The byte swap
1303
- // helps ensure that low bits still have high quality.
1304
- ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t WeakMix(uint64_t n) {
1305
- // WeakMix doesn't work well on 32-bit platforms so just use Mix.
1306
- if (sizeof(size_t) < 8) return Mix(n, kMul);
1307
- #ifdef __ARM_ACLE
1308
- // gbswap_64 compiles to `rev` on ARM, but `rbit` is better because it
1309
- // reverses bits rather than reversing bytes.
1310
- return __rbitll(n * kMul);
1311
- #else
1312
- return absl::gbswap_64(n * kMul);
1313
- #endif
1314
- }
1315
-
1316
- // An extern to avoid bloat on a direct call to LowLevelHash() with fixed
1317
- // values for both the seed and salt parameters.
1318
- static uint64_t LowLevelHashImpl(const unsigned char* data, size_t len);
1319
-
1320
- ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Hash64(const unsigned char* data,
1321
- size_t len) {
1322
- #ifdef ABSL_HAVE_INTRINSIC_INT128
1323
- return LowLevelHashImpl(data, len);
1324
- #else
1325
- return hash_internal::CityHash64(reinterpret_cast<const char*>(data), len);
1326
- #endif
1309
+ template <typename CombinerT>
1310
+ static MixingHashState RunCombineUnordered(MixingHashState state,
1311
+ CombinerT combiner) {
1312
+ uint64_t unordered_state = 0;
1313
+ combiner(MixingHashState{}, [&](MixingHashState& inner_state) {
1314
+ // Add the hash state of the element to the running total, but mix the
1315
+ // carry bit back into the low bit. This in intended to avoid losing
1316
+ // entropy to overflow, especially when unordered_multisets contain
1317
+ // multiple copies of the same value.
1318
+ auto element_state = inner_state.state_;
1319
+ unordered_state += element_state;
1320
+ if (unordered_state < element_state) {
1321
+ ++unordered_state;
1322
+ }
1323
+ inner_state = MixingHashState{};
1324
+ });
1325
+ return MixingHashState::combine(std::move(state), unordered_state);
1327
1326
  }
1328
1327
 
1329
- // Seed()
1330
- //
1331
1328
  // A non-deterministic seed.
1332
1329
  //
1333
1330
  // The current purpose of this seed is to generate non-deterministic results
@@ -1342,64 +1339,23 @@ class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
1342
1339
  //
1343
1340
  // On other platforms this is still going to be non-deterministic but most
1344
1341
  // probably per-build and not per-process.
1345
- ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Seed() {
1342
+ ABSL_ATTRIBUTE_ALWAYS_INLINE static size_t Seed() {
1346
1343
  #if (!defined(__clang__) || __clang_major__ > 11) && \
1347
1344
  (!defined(__apple_build_version__) || \
1348
1345
  __apple_build_version__ >= 19558921) // Xcode 12
1349
- return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(&kSeed));
1346
+ return static_cast<size_t>(reinterpret_cast<uintptr_t>(&kSeed));
1350
1347
  #else
1351
1348
  // Workaround the absence of
1352
1349
  // https://github.com/llvm/llvm-project/commit/bc15bf66dcca76cc06fe71fca35b74dc4d521021.
1353
- return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(kSeed));
1350
+ return static_cast<size_t>(reinterpret_cast<uintptr_t>(kSeed));
1354
1351
  #endif
1355
1352
  }
1356
- static const void* const kSeed;
1357
1353
 
1358
1354
  uint64_t state_;
1359
1355
  };
1360
1356
 
1361
- // MixingHashState::CombineContiguousImpl()
1362
- inline uint64_t MixingHashState::CombineContiguousImpl(
1363
- uint64_t state, const unsigned char* first, size_t len,
1364
- std::integral_constant<int, 4> /* sizeof_size_t */) {
1365
- // For large values we use CityHash, for small ones we just use a
1366
- // multiplicative hash.
1367
- if (len <= 8) {
1368
- return CombineSmallContiguousImpl(state, first, len);
1369
- }
1370
- if (ABSL_PREDICT_TRUE(len <= PiecewiseChunkSize())) {
1371
- return Mix(state ^ hash_internal::CityHash32(
1372
- reinterpret_cast<const char*>(first), len),
1373
- kMul);
1374
- }
1375
- return CombineLargeContiguousImpl32(state, first, len);
1376
- }
1377
-
1378
- // Overload of MixingHashState::CombineContiguousImpl()
1379
- inline uint64_t MixingHashState::CombineContiguousImpl(
1380
- uint64_t state, const unsigned char* first, size_t len,
1381
- std::integral_constant<int, 8> /* sizeof_size_t */) {
1382
- // For large values we use LowLevelHash or CityHash depending on the platform,
1383
- // for small ones we just use a multiplicative hash.
1384
- if (len <= 8) {
1385
- return CombineSmallContiguousImpl(state, first, len);
1386
- }
1387
- if (len <= 16) {
1388
- return CombineContiguousImpl9to16(state, first, len);
1389
- }
1390
- if (len <= 32) {
1391
- return CombineContiguousImpl17to32(state, first, len);
1392
- }
1393
- if (ABSL_PREDICT_TRUE(len <= PiecewiseChunkSize())) {
1394
- return Mix(state ^ Hash64(first, len), kMul);
1395
- }
1396
- return CombineLargeContiguousImpl64(state, first, len);
1397
- }
1398
-
1399
1357
  struct AggregateBarrier {};
1400
1358
 
1401
- // HashImpl
1402
-
1403
1359
  // Add a private base class to make sure this type is not an aggregate.
1404
1360
  // Aggregates can be aggregate initialized even if the default constructor is
1405
1361
  // deleted.
@@ -1414,6 +1370,13 @@ struct HashImpl {
1414
1370
  size_t operator()(const T& value) const {
1415
1371
  return MixingHashState::hash(value);
1416
1372
  }
1373
+
1374
+ private:
1375
+ friend struct HashWithSeed;
1376
+
1377
+ size_t hash_with_seed(const T& value, size_t seed) const {
1378
+ return MixingHashState::hash_with_seed(value, seed);
1379
+ }
1417
1380
  };
1418
1381
 
1419
1382
  template <typename T>
@@ -1428,14 +1391,12 @@ H HashStateBase<H>::combine(H state, const T& value, const Ts&... values) {
1428
1391
  values...);
1429
1392
  }
1430
1393
 
1431
- // HashStateBase::combine_contiguous()
1432
1394
  template <typename H>
1433
1395
  template <typename T>
1434
1396
  H HashStateBase<H>::combine_contiguous(H state, const T* data, size_t size) {
1435
1397
  return hash_internal::hash_range_or_bytes(std::move(state), data, size);
1436
1398
  }
1437
1399
 
1438
- // HashStateBase::combine_unordered()
1439
1400
  template <typename H>
1440
1401
  template <typename I>
1441
1402
  H HashStateBase<H>::combine_unordered(H state, I begin, I end) {
@@ -1443,7 +1404,6 @@ H HashStateBase<H>::combine_unordered(H state, I begin, I end) {
1443
1404
  CombineUnorderedCallback<I>{begin, end});
1444
1405
  }
1445
1406
 
1446
- // HashStateBase::PiecewiseCombiner::add_buffer()
1447
1407
  template <typename H>
1448
1408
  H PiecewiseCombiner::add_buffer(H state, const unsigned char* data,
1449
1409
  size_t size) {
@@ -1453,7 +1413,7 @@ H PiecewiseCombiner::add_buffer(H state, const unsigned char* data,
1453
1413
  position_ += size;
1454
1414
  return state;
1455
1415
  }
1456
-
1416
+ added_something_ = true;
1457
1417
  // If the buffer is partially filled we need to complete the buffer
1458
1418
  // and hash it.
1459
1419
  if (position_ != 0) {
@@ -1476,10 +1436,14 @@ H PiecewiseCombiner::add_buffer(H state, const unsigned char* data,
1476
1436
  return state;
1477
1437
  }
1478
1438
 
1479
- // HashStateBase::PiecewiseCombiner::finalize()
1480
1439
  template <typename H>
1481
1440
  H PiecewiseCombiner::finalize(H state) {
1482
- // Hash the remainder left in the buffer, which may be empty
1441
+ // Do not call combine_contiguous with empty remainder since it is modifying
1442
+ // state.
1443
+ if (added_something_ && position_ == 0) {
1444
+ return state;
1445
+ }
1446
+ // We still call combine_contiguous for the entirely empty buffer.
1483
1447
  return H::combine_contiguous(std::move(state), buf_, position_);
1484
1448
  }
1485
1449