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.
- package/README.md +60 -4
- package/binding.gyp +5 -1
- package/lib/addon.cc +4 -0
- package/lib/new.cc +1 -246
- package/lib/pattern.cc +252 -0
- package/lib/pattern.h +10 -0
- package/lib/set.cc +777 -0
- package/lib/wrapped_re2_set.h +42 -0
- package/package.json +21 -9
- package/re2.d.ts +46 -9
- package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
- package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
- package/vendor/abseil-cpp/CMake/README.md +2 -2
- package/vendor/abseil-cpp/CMakeLists.txt +3 -3
- package/vendor/abseil-cpp/MODULE.bazel +6 -9
- package/vendor/abseil-cpp/README.md +6 -8
- package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
- package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
- package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
- package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
- package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
- package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
- package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
- package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
- package/vendor/abseil-cpp/absl/base/config.h +22 -129
- package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
- package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
- package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
- package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
- package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
- package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
- package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
- package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
- package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
- package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
- package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
- package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
- package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
- package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
- package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
- package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
- package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
- package/vendor/abseil-cpp/absl/base/options.h +3 -80
- package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
- package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
- package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
- package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
- package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
- package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
- package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
- package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
- package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
- package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
- package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
- package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
- package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
- package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
- package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
- package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
- package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
- package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
- package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
- package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
- package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
- package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
- package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
- package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
- package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
- package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
- package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
- package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
- package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
- package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
- package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
- package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
- package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
- package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
- package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
- package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
- package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
- package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
- package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
- package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
- package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
- package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
- package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
- package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
- package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
- package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
- package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
- package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
- package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
- package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
- package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
- package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
- package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
- package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
- package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
- package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
- package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
- package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
- package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
- package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
- package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
- package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
- package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
- package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
- package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
- package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
- package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
- package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
- package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
- package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
- package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
- package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
- package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
- package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
- package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
- package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
- package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
- package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
- package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
- package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
- package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
- package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
- package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
- package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
- package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
- package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
- package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
- package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
- package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
- package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
- package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
- package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
- package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
- package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
- package/vendor/abseil-cpp/absl/log/check.h +2 -1
- package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
- package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
- package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
- package/vendor/abseil-cpp/absl/log/globals.h +4 -5
- package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
- package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
- package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
- package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
- package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
- package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
- package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
- package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
- package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
- package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
- package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
- package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
- package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
- package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
- package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
- package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
- package/vendor/abseil-cpp/absl/log/log.h +48 -35
- package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
- package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
- package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
- package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
- package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
- package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
- package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
- package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
- package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
- package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
- package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
- package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
- package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
- package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
- package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
- package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
- package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
- package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
- package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
- package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
- package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
- package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
- package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
- package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
- package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
- package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
- package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
- package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
- package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
- package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
- package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
- package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
- package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
- package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
- package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
- package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
- package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
- package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
- package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
- package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
- package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
- package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
- package/vendor/abseil-cpp/absl/random/random.h +88 -53
- package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
- package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
- package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
- package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
- package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
- package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
- package/vendor/abseil-cpp/absl/status/status.cc +4 -8
- package/vendor/abseil-cpp/absl/status/status.h +8 -8
- package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
- package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
- package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
- package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
- package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
- package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
- package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
- package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
- package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
- package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
- package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
- package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
- package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
- package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
- package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
- package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
- package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
- package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
- package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
- package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
- package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
- package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
- package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
- package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
- package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
- package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
- package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
- package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
- package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
- package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
- package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
- package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
- package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
- package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
- package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
- package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
- package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
- package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
- package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
- package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
- package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
- package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
- package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
- package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
- package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
- package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
- package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
- package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
- package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
- package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
- package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
- package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
- package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
- package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
- package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
- package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
- package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
- package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
- package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
- package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
- package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
- package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
- package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
- package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
- package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
- package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
- package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
- package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
- package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
- package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
- package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
- package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
- package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
- package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
- package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
- package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
- package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
- package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
- package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
- package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
- package/vendor/abseil-cpp/absl/time/time.h +24 -18
- package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
- package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
- package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
- package/vendor/abseil-cpp/absl/types/any.h +9 -484
- package/vendor/abseil-cpp/absl/types/optional.h +7 -747
- package/vendor/abseil-cpp/absl/types/span.h +46 -19
- package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
- package/vendor/abseil-cpp/absl/types/variant.h +5 -784
- package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
- package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
- package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
- package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
- package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
- package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
- package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
- package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
- package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
- package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
- package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
- package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
- package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
- package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
- package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
- package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
- package/vendor/re2/.bazelrc +4 -4
- package/vendor/re2/.bcr/metadata.template.json +16 -0
- package/vendor/re2/.bcr/presubmit.yml +57 -0
- package/vendor/re2/.bcr/source.template.json +5 -0
- package/vendor/re2/.github/bazel.sh +1 -7
- package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
- package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
- package/vendor/re2/.github/workflows/ci.yml +5 -6
- package/vendor/re2/.github/workflows/pages.yml +3 -3
- package/vendor/re2/.github/workflows/python.yml +29 -24
- package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
- package/vendor/re2/.github/workflows/release.yml +15 -4
- package/vendor/re2/BUILD.bazel +25 -0
- package/vendor/re2/CMakeLists.txt +100 -85
- package/vendor/re2/CONTRIBUTING.md +0 -1
- package/vendor/re2/MODULE.bazel +10 -10
- package/vendor/re2/Makefile +1 -1
- package/vendor/re2/README.md +259 -0
- package/vendor/re2/python/BUILD.bazel +8 -0
- package/vendor/re2/python/re2.py +1 -1
- package/vendor/re2/python/re2_test.py +6 -0
- package/vendor/re2/python/setup.py +3 -3
- package/vendor/re2/re2/bitmap256.cc +3 -4
- package/vendor/re2/re2/bitstate.cc +15 -10
- package/vendor/re2/re2/dfa.cc +1 -2
- package/vendor/re2/re2/parse.cc +3 -4
- package/vendor/re2/re2/prog.cc +1 -2
- package/vendor/re2/re2/prog.h +1 -0
- package/vendor/re2/re2/re2.cc +5 -0
- package/vendor/re2/re2/re2.h +9 -9
- package/vendor/re2/re2/set.cc +6 -0
- package/vendor/re2/re2/set.h +5 -0
- package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
- package/vendor/re2/re2/testing/re2_test.cc +8 -0
- package/vendor/re2/re2/testing/set_test.cc +5 -0
- package/vendor/re2/re2/walker-inl.h +1 -1
- package/vendor/abseil-cpp/WORKSPACE +0 -76
- package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
- package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
- package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
- package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
- package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
- package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
- package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
- package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
- package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
- package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
- package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
- package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
- package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
- package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
- package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
- package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
- package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
- package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
- package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
- package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
- package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
- package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
- package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
- package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
- package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
- package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
- package/vendor/re2/.github/workflows/pr.yml +0 -34
- 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/
|
|
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()
|
|
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
|
-
//
|
|
165
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
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<
|
|
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.
|
|
494
|
-
//
|
|
495
|
-
//
|
|
496
|
-
return H::combine(std::move(hash_state), 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::
|
|
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::
|
|
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::
|
|
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::
|
|
723
|
-
|
|
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)),
|
|
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
|
-
|
|
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
|
|
1257
|
+
static size_t hash_with_seed(T value, size_t seed) {
|
|
1101
1258
|
return static_cast<size_t>(
|
|
1102
|
-
|
|
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
|
|
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
|
-
|
|
1119
|
-
|
|
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(
|
|
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
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
//
|
|
1204
|
-
//
|
|
1205
|
-
|
|
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
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
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
|
|
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<
|
|
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<
|
|
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
|
-
//
|
|
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
|
|