re2 1.24.0 → 1.25.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/LICENSE +15 -20
- package/README.md +63 -4
- package/binding.gyp +1 -2
- package/lib/addon.cc +9 -5
- package/lib/exec.cc +4 -4
- package/lib/match.cc +4 -4
- package/lib/new.cc +6 -6
- package/lib/pattern.cc +148 -1
- package/lib/replace.cc +5 -4
- package/lib/search.cc +1 -1
- package/lib/set.cc +85 -10
- package/lib/test.cc +1 -1
- package/lib/unicode_properties.h +15840 -0
- package/lib/wrapped_re2.h +40 -4
- package/lib/wrapped_re2_set.h +3 -1
- package/llms-full.txt +497 -0
- package/llms.txt +135 -0
- package/package.json +19 -11
- package/re2.d.ts +2 -0
- package/re2.js +1 -0
- package/vendor/abseil-cpp/CMake/AbseilDll.cmake +87 -74
- package/vendor/abseil-cpp/CMakeLists.txt +3 -3
- package/vendor/abseil-cpp/FAQ.md +130 -79
- package/vendor/abseil-cpp/MODULE.bazel +6 -7
- package/vendor/abseil-cpp/absl/BUILD.bazel +6 -0
- package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +4 -0
- package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +4 -0
- package/vendor/abseil-cpp/absl/algorithm/algorithm.h +34 -2
- package/vendor/abseil-cpp/absl/algorithm/container.h +164 -17
- package/vendor/abseil-cpp/absl/algorithm/container_test.cc +390 -13
- package/vendor/abseil-cpp/absl/base/BUILD.bazel +53 -6
- package/vendor/abseil-cpp/absl/base/CMakeLists.txt +28 -4
- package/vendor/abseil-cpp/absl/base/attributes.h +61 -42
- package/vendor/abseil-cpp/absl/base/call_once.h +1 -0
- package/vendor/abseil-cpp/absl/base/casts.h +8 -1
- package/vendor/abseil-cpp/absl/base/casts_test.cc +3 -6
- package/vendor/abseil-cpp/absl/base/config.h +53 -9
- package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +9 -9
- package/vendor/abseil-cpp/absl/base/fast_type_id.h +30 -2
- package/vendor/abseil-cpp/absl/base/fast_type_id_test.cc +3 -0
- package/vendor/abseil-cpp/absl/base/internal/exception_safety_testing.h +15 -12
- package/vendor/abseil-cpp/absl/base/internal/hardening.h +136 -0
- package/vendor/abseil-cpp/absl/base/internal/hardening_test.cc +168 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +2 -2
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -0
- package/vendor/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
- package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +1 -2
- package/vendor/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
- package/vendor/abseil-cpp/absl/base/macros.h +36 -20
- package/vendor/abseil-cpp/absl/base/nullability.h +4 -3
- package/vendor/abseil-cpp/absl/base/optimization.h +3 -2
- package/vendor/abseil-cpp/absl/base/optimization_test.cc +4 -3
- package/vendor/abseil-cpp/absl/base/options.h +55 -1
- package/vendor/abseil-cpp/absl/base/policy_checks.h +5 -5
- package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
- package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
- package/vendor/abseil-cpp/absl/base/throw_delegate_test.cc +19 -28
- package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +2 -0
- package/vendor/abseil-cpp/absl/cleanup/cleanup.h +3 -2
- package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
- package/vendor/abseil-cpp/absl/container/BUILD.bazel +19 -7
- package/vendor/abseil-cpp/absl/container/CMakeLists.txt +6 -5
- package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +3 -5
- package/vendor/abseil-cpp/absl/container/btree_set.h +5 -5
- package/vendor/abseil-cpp/absl/container/btree_test.cc +11 -14
- package/vendor/abseil-cpp/absl/container/chunked_queue.h +8 -6
- package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +5 -5
- package/vendor/abseil-cpp/absl/container/fixed_array.h +14 -13
- package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +3 -3
- package/vendor/abseil-cpp/absl/container/flat_hash_map.h +18 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +34 -1
- package/vendor/abseil-cpp/absl/container/flat_hash_set.h +21 -7
- package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +39 -7
- package/vendor/abseil-cpp/absl/container/inlined_vector.h +29 -29
- package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +2 -2
- package/vendor/abseil-cpp/absl/container/internal/btree.h +32 -24
- package/vendor/abseil-cpp/absl/container/internal/btree_container.h +16 -17
- package/vendor/abseil-cpp/absl/container/internal/common.h +6 -5
- package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +16 -16
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +13 -13
- package/vendor/abseil-cpp/absl/container/internal/container_memory.h +41 -31
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +2 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +4 -4
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +3 -3
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +27 -19
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -2
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +0 -17
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +12 -30
- package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +28 -28
- package/vendor/abseil-cpp/absl/container/internal/layout.h +13 -13
- package/vendor/abseil-cpp/absl/container/internal/layout_test.cc +3 -2
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +60 -62
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +59 -39
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +619 -326
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +25 -2
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +4 -4
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +575 -159
- package/vendor/abseil-cpp/absl/container/linked_hash_map.h +2 -2
- package/vendor/abseil-cpp/absl/container/node_hash_map.h +27 -15
- package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +34 -0
- package/vendor/abseil-cpp/absl/container/node_hash_set.h +25 -11
- package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +39 -7
- package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +7 -4
- package/vendor/abseil-cpp/absl/crc/BUILD.bazel +0 -1
- package/vendor/abseil-cpp/absl/crc/CMakeLists.txt +2 -3
- package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +2 -1
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +6 -6
- package/vendor/abseil-cpp/absl/crc/internal/crc.cc +4 -6
- package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
- package/vendor/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
- package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +143 -81
- package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +9 -31
- package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +3 -33
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +2 -1
- package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +12 -2
- package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +2 -3
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -0
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +4 -0
- package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +46 -36
- package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +18 -58
- package/vendor/abseil-cpp/absl/debugging/stacktrace.h +5 -48
- package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +10 -124
- package/vendor/abseil-cpp/absl/debugging/symbolize.cc +20 -2
- package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +58 -106
- package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +37 -36
- package/vendor/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
- package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -3
- package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +1 -1
- package/vendor/abseil-cpp/absl/flags/commandlineflag.h +8 -6
- package/vendor/abseil-cpp/absl/flags/commandlineflag_test.cc +1 -1
- package/vendor/abseil-cpp/absl/flags/flag_benchmark.cc +5 -5
- package/vendor/abseil-cpp/absl/flags/flag_test.cc +30 -30
- package/vendor/abseil-cpp/absl/flags/internal/flag.cc +4 -4
- package/vendor/abseil-cpp/absl/flags/internal/flag.h +6 -6
- package/vendor/abseil-cpp/absl/flags/marshalling.h +2 -28
- package/vendor/abseil-cpp/absl/flags/marshalling_test.cc +12 -11
- package/vendor/abseil-cpp/absl/flags/reflection_test.cc +1 -1
- package/vendor/abseil-cpp/absl/functional/BUILD.bazel +26 -1
- package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +29 -1
- package/vendor/abseil-cpp/absl/functional/any_invocable.h +13 -14
- package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +46 -47
- package/vendor/abseil-cpp/absl/functional/bind_back.h +79 -0
- package/vendor/abseil-cpp/absl/functional/bind_back_test.cc +237 -0
- package/vendor/abseil-cpp/absl/functional/bind_front.h +7 -1
- package/vendor/abseil-cpp/absl/functional/bind_front_test.cc +4 -4
- package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +2 -2
- package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +28 -28
- package/vendor/abseil-cpp/absl/functional/internal/back_binder.h +95 -0
- package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
- package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
- package/vendor/abseil-cpp/absl/functional/overload_test.cc +13 -13
- package/vendor/abseil-cpp/absl/hash/BUILD.bazel +1 -2
- package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +1 -2
- package/vendor/abseil-cpp/absl/hash/hash.h +1 -1
- package/vendor/abseil-cpp/absl/hash/hash_test.cc +14 -20
- package/vendor/abseil-cpp/absl/hash/hash_testing.h +11 -9
- package/vendor/abseil-cpp/absl/hash/internal/city.cc +39 -51
- package/vendor/abseil-cpp/absl/hash/internal/hash.cc +165 -47
- package/vendor/abseil-cpp/absl/hash/internal/hash.h +86 -27
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +36 -1
- package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +8 -5
- package/vendor/abseil-cpp/absl/log/BUILD.bazel +5 -2
- package/vendor/abseil-cpp/absl/log/CMakeLists.txt +5 -3
- package/vendor/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
- package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +15 -1
- package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -4
- package/vendor/abseil-cpp/absl/log/internal/log_message.h +14 -0
- package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -1
- package/vendor/abseil-cpp/absl/log/internal/proto.cc +13 -0
- package/vendor/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
- package/vendor/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
- package/vendor/abseil-cpp/absl/log/internal/structured_proto_test.cc +3 -3
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +2 -2
- package/vendor/abseil-cpp/absl/log/internal/vlog_config_benchmark.cc +3 -3
- package/vendor/abseil-cpp/absl/log/log_format_test.cc +19 -2
- package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +18 -0
- package/vendor/abseil-cpp/absl/log/log_streamer.h +29 -2
- package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +18 -0
- package/vendor/abseil-cpp/absl/log/scoped_mock_log_test.cc +1 -1
- package/vendor/abseil-cpp/absl/log/vlog_is_on.h +0 -2
- package/vendor/abseil-cpp/absl/log/vlog_is_on_test.cc +6 -5
- package/vendor/abseil-cpp/absl/memory/memory.h +55 -5
- package/vendor/abseil-cpp/absl/memory/memory_test.cc +55 -1
- package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/internal/requires.h +1 -1
- package/vendor/abseil-cpp/absl/meta/type_traits.h +119 -55
- package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +7 -7
- package/vendor/abseil-cpp/absl/numeric/int128_test.cc +6 -6
- package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +3 -1
- package/vendor/abseil-cpp/absl/profiling/hashtable.cc +0 -4
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +32 -33
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +25 -2
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +8 -5
- package/vendor/abseil-cpp/absl/random/BUILD.bazel +13 -1
- package/vendor/abseil-cpp/absl/random/CMakeLists.txt +23 -2
- package/vendor/abseil-cpp/absl/random/benchmarks.cc +1 -1
- package/vendor/abseil-cpp/absl/random/beta_distribution.h +2 -2
- package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
- package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +43 -0
- package/vendor/abseil-cpp/absl/random/discrete_distribution.h +1 -1
- package/vendor/abseil-cpp/absl/random/distributions.h +17 -17
- package/vendor/abseil-cpp/absl/random/distributions_test.cc +4 -4
- package/vendor/abseil-cpp/absl/random/exponential_distribution.h +1 -1
- package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +4 -2
- package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
- package/vendor/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
- package/vendor/abseil-cpp/absl/random/internal/generate_real.h +1 -1
- package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
- package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc +3 -2
- package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +14 -40
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +2 -2
- package/vendor/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
- package/vendor/abseil-cpp/absl/random/internal/pcg_engine_test.cc +3 -2
- package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
- package/vendor/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
- package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +3 -2
- package/vendor/abseil-cpp/absl/random/internal/randen_test.cc +3 -2
- package/vendor/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
- package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +4 -4
- package/vendor/abseil-cpp/absl/random/internal/seed_material.h +2 -1
- package/vendor/abseil-cpp/absl/random/internal/traits.h +21 -0
- package/vendor/abseil-cpp/absl/random/internal/traits_test.cc +5 -0
- package/vendor/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
- package/vendor/abseil-cpp/absl/random/internal/uniform_helper_test.cc +2 -1
- package/vendor/abseil-cpp/absl/random/mocking_access.h +74 -0
- package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +9 -19
- package/vendor/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- package/vendor/abseil-cpp/absl/status/BUILD.bazel +81 -0
- package/vendor/abseil-cpp/absl/status/CMakeLists.txt +91 -0
- package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
- package/vendor/abseil-cpp/absl/status/internal/status_internal.h +26 -2
- package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +22 -8
- package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +43 -43
- package/vendor/abseil-cpp/absl/status/status.cc +62 -70
- package/vendor/abseil-cpp/absl/status/status.h +249 -23
- package/vendor/abseil-cpp/absl/status/status_benchmark.cc +12 -0
- package/vendor/abseil-cpp/absl/status/status_builder.cc +196 -0
- package/vendor/abseil-cpp/absl/status/status_builder.h +978 -0
- package/vendor/abseil-cpp/absl/status/status_builder_test.cc +380 -0
- package/vendor/abseil-cpp/absl/status/status_macros.h +484 -0
- package/vendor/abseil-cpp/absl/status/status_macros_test.cc +634 -0
- package/vendor/abseil-cpp/absl/status/status_matchers.h +2 -1
- package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +3 -4
- package/vendor/abseil-cpp/absl/status/status_payload_printer.h +3 -2
- package/vendor/abseil-cpp/absl/status/status_test.cc +443 -13
- package/vendor/abseil-cpp/absl/status/statusor.h +69 -36
- package/vendor/abseil-cpp/absl/status/statusor_test.cc +132 -35
- package/vendor/abseil-cpp/absl/strings/BUILD.bazel +42 -7
- package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +33 -4
- package/vendor/abseil-cpp/absl/strings/ascii.h +1 -2
- package/vendor/abseil-cpp/absl/strings/atod_manual_test.cc +5 -5
- package/vendor/abseil-cpp/absl/strings/cord.cc +26 -7
- package/vendor/abseil-cpp/absl/strings/cord.h +23 -13
- package/vendor/abseil-cpp/absl/strings/cord_buffer.h +4 -2
- package/vendor/abseil-cpp/absl/strings/cord_test.cc +85 -9
- package/vendor/abseil-cpp/absl/strings/escaping.cc +183 -35
- package/vendor/abseil-cpp/absl/strings/escaping.h +12 -2
- package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +1 -3
- package/vendor/abseil-cpp/absl/strings/escaping_test.cc +22 -18
- package/vendor/abseil-cpp/absl/strings/has_absl_stringify_test.cc +2 -2
- package/vendor/abseil-cpp/absl/strings/has_ostream_operator_test.cc +2 -2
- package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +10 -10
- package/vendor/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
- package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
- package/vendor/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
- package/vendor/abseil-cpp/absl/strings/internal/escaping.h +2 -26
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +23 -2
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +6 -2
- package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -24
- package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized_test.cc +16 -41
- package/vendor/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
- package/vendor/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +12 -20
- package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +510 -307
- package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +0 -1
- package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +9 -10
- package/vendor/abseil-cpp/absl/strings/internal/string_constant_test.cc +6 -5
- package/vendor/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
- package/vendor/abseil-cpp/absl/strings/internal/stringify_stream.h +119 -0
- package/vendor/abseil-cpp/absl/strings/internal/stringify_stream_test.cc +111 -0
- package/vendor/abseil-cpp/absl/strings/numbers.cc +406 -0
- package/vendor/abseil-cpp/absl/strings/numbers.h +4 -0
- package/vendor/abseil-cpp/absl/strings/numbers_test.cc +33 -0
- package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +10 -6
- package/vendor/abseil-cpp/absl/strings/str_cat.h +36 -1
- package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +28 -0
- package/vendor/abseil-cpp/absl/strings/str_join_test.cc +4 -4
- package/vendor/abseil-cpp/absl/strings/str_split.h +11 -6
- package/vendor/abseil-cpp/absl/strings/str_split_test.cc +13 -0
- package/vendor/abseil-cpp/absl/strings/substitute.h +2 -2
- package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +21 -0
- package/vendor/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
- package/vendor/abseil-cpp/absl/synchronization/mutex.cc +13 -0
- package/vendor/abseil-cpp/absl/synchronization/mutex.h +32 -2
- package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +17 -3
- package/vendor/abseil-cpp/absl/time/BUILD.bazel +80 -0
- package/vendor/abseil-cpp/absl/time/CMakeLists.txt +73 -0
- package/vendor/abseil-cpp/absl/time/clock.h +3 -0
- package/vendor/abseil-cpp/absl/time/clock_interface.cc +71 -0
- package/vendor/abseil-cpp/absl/time/clock_interface.h +93 -0
- package/vendor/abseil-cpp/absl/time/clock_interface_test.cc +128 -0
- package/vendor/abseil-cpp/absl/time/format.cc +3 -10
- package/vendor/abseil-cpp/absl/time/format_test.cc +12 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +90 -89
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +80 -5
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +1 -2
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +3 -3
- package/vendor/abseil-cpp/absl/time/simulated_clock.cc +225 -0
- package/vendor/abseil-cpp/absl/time/simulated_clock.h +109 -0
- package/vendor/abseil-cpp/absl/time/simulated_clock_test.cc +614 -0
- package/vendor/abseil-cpp/absl/types/BUILD.bazel +116 -0
- package/vendor/abseil-cpp/absl/types/CMakeLists.txt +100 -0
- package/vendor/abseil-cpp/absl/types/any.h +26 -4
- package/vendor/abseil-cpp/absl/types/any_span.h +1067 -0
- package/vendor/abseil-cpp/absl/types/any_span_benchmark.cc +258 -0
- package/vendor/abseil-cpp/absl/types/any_span_test.cc +1210 -0
- package/vendor/abseil-cpp/absl/types/compare.h +4 -4
- package/vendor/abseil-cpp/absl/types/internal/any_span.h +477 -0
- package/vendor/abseil-cpp/absl/types/internal/span.h +5 -6
- package/vendor/abseil-cpp/absl/types/optional.h +30 -3
- package/vendor/abseil-cpp/absl/types/optional_ref.h +295 -0
- package/vendor/abseil-cpp/absl/types/optional_ref_test.cc +370 -0
- package/vendor/abseil-cpp/absl/types/source_location.cc +18 -0
- package/vendor/abseil-cpp/absl/types/source_location.h +172 -0
- package/vendor/abseil-cpp/absl/types/source_location_test.cc +139 -0
- package/vendor/abseil-cpp/absl/types/span.h +19 -23
- package/vendor/abseil-cpp/absl/types/variant.h +75 -18
- package/vendor/abseil-cpp/absl/types/variant_test.cc +23 -23
- package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -0
- package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/utility/utility.h +99 -16
- package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -0
- package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +10 -4
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +13 -6
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +10 -4
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +12 -5
- package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +9 -2
- package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
- package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +10 -3
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +8 -2
- package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +4 -3
- package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +2 -2
- package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -1
- package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -1
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +0 -118
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +0 -71
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +0 -97
|
@@ -390,7 +390,7 @@ struct SkipWhitespace {
|
|
|
390
390
|
template <typename T>
|
|
391
391
|
using EnableSplitIfString =
|
|
392
392
|
typename std::enable_if<std::is_same<T, std::string>::value ||
|
|
393
|
-
|
|
393
|
+
std::is_same<T, const std::string>::value,
|
|
394
394
|
int>::type;
|
|
395
395
|
|
|
396
396
|
//------------------------------------------------------------------------------
|
|
@@ -399,11 +399,16 @@ using EnableSplitIfString =
|
|
|
399
399
|
|
|
400
400
|
// StrSplit()
|
|
401
401
|
//
|
|
402
|
-
// Splits a
|
|
403
|
-
//
|
|
404
|
-
//
|
|
405
|
-
//
|
|
406
|
-
//
|
|
402
|
+
// Splits a string into a sequence of substrings identified by `Delimiter`. The
|
|
403
|
+
// input is processed sequentially from beginning to end, and each resulting
|
|
404
|
+
// substring is filtered by an optional `Predicate` before inclusion in the
|
|
405
|
+
// result set. `StrSplit()` returns a lazy range that preserves the substrings
|
|
406
|
+
// original order and is convertible to the collection type specified by the
|
|
407
|
+
// caller.
|
|
408
|
+
//
|
|
409
|
+
// Optionally, you may pass a `Predicate` to `StrSplit()` indicating whether to
|
|
410
|
+
// include or exclude the resulting element within the final result set. (See
|
|
411
|
+
// the overviews for Delimiters and Predicates above.)
|
|
407
412
|
//
|
|
408
413
|
// Example:
|
|
409
414
|
//
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
#include "absl/container/btree_set.h"
|
|
37
37
|
#include "absl/container/flat_hash_map.h"
|
|
38
38
|
#include "absl/container/node_hash_map.h"
|
|
39
|
+
#include "absl/hash/hash.h"
|
|
39
40
|
#include "absl/strings/string_view.h"
|
|
40
41
|
|
|
41
42
|
namespace {
|
|
@@ -422,6 +423,9 @@ TEST(Splitter, ConversionOperator) {
|
|
|
422
423
|
TestConversionOperator<absl::btree_multiset<absl::string_view>>(splitter);
|
|
423
424
|
TestConversionOperator<absl::btree_multiset<std::string>>(splitter);
|
|
424
425
|
TestConversionOperator<std::unordered_set<std::string>>(splitter);
|
|
426
|
+
TestConversionOperator<
|
|
427
|
+
std::unordered_set<absl::string_view, absl::Hash<absl::string_view>>>(
|
|
428
|
+
splitter);
|
|
425
429
|
|
|
426
430
|
// Tests conversion to map-like objects.
|
|
427
431
|
|
|
@@ -455,6 +459,15 @@ TEST(Splitter, ConversionOperator) {
|
|
|
455
459
|
splitter);
|
|
456
460
|
TestMapConversionOperator<std::unordered_map<std::string, std::string>>(
|
|
457
461
|
splitter);
|
|
462
|
+
TestMapConversionOperator<std::unordered_map<
|
|
463
|
+
absl::string_view, absl::string_view, absl::Hash<absl::string_view>>>(
|
|
464
|
+
splitter);
|
|
465
|
+
TestMapConversionOperator<std::unordered_map<absl::string_view, std::string,
|
|
466
|
+
absl::Hash<absl::string_view>>>(
|
|
467
|
+
splitter);
|
|
468
|
+
TestMapConversionOperator<std::unordered_map<std::string, absl::string_view,
|
|
469
|
+
absl::Hash<absl::string_view>>>(
|
|
470
|
+
splitter);
|
|
458
471
|
TestMapConversionOperator<
|
|
459
472
|
absl::node_hash_map<absl::string_view, absl::string_view>>(splitter);
|
|
460
473
|
TestMapConversionOperator<
|
|
@@ -123,9 +123,9 @@ class Arg {
|
|
|
123
123
|
// probably using them as 8-bit integers and would probably prefer an integer
|
|
124
124
|
// representation. However, we can't really know, so we make the caller decide
|
|
125
125
|
// what to do.
|
|
126
|
-
Arg(char value) // NOLINT(google-explicit-constructor)
|
|
127
|
-
: piece_(scratch_, 1) {
|
|
126
|
+
Arg(char value) { // NOLINT(google-explicit-constructor)
|
|
128
127
|
scratch_[0] = value;
|
|
128
|
+
piece_ = absl::string_view(scratch_, 1);
|
|
129
129
|
}
|
|
130
130
|
Arg(short value) // NOLINT(*)
|
|
131
131
|
: piece_(scratch_,
|
|
@@ -65,6 +65,7 @@ cc_library(
|
|
|
65
65
|
copts = ABSL_DEFAULT_COPTS,
|
|
66
66
|
linkopts = ABSL_DEFAULT_LINKOPTS,
|
|
67
67
|
visibility = [
|
|
68
|
+
"//absl:friends",
|
|
68
69
|
],
|
|
69
70
|
deps = [
|
|
70
71
|
"//absl/base",
|
|
@@ -295,6 +296,7 @@ cc_library(
|
|
|
295
296
|
copts = ABSL_TEST_COPTS,
|
|
296
297
|
linkopts = ABSL_DEFAULT_LINKOPTS,
|
|
297
298
|
visibility = [
|
|
299
|
+
"//absl:friends",
|
|
298
300
|
],
|
|
299
301
|
deps = [
|
|
300
302
|
":synchronization",
|
|
@@ -343,6 +345,7 @@ cc_library(
|
|
|
343
345
|
copts = ABSL_TEST_COPTS,
|
|
344
346
|
linkopts = ABSL_DEFAULT_LINKOPTS,
|
|
345
347
|
visibility = [
|
|
348
|
+
"//absl:friends",
|
|
346
349
|
],
|
|
347
350
|
deps = [
|
|
348
351
|
":synchronization",
|
|
@@ -77,6 +77,16 @@ void OneTimeInitThreadIdentity(base_internal::ThreadIdentity* identity) {
|
|
|
77
77
|
identity->ticker.store(0, std::memory_order_relaxed);
|
|
78
78
|
identity->wait_start.store(0, std::memory_order_relaxed);
|
|
79
79
|
identity->is_idle.store(false, std::memory_order_relaxed);
|
|
80
|
+
// To avoid a circular dependency we declare only the storage in the header
|
|
81
|
+
// and use placement new to construct the SpinLock.
|
|
82
|
+
static_assert(
|
|
83
|
+
sizeof(base_internal::ThreadIdentity::SchedulerState::
|
|
84
|
+
association_lock_word) == sizeof(base_internal::SpinLock),
|
|
85
|
+
"Wrong size for SpinLock");
|
|
86
|
+
// Protects the association between this identity and its schedulable. Should
|
|
87
|
+
// never be cooperative.
|
|
88
|
+
new (&identity->scheduler_state.association_lock_word)
|
|
89
|
+
base_internal::SpinLock(base_internal::SCHEDULE_KERNEL_ONLY);
|
|
80
90
|
}
|
|
81
91
|
|
|
82
92
|
static void ResetThreadIdentityBetweenReuse(
|
|
@@ -96,6 +106,17 @@ static void ResetThreadIdentityBetweenReuse(
|
|
|
96
106
|
pts->wake = false;
|
|
97
107
|
pts->cond_waiter = false;
|
|
98
108
|
pts->all_locks = nullptr;
|
|
109
|
+
base_internal::ThreadIdentity::SchedulerState* ss =
|
|
110
|
+
&identity->scheduler_state;
|
|
111
|
+
ss->bound_schedulable.store(nullptr, std::memory_order_relaxed);
|
|
112
|
+
ss->association_lock_word = 0;
|
|
113
|
+
ss->scheduling_disabled_depth.store(0, std::memory_order_relaxed);
|
|
114
|
+
ss->potentially_blocking_depth = 0;
|
|
115
|
+
ss->schedule_next_state = 0;
|
|
116
|
+
ss->waking_designated_waker = false;
|
|
117
|
+
identity->static_initialization_depth = 0;
|
|
118
|
+
identity->wait_state.store(base_internal::ThreadIdentity::WaitState::kActive,
|
|
119
|
+
std::memory_order_relaxed);
|
|
99
120
|
identity->blocked_count_ptr = nullptr;
|
|
100
121
|
identity->ticker.store(0, std::memory_order_relaxed);
|
|
101
122
|
identity->wait_start.store(0, std::memory_order_relaxed);
|
|
@@ -31,6 +31,10 @@
|
|
|
31
31
|
#include "absl/synchronization/internal/create_thread_identity.h"
|
|
32
32
|
#include "absl/synchronization/internal/kernel_timeout.h"
|
|
33
33
|
|
|
34
|
+
namespace gloop_do_not_use {
|
|
35
|
+
struct SynchronizationBenchmarkPeer;
|
|
36
|
+
} // namespace gloop_do_not_use
|
|
37
|
+
|
|
34
38
|
namespace absl {
|
|
35
39
|
ABSL_NAMESPACE_BEGIN
|
|
36
40
|
|
|
@@ -77,6 +81,7 @@ class PerThreadSem {
|
|
|
77
81
|
// Permitted callers.
|
|
78
82
|
friend class PerThreadSemTest;
|
|
79
83
|
friend class absl::Mutex;
|
|
84
|
+
friend struct ::gloop_do_not_use::SynchronizationBenchmarkPeer;
|
|
80
85
|
friend void OneTimeInitThreadIdentity(absl::base_internal::ThreadIdentity*);
|
|
81
86
|
};
|
|
82
87
|
|
|
@@ -2139,6 +2139,8 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams* waitp) {
|
|
|
2139
2139
|
intptr_t wr_wait = 0; // set to kMuWrWait if we wake a reader and a
|
|
2140
2140
|
// later writer could have acquired the lock
|
|
2141
2141
|
// (starvation avoidance)
|
|
2142
|
+
// When non-null, clear its "woken_has_waiters" field before returning.
|
|
2143
|
+
absl::base_internal::ThreadIdentity* clear_waking_des_waker = nullptr;
|
|
2142
2144
|
ABSL_RAW_CHECK(waitp == nullptr || waitp->thread->waitp == nullptr ||
|
|
2143
2145
|
waitp->thread->suppress_fatal_errors,
|
|
2144
2146
|
"detected illegal recursion into Mutex code");
|
|
@@ -2382,6 +2384,13 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams* waitp) {
|
|
|
2382
2384
|
h->readers = 0;
|
|
2383
2385
|
h->maybe_unlocking = false; // finished unlocking
|
|
2384
2386
|
nv |= wr_wait | kMuWait | reinterpret_cast<intptr_t>(h);
|
|
2387
|
+
|
|
2388
|
+
// Signal to any Scheduler that we are waking from Mutex Unlock
|
|
2389
|
+
// and there are more waiters left, signaling possible contention.
|
|
2390
|
+
ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
|
|
2391
|
+
clear_waking_des_waker = GetOrCreateCurrentThreadIdentity();
|
|
2392
|
+
ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
|
|
2393
|
+
clear_waking_des_waker->scheduler_state.waking_designated_waker = true;
|
|
2385
2394
|
}
|
|
2386
2395
|
|
|
2387
2396
|
// release both spinlock & lock
|
|
@@ -2417,6 +2426,10 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams* waitp) {
|
|
|
2417
2426
|
ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
|
|
2418
2427
|
}
|
|
2419
2428
|
}
|
|
2429
|
+
|
|
2430
|
+
if (clear_waking_des_waker) {
|
|
2431
|
+
clear_waking_des_waker->scheduler_state.waking_designated_waker = false;
|
|
2432
|
+
}
|
|
2420
2433
|
}
|
|
2421
2434
|
|
|
2422
2435
|
// Used by CondVar implementation to reacquire mutex after waking from
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
#include <atomic>
|
|
62
62
|
#include <cstdint>
|
|
63
63
|
#include <cstring>
|
|
64
|
+
#include <type_traits>
|
|
64
65
|
|
|
65
66
|
#include "absl/base/attributes.h"
|
|
66
67
|
#include "absl/base/config.h"
|
|
@@ -81,6 +82,18 @@ ABSL_NAMESPACE_BEGIN
|
|
|
81
82
|
class Condition;
|
|
82
83
|
struct SynchWaitParams;
|
|
83
84
|
|
|
85
|
+
namespace synchronization_internal {
|
|
86
|
+
|
|
87
|
+
template <typename T, typename = void>
|
|
88
|
+
struct HasConstMemberCallOperator : std::false_type {};
|
|
89
|
+
|
|
90
|
+
template <typename T>
|
|
91
|
+
struct HasConstMemberCallOperator<
|
|
92
|
+
T, std::void_t<decltype(static_cast<bool (T::*)() const>(&T::operator()))>>
|
|
93
|
+
: std::true_type {};
|
|
94
|
+
|
|
95
|
+
} // namespace synchronization_internal
|
|
96
|
+
|
|
84
97
|
// -----------------------------------------------------------------------------
|
|
85
98
|
// Mutex
|
|
86
99
|
// -----------------------------------------------------------------------------
|
|
@@ -866,11 +879,23 @@ class Condition {
|
|
|
866
879
|
// Implementation note: The second template parameter ensures that this
|
|
867
880
|
// constructor doesn't participate in overload resolution if T doesn't have
|
|
868
881
|
// `bool operator() const`.
|
|
869
|
-
template <typename T,
|
|
870
|
-
|
|
882
|
+
template <typename T,
|
|
883
|
+
std::enable_if_t<
|
|
884
|
+
synchronization_internal::HasConstMemberCallOperator<T>::value,
|
|
885
|
+
int> = 0>
|
|
871
886
|
explicit Condition(const T* absl_nonnull obj)
|
|
872
887
|
: Condition(obj, static_cast<bool (T::*)() const>(&T::operator())) {}
|
|
873
888
|
|
|
889
|
+
// Constructor for functors that do not match the `bool operator()() const`
|
|
890
|
+
// signature, such as those using C++23 "deducing this" or static operator().
|
|
891
|
+
template <
|
|
892
|
+
typename T,
|
|
893
|
+
typename = std::enable_if_t<
|
|
894
|
+
!synchronization_internal::HasConstMemberCallOperator<T>::value &&
|
|
895
|
+
sizeof(static_cast<bool (*)(const T&)>(&T::operator())) != 0>>
|
|
896
|
+
explicit Condition(const T* absl_nonnull obj)
|
|
897
|
+
: Condition(&CallByRef<T>, obj) {}
|
|
898
|
+
|
|
874
899
|
// A Condition that always returns `true`.
|
|
875
900
|
// kTrue is only useful in a narrow set of circumstances, mostly when
|
|
876
901
|
// it's passed conditionally. For example:
|
|
@@ -932,6 +957,11 @@ class Condition {
|
|
|
932
957
|
template <typename T, typename ConditionMethodPtr>
|
|
933
958
|
static bool CastAndCallMethod(const Condition* absl_nonnull c);
|
|
934
959
|
|
|
960
|
+
template <typename T>
|
|
961
|
+
static bool CallByRef(const T* absl_nonnull self) {
|
|
962
|
+
return (*self)();
|
|
963
|
+
}
|
|
964
|
+
|
|
935
965
|
// Helper methods for storing, validating, and reading callback arguments.
|
|
936
966
|
template <typename T>
|
|
937
967
|
inline void StoreCallback(T callback) {
|
|
@@ -56,7 +56,7 @@ static constexpr bool kExtendedTest = false;
|
|
|
56
56
|
|
|
57
57
|
std::unique_ptr<absl::synchronization_internal::ThreadPool> CreatePool(
|
|
58
58
|
int threads) {
|
|
59
|
-
return
|
|
59
|
+
return std::make_unique<absl::synchronization_internal::ThreadPool>(threads);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
std::unique_ptr<absl::synchronization_internal::ThreadPool>
|
|
@@ -868,7 +868,7 @@ TEST(Mutex, LockedMutexDestructionBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
|
868
868
|
for (int i = 0; i != 10; i++) {
|
|
869
869
|
// Create, lock and destroy 10 locks.
|
|
870
870
|
const int kNumLocks = 10;
|
|
871
|
-
auto mu =
|
|
871
|
+
auto mu = std::make_unique<absl::Mutex[]>(kNumLocks);
|
|
872
872
|
for (int j = 0; j != kNumLocks; j++) {
|
|
873
873
|
if ((j % 2) == 0) {
|
|
874
874
|
mu[j].lock();
|
|
@@ -993,6 +993,20 @@ TEST(Mutex, FunctionPointerConditionWithConstMethod) {
|
|
|
993
993
|
EXPECT_TRUE(absl::Condition(&chapman, &Constable::WotsAllThisThen).Eval());
|
|
994
994
|
}
|
|
995
995
|
|
|
996
|
+
#ifdef __cpp_explicit_this_parameter
|
|
997
|
+
struct TrueViaDeducingThis {
|
|
998
|
+
template <class This, class... Args>
|
|
999
|
+
bool operator()(this const This&, Args...) {
|
|
1000
|
+
return true;
|
|
1001
|
+
}
|
|
1002
|
+
};
|
|
1003
|
+
|
|
1004
|
+
TEST(Mutex, FunctorConditionDeducingThis) {
|
|
1005
|
+
TrueViaDeducingThis f;
|
|
1006
|
+
EXPECT_TRUE(absl::Condition(&f).Eval());
|
|
1007
|
+
}
|
|
1008
|
+
#endif
|
|
1009
|
+
|
|
996
1010
|
struct True {
|
|
997
1011
|
template <class... Args>
|
|
998
1012
|
bool operator()(Args...) const {
|
|
@@ -1292,7 +1306,7 @@ TEST(Mutex, DeadlockDetectorStressTest) ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
|
1292
1306
|
// If a deadlock detector keeps a full graph of lock acquisition order,
|
|
1293
1307
|
// it will likely be too slow for this test to pass.
|
|
1294
1308
|
const int n_locks = 1 << 17;
|
|
1295
|
-
auto array_of_locks =
|
|
1309
|
+
auto array_of_locks = std::make_unique<absl::Mutex[]>(n_locks);
|
|
1296
1310
|
for (int i = 0; i < n_locks; i++) {
|
|
1297
1311
|
int end = std::min(n_locks, i + 5);
|
|
1298
1312
|
// acquire and then release locks i, i+1, ..., i+4
|
|
@@ -67,6 +67,48 @@ cc_library(
|
|
|
67
67
|
],
|
|
68
68
|
)
|
|
69
69
|
|
|
70
|
+
cc_library(
|
|
71
|
+
name = "clock_interface",
|
|
72
|
+
srcs = [
|
|
73
|
+
"clock_interface.cc",
|
|
74
|
+
],
|
|
75
|
+
hdrs = [
|
|
76
|
+
"clock_interface.h",
|
|
77
|
+
],
|
|
78
|
+
copts = ABSL_DEFAULT_COPTS,
|
|
79
|
+
linkopts = ABSL_DEFAULT_LINKOPTS,
|
|
80
|
+
deps = [
|
|
81
|
+
":time",
|
|
82
|
+
"//absl/base:config",
|
|
83
|
+
"//absl/base:core_headers",
|
|
84
|
+
"//absl/base:no_destructor",
|
|
85
|
+
"//absl/base:nullability",
|
|
86
|
+
"//absl/base:raw_logging_internal",
|
|
87
|
+
"//absl/synchronization",
|
|
88
|
+
],
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
cc_library(
|
|
92
|
+
name = "simulated_clock",
|
|
93
|
+
testonly = True,
|
|
94
|
+
srcs = [
|
|
95
|
+
"simulated_clock.cc",
|
|
96
|
+
],
|
|
97
|
+
hdrs = [
|
|
98
|
+
"simulated_clock.h",
|
|
99
|
+
],
|
|
100
|
+
copts = ABSL_DEFAULT_COPTS,
|
|
101
|
+
linkopts = ABSL_DEFAULT_LINKOPTS,
|
|
102
|
+
deps = [
|
|
103
|
+
":clock_interface",
|
|
104
|
+
":time",
|
|
105
|
+
"//absl/base:config",
|
|
106
|
+
"//absl/base:core_headers",
|
|
107
|
+
"//absl/base:nullability",
|
|
108
|
+
"//absl/synchronization",
|
|
109
|
+
],
|
|
110
|
+
)
|
|
111
|
+
|
|
70
112
|
cc_library(
|
|
71
113
|
name = "test_util",
|
|
72
114
|
testonly = True,
|
|
@@ -110,6 +152,44 @@ cc_test(
|
|
|
110
152
|
],
|
|
111
153
|
)
|
|
112
154
|
|
|
155
|
+
cc_test(
|
|
156
|
+
name = "clock_interface_test",
|
|
157
|
+
srcs = [
|
|
158
|
+
"clock_interface_test.cc",
|
|
159
|
+
],
|
|
160
|
+
copts = ABSL_TEST_COPTS,
|
|
161
|
+
linkopts = ABSL_DEFAULT_LINKOPTS,
|
|
162
|
+
deps = [
|
|
163
|
+
":clock_interface",
|
|
164
|
+
":time",
|
|
165
|
+
"//absl/functional:bind_front",
|
|
166
|
+
"//absl/synchronization",
|
|
167
|
+
"@googletest//:gtest",
|
|
168
|
+
"@googletest//:gtest_main",
|
|
169
|
+
],
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
cc_test(
|
|
173
|
+
name = "simulated_clock_test",
|
|
174
|
+
srcs = [
|
|
175
|
+
"simulated_clock_test.cc",
|
|
176
|
+
],
|
|
177
|
+
copts = ABSL_TEST_COPTS,
|
|
178
|
+
linkopts = ABSL_DEFAULT_LINKOPTS,
|
|
179
|
+
deps = [
|
|
180
|
+
":clock_interface",
|
|
181
|
+
":simulated_clock",
|
|
182
|
+
":time",
|
|
183
|
+
"//absl/base:core_headers",
|
|
184
|
+
"//absl/base:raw_logging_internal",
|
|
185
|
+
"//absl/functional:bind_front",
|
|
186
|
+
"//absl/random",
|
|
187
|
+
"//absl/synchronization",
|
|
188
|
+
"@googletest//:gtest",
|
|
189
|
+
"@googletest//:gtest_main",
|
|
190
|
+
],
|
|
191
|
+
)
|
|
192
|
+
|
|
113
193
|
cc_test(
|
|
114
194
|
name = "flag_test",
|
|
115
195
|
srcs = [
|
|
@@ -131,6 +131,79 @@ absl_cc_test(
|
|
|
131
131
|
GTest::gmock_main
|
|
132
132
|
)
|
|
133
133
|
|
|
134
|
+
absl_cc_library(
|
|
135
|
+
NAME
|
|
136
|
+
clock_interface
|
|
137
|
+
HDRS
|
|
138
|
+
"clock_interface.h"
|
|
139
|
+
SRCS
|
|
140
|
+
"clock_interface.cc"
|
|
141
|
+
COPTS
|
|
142
|
+
${ABSL_DEFAULT_COPTS}
|
|
143
|
+
DEPS
|
|
144
|
+
absl::time
|
|
145
|
+
absl::config
|
|
146
|
+
absl::core_headers
|
|
147
|
+
absl::no_destructor
|
|
148
|
+
absl::nullability
|
|
149
|
+
absl::raw_logging_internal
|
|
150
|
+
absl::synchronization
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
absl_cc_test(
|
|
154
|
+
NAME
|
|
155
|
+
clock_interface_test
|
|
156
|
+
SRCS
|
|
157
|
+
"clock_interface_test.cc"
|
|
158
|
+
COPTS
|
|
159
|
+
${ABSL_TEST_COPTS}
|
|
160
|
+
DEPS
|
|
161
|
+
absl::clock_interface
|
|
162
|
+
absl::time
|
|
163
|
+
absl::config
|
|
164
|
+
absl::bind_front
|
|
165
|
+
absl::synchronization
|
|
166
|
+
GTest::gmock_main
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
absl_cc_library(
|
|
170
|
+
NAME
|
|
171
|
+
simulated_clock
|
|
172
|
+
HDRS
|
|
173
|
+
"simulated_clock.h"
|
|
174
|
+
SRCS
|
|
175
|
+
"simulated_clock.cc"
|
|
176
|
+
COPTS
|
|
177
|
+
${ABSL_DEFAULT_COPTS}
|
|
178
|
+
DEPS
|
|
179
|
+
absl::clock_interface
|
|
180
|
+
absl::time
|
|
181
|
+
absl::config
|
|
182
|
+
absl::core_headers
|
|
183
|
+
absl::nullability
|
|
184
|
+
absl::synchronization
|
|
185
|
+
TESTONLY
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
absl_cc_test(
|
|
189
|
+
NAME
|
|
190
|
+
simulated_clock_test
|
|
191
|
+
SRCS
|
|
192
|
+
"simulated_clock_test.cc"
|
|
193
|
+
COPTS
|
|
194
|
+
${ABSL_TEST_COPTS}
|
|
195
|
+
DEPS
|
|
196
|
+
absl::clock_interface
|
|
197
|
+
absl::simulated_clock
|
|
198
|
+
absl::time
|
|
199
|
+
absl::config
|
|
200
|
+
absl::bind_front
|
|
201
|
+
absl::random_random
|
|
202
|
+
absl::raw_logging_internal
|
|
203
|
+
absl::synchronization
|
|
204
|
+
GTest::gmock_main
|
|
205
|
+
)
|
|
206
|
+
|
|
134
207
|
absl_cc_test(
|
|
135
208
|
NAME
|
|
136
209
|
flag_test
|
|
@@ -34,6 +34,9 @@ ABSL_NAMESPACE_BEGIN
|
|
|
34
34
|
// Now()
|
|
35
35
|
//
|
|
36
36
|
// Returns the current time, expressed as an `absl::Time` absolute time value.
|
|
37
|
+
//
|
|
38
|
+
// To improve testability, consider injecting an absl::Clock and using
|
|
39
|
+
// absl::Clock::TimeNow() instead.
|
|
37
40
|
absl::Time Now();
|
|
38
41
|
|
|
39
42
|
// GetCurrentTimeNanos()
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Copyright 2026 The Abseil Authors.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
#include "absl/time/clock_interface.h"
|
|
16
|
+
|
|
17
|
+
#include "absl/base/config.h"
|
|
18
|
+
#include "absl/base/internal/raw_logging.h"
|
|
19
|
+
#include "absl/base/no_destructor.h"
|
|
20
|
+
#include "absl/synchronization/mutex.h"
|
|
21
|
+
#include "absl/time/clock.h"
|
|
22
|
+
#include "absl/time/time.h"
|
|
23
|
+
|
|
24
|
+
namespace absl {
|
|
25
|
+
ABSL_NAMESPACE_BEGIN
|
|
26
|
+
|
|
27
|
+
namespace {
|
|
28
|
+
|
|
29
|
+
class RealTimeClock final : public Clock {
|
|
30
|
+
private:
|
|
31
|
+
#ifdef _MSC_VER
|
|
32
|
+
// Disable MSVC warning "destructor never returns, potential memory leak"
|
|
33
|
+
#pragma warning(push)
|
|
34
|
+
#pragma warning(disable : 4722)
|
|
35
|
+
#endif
|
|
36
|
+
~RealTimeClock() override {
|
|
37
|
+
ABSL_RAW_LOG(FATAL, "RealTimeClock should never be destroyed");
|
|
38
|
+
}
|
|
39
|
+
#ifdef _MSC_VER
|
|
40
|
+
#pragma warning(pop)
|
|
41
|
+
#endif
|
|
42
|
+
|
|
43
|
+
public:
|
|
44
|
+
absl::Time TimeNow() override { return absl::Now(); }
|
|
45
|
+
|
|
46
|
+
void Sleep(absl::Duration d) override { absl::SleepFor(d); }
|
|
47
|
+
|
|
48
|
+
void SleepUntil(absl::Time wakeup_time) override {
|
|
49
|
+
absl::Duration d = wakeup_time - TimeNow();
|
|
50
|
+
if (d > absl::ZeroDuration()) {
|
|
51
|
+
Sleep(d);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
bool AwaitWithDeadline(absl::Mutex* mu, const absl::Condition& cond,
|
|
56
|
+
absl::Time deadline) override {
|
|
57
|
+
return mu->AwaitWithDeadline(cond, deadline);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
} // namespace
|
|
62
|
+
|
|
63
|
+
Clock::~Clock() = default; // go/key-method
|
|
64
|
+
|
|
65
|
+
Clock& Clock::GetRealClock() {
|
|
66
|
+
static absl::NoDestructor<RealTimeClock> rtclock;
|
|
67
|
+
return *rtclock;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
ABSL_NAMESPACE_END
|
|
71
|
+
} // namespace absl
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Copyright 2026 The Abseil Authors.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
// -----------------------------------------------------------------------------
|
|
16
|
+
// File: clock_interface.h
|
|
17
|
+
// -----------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
#ifndef ABSL_TIME_CLOCK_INTERFACE_H_
|
|
20
|
+
#define ABSL_TIME_CLOCK_INTERFACE_H_
|
|
21
|
+
|
|
22
|
+
#include "absl/base/config.h"
|
|
23
|
+
#include "absl/base/macros.h"
|
|
24
|
+
#include "absl/base/nullability.h"
|
|
25
|
+
#include "absl/synchronization/mutex.h"
|
|
26
|
+
#include "absl/time/time.h"
|
|
27
|
+
|
|
28
|
+
namespace absl {
|
|
29
|
+
ABSL_NAMESPACE_BEGIN
|
|
30
|
+
|
|
31
|
+
// An abstract interface representing a Clock, which is an object that can
|
|
32
|
+
// tell you the current time, sleep, and wait for a condition variable.
|
|
33
|
+
//
|
|
34
|
+
// This interface allows decoupling code that uses time from the code that
|
|
35
|
+
// creates a point in time. You can use this to your advantage by injecting
|
|
36
|
+
// Clocks into interfaces rather than having implementations call absl::Now()
|
|
37
|
+
// directly.
|
|
38
|
+
//
|
|
39
|
+
// Implementations of this interface must be thread-safe.
|
|
40
|
+
//
|
|
41
|
+
// The Clock::GetRealClock() function returns a reference to the global realtime
|
|
42
|
+
// clock.
|
|
43
|
+
//
|
|
44
|
+
// Example:
|
|
45
|
+
//
|
|
46
|
+
// bool IsWeekend(Clock& clock) {
|
|
47
|
+
// absl::Time now = clock.TimeNow();
|
|
48
|
+
// // ... code to check if 'now' is a weekend.
|
|
49
|
+
// }
|
|
50
|
+
//
|
|
51
|
+
// // Production code.
|
|
52
|
+
// IsWeekend(Clock::GetRealClock());
|
|
53
|
+
//
|
|
54
|
+
// // Test code:
|
|
55
|
+
// MyTestClock test_clock(SATURDAY);
|
|
56
|
+
// IsWeekend(test_clock);
|
|
57
|
+
//
|
|
58
|
+
class Clock {
|
|
59
|
+
public:
|
|
60
|
+
// Returns a reference to the global realtime clock.
|
|
61
|
+
// The returned clock is thread-safe.
|
|
62
|
+
static Clock& GetRealClock();
|
|
63
|
+
|
|
64
|
+
virtual ~Clock();
|
|
65
|
+
|
|
66
|
+
// Returns the current time.
|
|
67
|
+
virtual absl::Time TimeNow() = 0;
|
|
68
|
+
|
|
69
|
+
// Sleeps for the specified duration.
|
|
70
|
+
virtual void Sleep(absl::Duration d) = 0;
|
|
71
|
+
|
|
72
|
+
// Sleeps until the specified time.
|
|
73
|
+
virtual void SleepUntil(absl::Time wakeup_time) = 0;
|
|
74
|
+
|
|
75
|
+
// Returns when cond is true or the deadline has passed. Returns true iff
|
|
76
|
+
// cond holds when returning.
|
|
77
|
+
//
|
|
78
|
+
// Requires *mu to be held at least in shared mode. It will be held when
|
|
79
|
+
// evaluating cond, and upon return, but it may be released and reacquired
|
|
80
|
+
// in the meantime.
|
|
81
|
+
//
|
|
82
|
+
// This method is similar to mu->AwaitWithDeadline() except that the
|
|
83
|
+
// latter only works with real-time deadlines. This call works properly
|
|
84
|
+
// with simulated time if invoked on a simulated clock.
|
|
85
|
+
virtual bool AwaitWithDeadline(absl::Mutex* absl_nonnull mu,
|
|
86
|
+
const absl::Condition& cond,
|
|
87
|
+
absl::Time deadline) = 0;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
ABSL_NAMESPACE_END
|
|
91
|
+
} // namespace absl
|
|
92
|
+
|
|
93
|
+
#endif // ABSL_TIME_CLOCK_INTERFACE_H_
|