re2 1.24.1 → 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 +62 -4
- package/binding.gyp +1 -2
- package/lib/addon.cc +7 -3
- package/lib/exec.cc +4 -4
- package/lib/match.cc +4 -4
- package/lib/pattern.cc +148 -1
- package/lib/replace.cc +5 -4
- package/lib/search.cc +1 -1
- package/lib/set.cc +75 -0
- package/lib/test.cc +1 -1
- package/lib/unicode_properties.h +15840 -0
- package/lib/wrapped_re2.h +11 -4
- package/lib/wrapped_re2_set.h +3 -1
- package/llms-full.txt +37 -7
- package/llms.txt +4 -1
- package/package.json +11 -10
- package/re2.d.ts +2 -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 +54 -10
- 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 +82 -26
- 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 +176 -30
- 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 +18 -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/AGENTS.md +0 -131
- package/ARCHITECTURE.md +0 -152
- 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
|
@@ -142,7 +142,7 @@ TEST(Format, Basics) {
|
|
|
142
142
|
time_zone tz = utc_time_zone();
|
|
143
143
|
time_point<chrono::nanoseconds> tp = chrono::system_clock::from_time_t(0);
|
|
144
144
|
|
|
145
|
-
//
|
|
145
|
+
// Start with basic edge cases.
|
|
146
146
|
EXPECT_EQ("", absl::time_internal::cctz::format("", tp, tz));
|
|
147
147
|
EXPECT_EQ(" ", absl::time_internal::cctz::format(" ", tp, tz));
|
|
148
148
|
EXPECT_EQ(" ", absl::time_internal::cctz::format(" ", tp, tz));
|
|
@@ -786,6 +786,36 @@ TEST(Format, Week) {
|
|
|
786
786
|
absl::time_internal::cctz::format("%Y-%W-%w", tp, utc));
|
|
787
787
|
}
|
|
788
788
|
|
|
789
|
+
TEST(Format, NULsInFormatString) {
|
|
790
|
+
time_zone tz = utc_time_zone();
|
|
791
|
+
time_point<chrono::nanoseconds> tp = chrono::system_clock::from_time_t(0);
|
|
792
|
+
|
|
793
|
+
// All NULs.
|
|
794
|
+
std::string nuls(32, '\0');
|
|
795
|
+
EXPECT_EQ(nuls, absl::time_internal::cctz::format(nuls, tp, tz));
|
|
796
|
+
|
|
797
|
+
// NULs amongst ordinary text plus the internal "%\0" specifier.
|
|
798
|
+
std::string percent_nul("\0X\0\0X%\0\0X\0\0X\0", 13);
|
|
799
|
+
EXPECT_EQ(percent_nul,
|
|
800
|
+
absl::time_internal::cctz::format(percent_nul, tp, tz));
|
|
801
|
+
|
|
802
|
+
// NULs amongst ordinary text plus a non-internal specifier (%I).
|
|
803
|
+
EXPECT_EQ(std::string("X\0\0\0X12\0X\0\0\0X", 13),
|
|
804
|
+
absl::time_internal::cctz::format(
|
|
805
|
+
std::string("X\0\0\0X%I\0X\0\0\0X", 13), tp, tz));
|
|
806
|
+
|
|
807
|
+
#if defined(__linux__) && defined(__GLIBC__)
|
|
808
|
+
// Depending upon strftime() behavior on "%E"
|
|
809
|
+
// and "%O", "%E\0" and "%0\0" produce themselves.
|
|
810
|
+
std::string percent_E_nul("abc%E\0xyz", 9);
|
|
811
|
+
EXPECT_EQ(percent_E_nul,
|
|
812
|
+
absl::time_internal::cctz::format(percent_E_nul, tp, tz));
|
|
813
|
+
std::string percent_O_nul("abc%O\0xyz", 9);
|
|
814
|
+
EXPECT_EQ(percent_O_nul,
|
|
815
|
+
absl::time_internal::cctz::format(percent_O_nul, tp, tz));
|
|
816
|
+
#endif
|
|
817
|
+
}
|
|
818
|
+
|
|
789
819
|
//
|
|
790
820
|
// Testing parse()
|
|
791
821
|
//
|
|
@@ -930,6 +960,9 @@ TEST(Parse, ErrorCases) {
|
|
|
930
960
|
const time_zone tz = utc_time_zone();
|
|
931
961
|
auto tp = chrono::system_clock::from_time_t(0);
|
|
932
962
|
|
|
963
|
+
// No data.
|
|
964
|
+
EXPECT_FALSE(parse("X", "", tz, &tp));
|
|
965
|
+
|
|
933
966
|
// Illegal trailing data.
|
|
934
967
|
EXPECT_FALSE(parse("%S", "123", tz, &tp));
|
|
935
968
|
|
|
@@ -1578,6 +1611,41 @@ TEST(Parse, WeekYearShift) {
|
|
|
1578
1611
|
EXPECT_FALSE(parse("%Y-%U-%u", "9223372036854775807-53-7", utc, &tp));
|
|
1579
1612
|
}
|
|
1580
1613
|
|
|
1614
|
+
TEST(Parse, NULsInFormatAndInputStrings) {
|
|
1615
|
+
const time_zone utc = utc_time_zone();
|
|
1616
|
+
time_point<absl::time_internal::cctz::seconds> tp;
|
|
1617
|
+
|
|
1618
|
+
// Check that NULs are parsed just like any other chars.
|
|
1619
|
+
EXPECT_FALSE(
|
|
1620
|
+
parse(std::string("abc\0def", 7), std::string("abc\0xyz", 7), utc, &tp));
|
|
1621
|
+
EXPECT_FALSE(
|
|
1622
|
+
parse(std::string("%Y\0def", 6), std::string("2026\0xyz", 8), utc, &tp));
|
|
1623
|
+
EXPECT_TRUE(
|
|
1624
|
+
parse(std::string("%Y\0xyz", 6), std::string("2026\0xyz", 8), utc, &tp));
|
|
1625
|
+
ExpectTime(tp, utc, 2026, 1, 1, 0, 0, 0, 0, false, "UTC");
|
|
1626
|
+
|
|
1627
|
+
// All NULs.
|
|
1628
|
+
std::string nuls(32, '\0');
|
|
1629
|
+
EXPECT_TRUE(parse(nuls, nuls, utc, &tp));
|
|
1630
|
+
ExpectTime(tp, utc, 1970, 1, 1, 0, 0, 0, 0, false, "UTC");
|
|
1631
|
+
|
|
1632
|
+
// The "%\0" specifier never matches, even on the empty string and itself.
|
|
1633
|
+
std::string percent_nul("%\0", 2);
|
|
1634
|
+
EXPECT_FALSE(parse(percent_nul, "", utc, &tp));
|
|
1635
|
+
EXPECT_FALSE(parse(percent_nul, percent_nul, utc, &tp));
|
|
1636
|
+
|
|
1637
|
+
#if defined(__linux__) && defined(__GLIBC__)
|
|
1638
|
+
// Depending upon strptime() behavior on "%E"
|
|
1639
|
+
// and "%O", "%E\0" and "%0\0" also never match.
|
|
1640
|
+
std::string percent_E_nul("%E\0", 3);
|
|
1641
|
+
EXPECT_FALSE(parse(percent_E_nul, "", utc, &tp));
|
|
1642
|
+
EXPECT_FALSE(parse(percent_E_nul, percent_E_nul, utc, &tp));
|
|
1643
|
+
std::string percent_O_nul("%O\0", 3);
|
|
1644
|
+
EXPECT_FALSE(parse(percent_O_nul, "", utc, &tp));
|
|
1645
|
+
EXPECT_FALSE(parse(percent_O_nul, percent_O_nul, utc, &tp));
|
|
1646
|
+
#endif
|
|
1647
|
+
}
|
|
1648
|
+
|
|
1581
1649
|
TEST(Parse, MaxRange) {
|
|
1582
1650
|
const time_zone utc = utc_time_zone();
|
|
1583
1651
|
time_point<absl::time_internal::cctz::seconds> tp;
|
|
@@ -1707,10 +1775,18 @@ TEST(FormatParse, RoundTrip) {
|
|
|
1707
1775
|
const auto in = convert(civil_second(1977, 6, 28, 9, 8, 7), lax);
|
|
1708
1776
|
const auto subseconds = chrono::nanoseconds(654321);
|
|
1709
1777
|
|
|
1778
|
+
// No format specifiers, but include NUL.
|
|
1779
|
+
{
|
|
1780
|
+
time_point<chrono::nanoseconds> out;
|
|
1781
|
+
const auto fmt = std::string("\0\1\2\3\4\5\6\7abcdefgh01234567");
|
|
1782
|
+
const auto s = absl::time_internal::cctz::format(fmt, in, lax);
|
|
1783
|
+
EXPECT_TRUE(parse(fmt, s, lax, &out)) << s;
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1710
1786
|
// RFC3339, which renders subseconds.
|
|
1711
1787
|
{
|
|
1712
1788
|
time_point<chrono::nanoseconds> out;
|
|
1713
|
-
const
|
|
1789
|
+
const auto s =
|
|
1714
1790
|
absl::time_internal::cctz::format(RFC3339_full, in + subseconds, lax);
|
|
1715
1791
|
EXPECT_TRUE(parse(RFC3339_full, s, lax, &out)) << s;
|
|
1716
1792
|
EXPECT_EQ(in + subseconds, out); // RFC3339_full includes %Ez
|
|
@@ -1719,8 +1795,7 @@ TEST(FormatParse, RoundTrip) {
|
|
|
1719
1795
|
// RFC1123, which only does whole seconds.
|
|
1720
1796
|
{
|
|
1721
1797
|
time_point<chrono::nanoseconds> out;
|
|
1722
|
-
const
|
|
1723
|
-
absl::time_internal::cctz::format(RFC1123_full, in, lax);
|
|
1798
|
+
const auto s = absl::time_internal::cctz::format(RFC1123_full, in, lax);
|
|
1724
1799
|
EXPECT_TRUE(parse(RFC1123_full, s, lax, &out)) << s;
|
|
1725
1800
|
EXPECT_EQ(in, out); // RFC1123_full includes %z
|
|
1726
1801
|
}
|
|
@@ -1738,7 +1813,7 @@ TEST(FormatParse, RoundTrip) {
|
|
|
1738
1813
|
{
|
|
1739
1814
|
time_point<chrono::nanoseconds> out;
|
|
1740
1815
|
time_zone utc = utc_time_zone();
|
|
1741
|
-
const
|
|
1816
|
+
const auto s = absl::time_internal::cctz::format("%c", in, utc);
|
|
1742
1817
|
EXPECT_TRUE(parse("%c", s, utc, &out)) << s;
|
|
1743
1818
|
EXPECT_EQ(in, out);
|
|
1744
1819
|
}
|
|
@@ -131,7 +131,7 @@ ucal_getTimeZoneIDForWindowsID_func LoadIcuGetTimeZoneIDForWindowsID() {
|
|
|
131
131
|
|
|
132
132
|
// Convert wchar_t array (UTF-16) to UTF-8 string
|
|
133
133
|
std::string Utf16ToUtf8(const wchar_t* ptr, size_t size) {
|
|
134
|
-
if (size > std::numeric_limits<int>::max()) {
|
|
134
|
+
if (size > static_cast<size_t>(std::numeric_limits<int>::max())) {
|
|
135
135
|
return std::string();
|
|
136
136
|
}
|
|
137
137
|
const int chars_len = static_cast<int>(size);
|
|
@@ -140,7 +140,6 @@ std::string Utf16ToUtf8(const wchar_t* ptr, size_t size) {
|
|
|
140
140
|
std::min<size_t>(result.capacity(), std::numeric_limits<int>::max()), 1);
|
|
141
141
|
do {
|
|
142
142
|
result.resize(len);
|
|
143
|
-
// TODO: Switch to std::string::data() when we require C++17 or higher.
|
|
144
143
|
len = static_cast<std::size_t>(::WideCharToMultiByte(
|
|
145
144
|
CP_UTF8, WC_ERR_INVALID_CHARS, ptr, chars_len, &result[0],
|
|
146
145
|
static_cast<int>(len), nullptr, nullptr));
|
|
@@ -17,15 +17,8 @@
|
|
|
17
17
|
** Thank you!
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
/*
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
#ifndef TZDEFRULES
|
|
25
|
-
#define TZDEFRULES "posixrules"
|
|
26
|
-
#endif /* !defined TZDEFRULES */
|
|
27
|
-
|
|
28
|
-
/* See Internet RFC 9636 for more details about the following format. */
|
|
20
|
+
/* Information about time zone files.
|
|
21
|
+
See Internet RFC 9636 for more details about the following format. */
|
|
29
22
|
|
|
30
23
|
/*
|
|
31
24
|
** Each file begins with. . .
|
|
@@ -96,23 +89,25 @@ struct tzhead {
|
|
|
96
89
|
*/
|
|
97
90
|
|
|
98
91
|
#ifndef TZ_MAX_TIMES
|
|
99
|
-
/*
|
|
92
|
+
/* The following limit applies to localtime.c; zic has no such limit.
|
|
93
|
+
The limit must be at least 310 for Asia/Hebron with 'zic -b fat'. */
|
|
100
94
|
#define TZ_MAX_TIMES 2000
|
|
101
95
|
#endif /* !defined TZ_MAX_TIMES */
|
|
102
96
|
|
|
103
97
|
#ifndef TZ_MAX_TYPES
|
|
104
98
|
/* This must be at least 18 for Europe/Vilnius with 'zic -b fat'. */
|
|
105
|
-
#define TZ_MAX_TYPES 256 /* Limited
|
|
99
|
+
#define TZ_MAX_TYPES 256 /* Limited to 256 by Internet RFC 9636. */
|
|
106
100
|
#endif /* !defined TZ_MAX_TYPES */
|
|
107
101
|
|
|
108
102
|
#ifndef TZ_MAX_CHARS
|
|
109
103
|
/* This must be at least 40 for America/Anchorage. */
|
|
110
|
-
#define TZ_MAX_CHARS
|
|
111
|
-
|
|
112
|
-
#endif
|
|
104
|
+
#define TZ_MAX_CHARS 256 /* Maximum number of abbreviation characters */
|
|
105
|
+
/* (limited to 256 by Internet RFC 9636) */
|
|
106
|
+
#endif /* !defined TZ_MAX_CHARS */
|
|
113
107
|
|
|
114
108
|
#ifndef TZ_MAX_LEAPS
|
|
115
|
-
/*
|
|
109
|
+
/* The following limit applies to localtime.c; zic has no such limit.
|
|
110
|
+
The limit must be at least 27 for leap seconds from 1972 through mid-2023.
|
|
116
111
|
There's a plan to discontinue leap seconds by 2035. */
|
|
117
112
|
#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
|
|
118
113
|
#endif /* !defined TZ_MAX_LEAPS */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
2026b
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -115,11 +115,11 @@ CA +5017-10750 America/Swift_Current CST - SK (midwest)
|
|
|
115
115
|
CA +5333-11328 America/Edmonton Mountain - AB, BC(E), NT(E), SK(W)
|
|
116
116
|
CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west)
|
|
117
117
|
CA +682059-1334300 America/Inuvik Mountain - NT (west)
|
|
118
|
+
CA +4916-12307 America/Vancouver MST - BC (most areas)
|
|
118
119
|
CA +5546-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John)
|
|
119
120
|
CA +5848-12242 America/Fort_Nelson MST - BC (Ft Nelson)
|
|
120
121
|
CA +6043-13503 America/Whitehorse MST - Yukon (east)
|
|
121
122
|
CA +6404-13925 America/Dawson MST - Yukon (west)
|
|
122
|
-
CA +4916-12307 America/Vancouver Pacific - BC (most areas)
|
|
123
123
|
CH,DE,LI +4723+00832 Europe/Zurich Büsingen
|
|
124
124
|
CI,BF,GH,GM,GN,IS,ML,MR,SH,SL,SN,TG +0519-00402 Africa/Abidjan
|
|
125
125
|
CK -2114-15946 Pacific/Rarotonga
|
|
@@ -58,6 +58,9 @@ XX -2504-13005 Pacific/Pitcairn Pitcairn
|
|
|
58
58
|
# -08/-07 - PST/PDT (North America DST)
|
|
59
59
|
XX +340308-1181434 America/Los_Angeles Pacific (PST/PDT) - US & Canada; Mexico near US border
|
|
60
60
|
#
|
|
61
|
+
# -08/-07 - PST/PDT (North America DST) until 2026-11-01 02:00; then MST
|
|
62
|
+
XX +4916-12307 America/Vancouver MST - BC (most areas)
|
|
63
|
+
#
|
|
61
64
|
# -07 - MST
|
|
62
65
|
XX +332654-1120424 America/Phoenix Mountain Standard (MST) - Arizona; western Mexico; Yukon
|
|
63
66
|
#
|
|
@@ -166,9 +169,6 @@ XX +3003+03115 Africa/Cairo Egypt
|
|
|
166
169
|
# +02/+03 - EET/EEST (Lebanon DST)
|
|
167
170
|
XX +3353+03530 Asia/Beirut Lebanon
|
|
168
171
|
#
|
|
169
|
-
# +02/+03 - EET/EEST (Moldova DST)
|
|
170
|
-
XX +4700+02850 Europe/Chisinau Moldova
|
|
171
|
-
#
|
|
172
172
|
# +02/+03 - EET/EEST (Palestine DST)
|
|
173
173
|
XX +3130+03428 Asia/Gaza Palestine
|
|
174
174
|
#
|
|
@@ -0,0 +1,225 @@
|
|
|
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/simulated_clock.h"
|
|
16
|
+
|
|
17
|
+
#include <cstdint>
|
|
18
|
+
#include <map>
|
|
19
|
+
#include <memory>
|
|
20
|
+
#include <optional>
|
|
21
|
+
#include <utility>
|
|
22
|
+
#include <vector>
|
|
23
|
+
|
|
24
|
+
#include "absl/base/config.h"
|
|
25
|
+
#include "absl/base/macros.h"
|
|
26
|
+
#include "absl/base/nullability.h"
|
|
27
|
+
#include "absl/base/thread_annotations.h"
|
|
28
|
+
#include "absl/synchronization/mutex.h"
|
|
29
|
+
#include "absl/time/clock.h"
|
|
30
|
+
#include "absl/time/time.h"
|
|
31
|
+
|
|
32
|
+
namespace absl {
|
|
33
|
+
ABSL_NAMESPACE_BEGIN
|
|
34
|
+
|
|
35
|
+
// There are a few tricky details in the implementation of SimulatedClock.
|
|
36
|
+
//
|
|
37
|
+
// The external mutex that is passed as a param of AwaitWithDeadline() is not
|
|
38
|
+
// under the control of SimulatedClock; in particular, it can be destroyed any
|
|
39
|
+
// time after AwaitWithDeadline() returns. This requires the wakeup call from
|
|
40
|
+
// AdvanceTime() to avoid grabbing the external mutex if AwaitWithDeadline()
|
|
41
|
+
// has returned. This is accomplished by allowing the waiter to be cancelled
|
|
42
|
+
// via a bool guarded by a mutex in WakeUpInfo.
|
|
43
|
+
//
|
|
44
|
+
// Once AwaitWithDeadline() has released lock_, someone nefarious might call
|
|
45
|
+
// the SimulatedClock destructor, so it isn't possible for AwaitWithDeadline()
|
|
46
|
+
// to remove the wakeup call from waiters_ if the condition it is awaiting
|
|
47
|
+
// becomes true; it cancels the waiter instead. This means that,
|
|
48
|
+
// theoretically, many obsolete entries could pile up in waiters_ if
|
|
49
|
+
// AwaitWithDeadline() keeps being called but simulated time is not advanced.
|
|
50
|
+
// This seems unlikely to happen in practice.
|
|
51
|
+
//
|
|
52
|
+
// The WakeUpInfo in waiters_ are always awoken via WakeUp() (and
|
|
53
|
+
// removed) or cancelled before AwaitWithDeadline() returns. If a
|
|
54
|
+
// waiters_ value is cancelled then calling its WakeUp() method will
|
|
55
|
+
// short-circuit before touching the external mutex.
|
|
56
|
+
|
|
57
|
+
class SimulatedClock::WakeUpInfo {
|
|
58
|
+
public:
|
|
59
|
+
WakeUpInfo(absl::Mutex* mu, absl::Condition cond)
|
|
60
|
+
: mu_(mu),
|
|
61
|
+
cond_(cond),
|
|
62
|
+
wakeup_time_passed_(false),
|
|
63
|
+
cancelled_(false),
|
|
64
|
+
wakeup_called_(false) {}
|
|
65
|
+
|
|
66
|
+
void WakeUp() {
|
|
67
|
+
// If we are cancelled then AwaitWithDeadline may have returned, in which
|
|
68
|
+
// case we can't lock mu_.
|
|
69
|
+
{
|
|
70
|
+
absl::MutexLock lock(cancellation_mu_);
|
|
71
|
+
if (cancelled_) return;
|
|
72
|
+
wakeup_called_ = true;
|
|
73
|
+
}
|
|
74
|
+
absl::MutexLock lock(*mu_);
|
|
75
|
+
wakeup_time_passed_ = true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
void AwaitConditionOrWakeUp() {
|
|
79
|
+
mu_->Await(absl::Condition(this, &WakeUpInfo::Ready));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
void CancelOrAwaitWakeUp() {
|
|
83
|
+
bool wakeup_called;
|
|
84
|
+
{
|
|
85
|
+
absl::MutexLock lock(cancellation_mu_);
|
|
86
|
+
cancelled_ = true;
|
|
87
|
+
wakeup_called = wakeup_called_;
|
|
88
|
+
}
|
|
89
|
+
if (wakeup_called && !wakeup_time_passed_) {
|
|
90
|
+
// Wait for WakeUp to complete.
|
|
91
|
+
//
|
|
92
|
+
// Note that this will unlock 'mu_'; this is actually necessary
|
|
93
|
+
// so that WakeUp() can unblock and complete. This does allow
|
|
94
|
+
// for 'cond_' to potentially change from true to false; that is
|
|
95
|
+
// OK, since WakeUp() is being called, so the deadline must be
|
|
96
|
+
// past, and so this method is fulfilling its duties. (Well, the
|
|
97
|
+
// destructor might be calling WakeUp(), but if you're deleting
|
|
98
|
+
// time itself while waiting for a deadline to pass, you deserve
|
|
99
|
+
// what you get.)
|
|
100
|
+
mu_->Await(absl::Condition(&wakeup_time_passed_));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private:
|
|
105
|
+
bool Ready() const { return wakeup_time_passed_ || cond_.Eval(); }
|
|
106
|
+
|
|
107
|
+
absl::Mutex* mu_;
|
|
108
|
+
absl::Condition cond_;
|
|
109
|
+
bool wakeup_time_passed_;
|
|
110
|
+
absl::Mutex cancellation_mu_;
|
|
111
|
+
bool cancelled_ ABSL_GUARDED_BY(cancellation_mu_);
|
|
112
|
+
bool wakeup_called_ ABSL_GUARDED_BY(cancellation_mu_);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
SimulatedClock::SimulatedClock(absl::Time t) : now_(t) {}
|
|
116
|
+
|
|
117
|
+
SimulatedClock::~SimulatedClock() {
|
|
118
|
+
// Wake up all existing waiters.
|
|
119
|
+
WaiterList waiters;
|
|
120
|
+
{
|
|
121
|
+
absl::MutexLock l(lock_);
|
|
122
|
+
waiters.swap(waiters_);
|
|
123
|
+
}
|
|
124
|
+
for (auto& iter : waiters) {
|
|
125
|
+
iter.second->WakeUp();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
absl::Time SimulatedClock::TimeNow() {
|
|
130
|
+
absl::ReaderMutexLock l(lock_);
|
|
131
|
+
return now_;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void SimulatedClock::Sleep(absl::Duration d) { SleepUntil(TimeNow() + d); }
|
|
135
|
+
|
|
136
|
+
int64_t SimulatedClock::SetTime(absl::Time t) ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
137
|
+
return UpdateTime([this, t]()
|
|
138
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock_) { now_ = t; });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
int64_t SimulatedClock::AdvanceTime(absl::Duration d)
|
|
142
|
+
ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
143
|
+
return UpdateTime([this, d]()
|
|
144
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock_) { now_ += d; });
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
template <class T>
|
|
148
|
+
int64_t SimulatedClock::UpdateTime(const T& now_updater) {
|
|
149
|
+
// Deadlock could occur if UpdateTime() were to hold lock_ while waking up
|
|
150
|
+
// waiters, since waking up requires acquiring the external mutex, and
|
|
151
|
+
// AwaitWithDeadline() acquires the mutexes in the opposite order. So let's
|
|
152
|
+
// first grab all the wakeup callbacks, then release lock_, then call the
|
|
153
|
+
// callbacks.
|
|
154
|
+
std::vector<WaiterList::mapped_type> wakeup_calls;
|
|
155
|
+
|
|
156
|
+
lock_.lock();
|
|
157
|
+
now_updater(); // reset now_
|
|
158
|
+
WaiterList::iterator iter;
|
|
159
|
+
while (((iter = waiters_.begin()) != waiters_.end()) &&
|
|
160
|
+
(iter->first <= now_)) {
|
|
161
|
+
wakeup_calls.push_back(std::move(iter->second));
|
|
162
|
+
waiters_.erase(iter);
|
|
163
|
+
}
|
|
164
|
+
lock_.unlock();
|
|
165
|
+
|
|
166
|
+
for (const auto& wakeup_call : wakeup_calls) {
|
|
167
|
+
wakeup_call->WakeUp();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return static_cast<int64_t>(wakeup_calls.size());
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
void SimulatedClock::SleepUntil(absl::Time wakeup_time) {
|
|
174
|
+
absl::Mutex mu;
|
|
175
|
+
absl::MutexLock lock(mu);
|
|
176
|
+
bool f = false;
|
|
177
|
+
AwaitWithDeadline(&mu, absl::Condition(&f), wakeup_time);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
bool SimulatedClock::AwaitWithDeadline(absl::Mutex* mu,
|
|
181
|
+
const absl::Condition& cond,
|
|
182
|
+
absl::Time deadline) {
|
|
183
|
+
mu->AssertReaderHeld();
|
|
184
|
+
|
|
185
|
+
// Evaluate cond outside our own lock to minimize contention.
|
|
186
|
+
const bool ready = cond.Eval();
|
|
187
|
+
|
|
188
|
+
lock_.lock();
|
|
189
|
+
num_await_calls_++;
|
|
190
|
+
|
|
191
|
+
// Return now if the deadline is already past, or if the condition is true.
|
|
192
|
+
// This avoids creating a WakeUpInfo that won't be deleted until an
|
|
193
|
+
// appropriate UpdateTime() call.
|
|
194
|
+
if (deadline <= now_ || ready) {
|
|
195
|
+
lock_.unlock();
|
|
196
|
+
return ready;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
auto wakeup_info = std::make_shared<WakeUpInfo>(mu, cond);
|
|
200
|
+
waiters_.insert(std::make_pair(deadline, wakeup_info));
|
|
201
|
+
|
|
202
|
+
lock_.unlock();
|
|
203
|
+
// SimulatedClock may be destroyed any time after this, so we can't
|
|
204
|
+
// acquire lock_ again.
|
|
205
|
+
|
|
206
|
+
// Wait until either cond.Eval() becomes true, or the deadline has passed.
|
|
207
|
+
wakeup_info->AwaitConditionOrWakeUp();
|
|
208
|
+
|
|
209
|
+
// Cancel the wakeup call, or if it's already in progress, wait for it to
|
|
210
|
+
// finish, since we must ensure no one touches 'mu' or 'cond' after we return.
|
|
211
|
+
wakeup_info->CancelOrAwaitWakeUp();
|
|
212
|
+
|
|
213
|
+
return cond.Eval();
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
std::optional<absl::Time> SimulatedClock::GetEarliestWakeupTime() const {
|
|
217
|
+
absl::ReaderMutexLock l(lock_);
|
|
218
|
+
if (waiters_.empty()) {
|
|
219
|
+
return std::nullopt;
|
|
220
|
+
}
|
|
221
|
+
return waiters_.begin()->first;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
ABSL_NAMESPACE_END
|
|
225
|
+
} // namespace absl
|
|
@@ -0,0 +1,109 @@
|
|
|
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: simulated_clock.h
|
|
17
|
+
// -----------------------------------------------------------------------------
|
|
18
|
+
|
|
19
|
+
#ifndef ABSL_TIME_SIMULATED_CLOCK_H_
|
|
20
|
+
#define ABSL_TIME_SIMULATED_CLOCK_H_
|
|
21
|
+
|
|
22
|
+
#include <cstdint>
|
|
23
|
+
#include <map>
|
|
24
|
+
#include <memory>
|
|
25
|
+
#include <optional>
|
|
26
|
+
|
|
27
|
+
#include "absl/base/config.h"
|
|
28
|
+
#include "absl/base/macros.h"
|
|
29
|
+
#include "absl/base/nullability.h"
|
|
30
|
+
#include "absl/base/thread_annotations.h"
|
|
31
|
+
#include "absl/synchronization/mutex.h"
|
|
32
|
+
#include "absl/time/clock.h"
|
|
33
|
+
#include "absl/time/clock_interface.h"
|
|
34
|
+
#include "absl/time/time.h"
|
|
35
|
+
|
|
36
|
+
namespace absl {
|
|
37
|
+
ABSL_NAMESPACE_BEGIN
|
|
38
|
+
|
|
39
|
+
// A simulated clock is a concrete Clock implementation that does not "tick"
|
|
40
|
+
// on its own. Time is advanced by explicit calls to the AdvanceTime() or
|
|
41
|
+
// SetTime() functions.
|
|
42
|
+
//
|
|
43
|
+
// Example:
|
|
44
|
+
// absl::SimulatedClock sim_clock;
|
|
45
|
+
// absl::Time now = sim_clock.TimeNow();
|
|
46
|
+
// // now == absl::UnixEpoch()
|
|
47
|
+
//
|
|
48
|
+
// now = sim_clock.TimeNow();
|
|
49
|
+
// // now == absl::UnixEpoch() (still)
|
|
50
|
+
//
|
|
51
|
+
// sim_clock.AdvanceTime(absl::Seconds(3));
|
|
52
|
+
// now = sim_clock.TimeNow();
|
|
53
|
+
// // now == absl::UnixEpoch() + absl::Seconds(3)
|
|
54
|
+
//
|
|
55
|
+
// This class is thread-safe.
|
|
56
|
+
class SimulatedClock : public Clock {
|
|
57
|
+
public:
|
|
58
|
+
explicit SimulatedClock(absl::Time t);
|
|
59
|
+
SimulatedClock() : SimulatedClock(absl::UnixEpoch()) {}
|
|
60
|
+
|
|
61
|
+
// The destructor should be called only if all Sleep(), etc. and
|
|
62
|
+
// AdvanceTime() calls have completed. The code does its best to let
|
|
63
|
+
// any pending calls finish gracefully, but there are no guarantees.
|
|
64
|
+
~SimulatedClock() override;
|
|
65
|
+
|
|
66
|
+
// Returns the simulated time.
|
|
67
|
+
absl::Time TimeNow() override;
|
|
68
|
+
|
|
69
|
+
// Sleeps until the specified duration has elapsed according to this clock.
|
|
70
|
+
void Sleep(absl::Duration d) override;
|
|
71
|
+
|
|
72
|
+
// Sleeps until the specified wakeup_time.
|
|
73
|
+
void SleepUntil(absl::Time wakeup_time) override;
|
|
74
|
+
|
|
75
|
+
// Sets the simulated time to the argument. Wakes up any threads whose
|
|
76
|
+
// sleeps have now expired. Returns the number of woken threads.
|
|
77
|
+
int64_t SetTime(absl::Time t);
|
|
78
|
+
|
|
79
|
+
// Advances the simulated time by the specified duration. Wakes up any
|
|
80
|
+
// threads whose sleeps have now expired. Returns the number of woken threads.
|
|
81
|
+
int64_t AdvanceTime(absl::Duration d);
|
|
82
|
+
|
|
83
|
+
// Blocks until the condition is true or until the simulated clock is
|
|
84
|
+
// advanced to or beyond the wakeup time (or both).
|
|
85
|
+
bool AwaitWithDeadline(absl::Mutex* absl_nonnull mu,
|
|
86
|
+
const absl::Condition& cond,
|
|
87
|
+
absl::Time deadline) override
|
|
88
|
+
ABSL_SHARED_LOCKS_REQUIRED(mu);
|
|
89
|
+
|
|
90
|
+
// Returns the earliest wakeup time.
|
|
91
|
+
std::optional<absl::Time> GetEarliestWakeupTime() const;
|
|
92
|
+
|
|
93
|
+
private:
|
|
94
|
+
template <class T>
|
|
95
|
+
int64_t UpdateTime(const T& now_updater) ABSL_LOCKS_EXCLUDED(lock_);
|
|
96
|
+
|
|
97
|
+
class WakeUpInfo;
|
|
98
|
+
using WaiterList = std::multimap<absl::Time, std::shared_ptr<WakeUpInfo>>;
|
|
99
|
+
|
|
100
|
+
mutable absl::Mutex lock_;
|
|
101
|
+
absl::Time now_ ABSL_GUARDED_BY(lock_);
|
|
102
|
+
WaiterList waiters_ ABSL_GUARDED_BY(lock_);
|
|
103
|
+
int64_t num_await_calls_ ABSL_GUARDED_BY(lock_) = 0;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
ABSL_NAMESPACE_END
|
|
107
|
+
} // namespace absl
|
|
108
|
+
|
|
109
|
+
#endif // ABSL_TIME_SIMULATED_CLOCK_H_
|