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
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
#include "absl/base/config.h"
|
|
36
36
|
#include "absl/base/internal/endian.h"
|
|
37
37
|
#include "absl/base/internal/raw_logging.h"
|
|
38
|
+
#include "absl/base/macros.h"
|
|
38
39
|
#include "absl/base/nullability.h"
|
|
39
40
|
#include "absl/base/optimization.h"
|
|
40
41
|
#include "absl/numeric/bits.h"
|
|
@@ -400,6 +401,411 @@ char* absl_nonnull numbers_internal::FastIntToBuffer(
|
|
|
400
401
|
return buffer;
|
|
401
402
|
}
|
|
402
403
|
|
|
404
|
+
// Although DBL_DIG is typically 15, DBL_MAX is normally represented with 17
|
|
405
|
+
// digits of precision. When converted to a string value with fewer digits
|
|
406
|
+
// of precision using strtod(), the result can be bigger than DBL_MAX due to
|
|
407
|
+
// a rounding error. Converting this value back to a double will produce an
|
|
408
|
+
// Inf which will trigger a SIGFPE if FP exceptions are enabled. We skip
|
|
409
|
+
// the precision check for sufficiently large values to avoid the SIGFPE.
|
|
410
|
+
static constexpr double kDoublePrecisionCheckMax =
|
|
411
|
+
std::numeric_limits<double>::max() / 1.000000000000001;
|
|
412
|
+
|
|
413
|
+
char* absl_nonnull numbers_internal::RoundTripDoubleToBuffer(
|
|
414
|
+
double d, char* absl_nonnull buffer) {
|
|
415
|
+
// DBL_DIG is 15 for IEEE-754 doubles, which are used on almost all
|
|
416
|
+
// platforms these days. Just in case some system exists where DBL_DIG
|
|
417
|
+
// is significantly larger -- and risks overflowing our buffer -- we have
|
|
418
|
+
// this assert.
|
|
419
|
+
static_assert(std::numeric_limits<double>::digits10 < 20,
|
|
420
|
+
"std::numeric_limits<double>::digits10 is too big");
|
|
421
|
+
|
|
422
|
+
// We avoid snprintf for NaNs because it inconsistently outputs "-nan"
|
|
423
|
+
// or "nan" when given a nan with the sign bit set.
|
|
424
|
+
if (std::isnan(d)) {
|
|
425
|
+
strcpy(buffer, "nan"); // NOLINT(runtime/printf)
|
|
426
|
+
return buffer;
|
|
427
|
+
}
|
|
428
|
+
bool full_precision_needed = true;
|
|
429
|
+
if (std::abs(d) <= kDoublePrecisionCheckMax) {
|
|
430
|
+
int snprintf_result =
|
|
431
|
+
snprintf(buffer, numbers_internal::kFastToBufferSize, "%.*g",
|
|
432
|
+
std::numeric_limits<double>::digits10, d);
|
|
433
|
+
|
|
434
|
+
// The snprintf should never overflow because the buffer is significantly
|
|
435
|
+
// larger than the precision we asked for.
|
|
436
|
+
ABSL_ASSERT(snprintf_result > 0 &&
|
|
437
|
+
snprintf_result < numbers_internal::kFastToBufferSize);
|
|
438
|
+
|
|
439
|
+
full_precision_needed = strtod(buffer, nullptr) != d;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
if (full_precision_needed) {
|
|
443
|
+
int snprintf_result =
|
|
444
|
+
snprintf(buffer, numbers_internal::kFastToBufferSize, "%.*g",
|
|
445
|
+
std::numeric_limits<double>::digits10 + 2, d);
|
|
446
|
+
|
|
447
|
+
// Should never overflow; see above.
|
|
448
|
+
ABSL_ASSERT(snprintf_result > 0 &&
|
|
449
|
+
snprintf_result < numbers_internal::kFastToBufferSize);
|
|
450
|
+
}
|
|
451
|
+
return buffer;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
namespace {
|
|
455
|
+
|
|
456
|
+
// This table is used to quickly calculate the base-ten exponent of a given
|
|
457
|
+
// float, and then to provide a multiplier to bring that number into the
|
|
458
|
+
// range 1-999,999,999, that is, into uint32_t range. Finally, the exp
|
|
459
|
+
// string is made available so there is one less int-to-string conversion
|
|
460
|
+
// to be done.
|
|
461
|
+
struct Spec {
|
|
462
|
+
double min_range;
|
|
463
|
+
double multiplier;
|
|
464
|
+
const char expstr[5];
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
// clang-format off
|
|
468
|
+
constexpr Spec kNegExpTable[] = {
|
|
469
|
+
Spec{1.4e-45f, 1e+55, "e-45"},
|
|
470
|
+
Spec{1e-44f, 1e+54, "e-44"},
|
|
471
|
+
Spec{1e-43f, 1e+53, "e-43"},
|
|
472
|
+
Spec{1e-42f, 1e+52, "e-42"},
|
|
473
|
+
Spec{1e-41f, 1e+51, "e-41"},
|
|
474
|
+
Spec{1e-40f, 1e+50, "e-40"},
|
|
475
|
+
Spec{1e-39f, 1e+49, "e-39"},
|
|
476
|
+
Spec{1e-38f, 1e+48, "e-38"},
|
|
477
|
+
Spec{1e-37f, 1e+47, "e-37"},
|
|
478
|
+
Spec{1e-36f, 1e+46, "e-36"},
|
|
479
|
+
Spec{1e-35f, 1e+45, "e-35"},
|
|
480
|
+
Spec{1e-34f, 1e+44, "e-34"},
|
|
481
|
+
Spec{1e-33f, 1e+43, "e-33"},
|
|
482
|
+
Spec{1e-32f, 1e+42, "e-32"},
|
|
483
|
+
Spec{1e-31f, 1e+41, "e-31"},
|
|
484
|
+
Spec{1e-30f, 1e+40, "e-30"},
|
|
485
|
+
Spec{1e-29f, 1e+39, "e-29"},
|
|
486
|
+
Spec{1e-28f, 1e+38, "e-28"},
|
|
487
|
+
Spec{1e-27f, 1e+37, "e-27"},
|
|
488
|
+
Spec{1e-26f, 1e+36, "e-26"},
|
|
489
|
+
Spec{1e-25f, 1e+35, "e-25"},
|
|
490
|
+
Spec{1e-24f, 1e+34, "e-24"},
|
|
491
|
+
Spec{1e-23f, 1e+33, "e-23"},
|
|
492
|
+
Spec{1e-22f, 1e+32, "e-22"},
|
|
493
|
+
Spec{1e-21f, 1e+31, "e-21"},
|
|
494
|
+
Spec{1e-20f, 1e+30, "e-20"},
|
|
495
|
+
Spec{1e-19f, 1e+29, "e-19"},
|
|
496
|
+
Spec{1e-18f, 1e+28, "e-18"},
|
|
497
|
+
Spec{1e-17f, 1e+27, "e-17"},
|
|
498
|
+
Spec{1e-16f, 1e+26, "e-16"},
|
|
499
|
+
Spec{1e-15f, 1e+25, "e-15"},
|
|
500
|
+
Spec{1e-14f, 1e+24, "e-14"},
|
|
501
|
+
Spec{1e-13f, 1e+23, "e-13"},
|
|
502
|
+
Spec{1e-12f, 1e+22, "e-12"},
|
|
503
|
+
Spec{1e-11f, 1e+21, "e-11"},
|
|
504
|
+
Spec{1e-10f, 1e+20, "e-10"},
|
|
505
|
+
Spec{1e-09f, 1e+19, "e-09"},
|
|
506
|
+
Spec{1e-08f, 1e+18, "e-08"},
|
|
507
|
+
Spec{1e-07f, 1e+17, "e-07"},
|
|
508
|
+
Spec{1e-06f, 1e+16, "e-06"},
|
|
509
|
+
Spec{1e-05f, 1e+15, "e-05"},
|
|
510
|
+
Spec{1e-04f, 1e+14, "e-04"},
|
|
511
|
+
};
|
|
512
|
+
// clang-format on
|
|
513
|
+
|
|
514
|
+
// clang-format off
|
|
515
|
+
constexpr Spec kPosExpTable[] = {
|
|
516
|
+
Spec{1e+08f, 1e+02, "e+08"},
|
|
517
|
+
Spec{1e+09f, 1e+01, "e+09"},
|
|
518
|
+
Spec{1e+10f, 1e+00, "e+10"},
|
|
519
|
+
Spec{1e+11f, 1e-01, "e+11"},
|
|
520
|
+
Spec{1e+12f, 1e-02, "e+12"},
|
|
521
|
+
Spec{1e+13f, 1e-03, "e+13"},
|
|
522
|
+
Spec{1e+14f, 1e-04, "e+14"},
|
|
523
|
+
Spec{1e+15f, 1e-05, "e+15"},
|
|
524
|
+
Spec{1e+16f, 1e-06, "e+16"},
|
|
525
|
+
Spec{1e+17f, 1e-07, "e+17"},
|
|
526
|
+
Spec{1e+18f, 1e-08, "e+18"},
|
|
527
|
+
Spec{1e+19f, 1e-09, "e+19"},
|
|
528
|
+
Spec{1e+20f, 1e-10, "e+20"},
|
|
529
|
+
Spec{1e+21f, 1e-11, "e+21"},
|
|
530
|
+
Spec{1e+22f, 1e-12, "e+22"},
|
|
531
|
+
Spec{1e+23f, 1e-13, "e+23"},
|
|
532
|
+
Spec{1e+24f, 1e-14, "e+24"},
|
|
533
|
+
Spec{1e+25f, 1e-15, "e+25"},
|
|
534
|
+
Spec{1e+26f, 1e-16, "e+26"},
|
|
535
|
+
Spec{1e+27f, 1e-17, "e+27"},
|
|
536
|
+
Spec{1e+28f, 1e-18, "e+28"},
|
|
537
|
+
Spec{1e+29f, 1e-19, "e+29"},
|
|
538
|
+
Spec{1e+30f, 1e-20, "e+30"},
|
|
539
|
+
Spec{1e+31f, 1e-21, "e+31"},
|
|
540
|
+
Spec{1e+32f, 1e-22, "e+32"},
|
|
541
|
+
Spec{1e+33f, 1e-23, "e+33"},
|
|
542
|
+
Spec{1e+34f, 1e-24, "e+34"},
|
|
543
|
+
Spec{1e+35f, 1e-25, "e+35"},
|
|
544
|
+
Spec{1e+36f, 1e-26, "e+36"},
|
|
545
|
+
Spec{1e+37f, 1e-27, "e+37"},
|
|
546
|
+
Spec{1e+38f, 1e-28, "e+38"},
|
|
547
|
+
Spec{1e+39, 1e-29, "e+39"},
|
|
548
|
+
};
|
|
549
|
+
// clang-format on
|
|
550
|
+
|
|
551
|
+
struct ExpCompare {
|
|
552
|
+
bool operator()(const Spec& spec, double d) const {
|
|
553
|
+
return spec.min_range < d;
|
|
554
|
+
}
|
|
555
|
+
};
|
|
556
|
+
|
|
557
|
+
} // namespace
|
|
558
|
+
|
|
559
|
+
// Utility routine(s) for RoundTripFloatToBuffer:
|
|
560
|
+
// OutputNecessaryDigits takes two 11-digit numbers, whose integer portion
|
|
561
|
+
// represents the fractional part of a floating-point number, and outputs a
|
|
562
|
+
// number that is in-between them, with the fewest digits possible. For
|
|
563
|
+
// instance, given 12345678900 and 12345876900, it would output "0123457".
|
|
564
|
+
// When there are multiple final digits that would satisfy this requirement,
|
|
565
|
+
// this routine attempts to use a digit that would represent the average of
|
|
566
|
+
// lower_double and upper_double.
|
|
567
|
+
//
|
|
568
|
+
// Although the routine works using integers, all callers use doubles, so
|
|
569
|
+
// for their convenience this routine accepts doubles.
|
|
570
|
+
static char* absl_nonnull OutputNecessaryDigits(double lower_double,
|
|
571
|
+
double upper_double,
|
|
572
|
+
char* absl_nonnull out) {
|
|
573
|
+
assert(lower_double > 0);
|
|
574
|
+
assert(lower_double < upper_double - 10);
|
|
575
|
+
assert(upper_double < 100000000000.0);
|
|
576
|
+
|
|
577
|
+
// Narrow the range a bit; without this bias, an input of lower=87654320010.0
|
|
578
|
+
// and upper=87654320100.0 would produce an output of 876543201
|
|
579
|
+
//
|
|
580
|
+
// We do this in three steps: first, we lower the upper bound and truncate it
|
|
581
|
+
// to an integer. Then, we increase the lower bound by exactly the amount we
|
|
582
|
+
// just decreased the upper bound by - at that point, the midpoint is exactly
|
|
583
|
+
// where it used to be. Then we truncate the lower bound.
|
|
584
|
+
|
|
585
|
+
uint64_t upper64 = static_cast<uint64_t>(upper_double - (1.0 / 1024));
|
|
586
|
+
double shrink = upper_double - upper64;
|
|
587
|
+
uint64_t lower64 = static_cast<uint64_t>(lower_double + shrink);
|
|
588
|
+
|
|
589
|
+
// Theory of operation: we convert the lower number to ascii representation,
|
|
590
|
+
// two digits at a time. As we go, we remove the same digits from the upper
|
|
591
|
+
// number. When we see the upper number does not share those same digits, we
|
|
592
|
+
// know we can stop converting. When we stop, the last digit we output is
|
|
593
|
+
// taken from the average of upper and lower values, rounded up.
|
|
594
|
+
char buf[2];
|
|
595
|
+
uint32_t lodigits =
|
|
596
|
+
static_cast<uint32_t>(lower64 / 1000000000); // 1,000,000,000
|
|
597
|
+
uint64_t mul64 = lodigits * uint64_t{1000000000};
|
|
598
|
+
|
|
599
|
+
numbers_internal::PutTwoDigits(lodigits, out);
|
|
600
|
+
out += 2;
|
|
601
|
+
if (upper64 - mul64 >= 1000000000) { // digit mismatch!
|
|
602
|
+
numbers_internal::PutTwoDigits(static_cast<uint32_t>(upper64 / 1000000000),
|
|
603
|
+
buf);
|
|
604
|
+
if (out[-2] != buf[0]) {
|
|
605
|
+
out[-2] = static_cast<char>('0' + (upper64 + lower64 + 10000000000) /
|
|
606
|
+
20000000000);
|
|
607
|
+
--out;
|
|
608
|
+
} else {
|
|
609
|
+
numbers_internal::PutTwoDigits(
|
|
610
|
+
static_cast<uint32_t>((upper64 + lower64 + 1000000000) / 2000000000),
|
|
611
|
+
out - 2);
|
|
612
|
+
}
|
|
613
|
+
*out = '\0';
|
|
614
|
+
return out;
|
|
615
|
+
}
|
|
616
|
+
uint32_t lower = static_cast<uint32_t>(lower64 - mul64);
|
|
617
|
+
uint32_t upper = static_cast<uint32_t>(upper64 - mul64);
|
|
618
|
+
|
|
619
|
+
lodigits = lower / 10000000; // 10,000,000
|
|
620
|
+
uint32_t mul = lodigits * 10000000;
|
|
621
|
+
numbers_internal::PutTwoDigits(lodigits, out);
|
|
622
|
+
out += 2;
|
|
623
|
+
if (upper - mul >= 10000000) { // digit mismatch!
|
|
624
|
+
numbers_internal::PutTwoDigits(upper / 10000000, buf);
|
|
625
|
+
if (out[-2] != buf[0]) {
|
|
626
|
+
out[-2] = '0' + (upper + lower + 100000000) / 200000000;
|
|
627
|
+
--out;
|
|
628
|
+
} else {
|
|
629
|
+
numbers_internal::PutTwoDigits((upper + lower + 10000000) / 20000000,
|
|
630
|
+
out - 2);
|
|
631
|
+
}
|
|
632
|
+
*out = '\0';
|
|
633
|
+
return out;
|
|
634
|
+
}
|
|
635
|
+
lower -= mul;
|
|
636
|
+
upper -= mul;
|
|
637
|
+
|
|
638
|
+
lodigits = lower / 100000; // 100,000
|
|
639
|
+
mul = lodigits * 100000;
|
|
640
|
+
numbers_internal::PutTwoDigits(lodigits, out);
|
|
641
|
+
out += 2;
|
|
642
|
+
if (upper - mul >= 100000) { // digit mismatch!
|
|
643
|
+
numbers_internal::PutTwoDigits(upper / 100000, buf);
|
|
644
|
+
if (out[-2] != buf[0]) {
|
|
645
|
+
out[-2] = static_cast<char>('0' + (upper + lower + 1000000) / 2000000);
|
|
646
|
+
--out;
|
|
647
|
+
} else {
|
|
648
|
+
numbers_internal::PutTwoDigits((upper + lower + 100000) / 200000,
|
|
649
|
+
out - 2);
|
|
650
|
+
}
|
|
651
|
+
*out = '\0';
|
|
652
|
+
return out;
|
|
653
|
+
}
|
|
654
|
+
lower -= mul;
|
|
655
|
+
upper -= mul;
|
|
656
|
+
|
|
657
|
+
lodigits = lower / 1000;
|
|
658
|
+
mul = lodigits * 1000;
|
|
659
|
+
numbers_internal::PutTwoDigits(lodigits, out);
|
|
660
|
+
out += 2;
|
|
661
|
+
if (upper - mul >= 1000) { // digit mismatch!
|
|
662
|
+
numbers_internal::PutTwoDigits(upper / 1000, buf);
|
|
663
|
+
if (out[-2] != buf[0]) {
|
|
664
|
+
out[-2] = static_cast<char>('0' + (upper + lower + 10000) / 20000);
|
|
665
|
+
--out;
|
|
666
|
+
} else {
|
|
667
|
+
numbers_internal::PutTwoDigits((upper + lower + 1000) / 2000, out - 2);
|
|
668
|
+
}
|
|
669
|
+
*out = '\0';
|
|
670
|
+
return out;
|
|
671
|
+
}
|
|
672
|
+
lower -= mul;
|
|
673
|
+
upper -= mul;
|
|
674
|
+
|
|
675
|
+
numbers_internal::PutTwoDigits(lower / 10, out);
|
|
676
|
+
out += 2;
|
|
677
|
+
numbers_internal::PutTwoDigits(upper / 10, buf);
|
|
678
|
+
if (out[-2] != buf[0]) {
|
|
679
|
+
out[-2] = static_cast<char>('0' + (upper + lower + 100) / 200);
|
|
680
|
+
--out;
|
|
681
|
+
} else {
|
|
682
|
+
numbers_internal::PutTwoDigits((upper + lower + 10) / 20, out - 2);
|
|
683
|
+
}
|
|
684
|
+
*out = '\0';
|
|
685
|
+
return out;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// RoundTripFloatToBuffer converts the given float into a string which, if
|
|
689
|
+
// passed to strtof, will produce the exact same original float. It does this
|
|
690
|
+
// by computing the range of possible doubles which map to the given float, and
|
|
691
|
+
// then examining the digits of the doubles in that range. If all the doubles
|
|
692
|
+
// in the range start with "2.37", then clearly our float does, too. As soon as
|
|
693
|
+
// they diverge, only one more digit is needed.
|
|
694
|
+
char* absl_nonnull numbers_internal::RoundTripFloatToBuffer(
|
|
695
|
+
float f, char* absl_nonnull buffer) {
|
|
696
|
+
static_assert(std::numeric_limits<float>::is_iec559,
|
|
697
|
+
"IEEE-754/IEC-559 support only");
|
|
698
|
+
|
|
699
|
+
// We write data to out, incrementing as we go, but FloatToBuffer always
|
|
700
|
+
// returns the address of the buffer passed in.
|
|
701
|
+
char* out = buffer;
|
|
702
|
+
|
|
703
|
+
if (std::isnan(f)) {
|
|
704
|
+
strcpy(out, "nan"); // NOLINT(runtime/printf)
|
|
705
|
+
return buffer;
|
|
706
|
+
}
|
|
707
|
+
if (f == 0) { // +0 and -0 are handled here
|
|
708
|
+
if (std::signbit(f)) {
|
|
709
|
+
strcpy(out, "-0"); // NOLINT(runtime/printf)
|
|
710
|
+
} else {
|
|
711
|
+
strcpy(out, "0"); // NOLINT(runtime/printf)
|
|
712
|
+
}
|
|
713
|
+
return buffer;
|
|
714
|
+
}
|
|
715
|
+
if (f < 0) {
|
|
716
|
+
*out++ = '-';
|
|
717
|
+
f = -f;
|
|
718
|
+
}
|
|
719
|
+
if (f > std::numeric_limits<float>::max()) {
|
|
720
|
+
strcpy(out, "inf"); // NOLINT(runtime/printf)
|
|
721
|
+
return buffer;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
double next_lower = nextafterf(f, 0.0f);
|
|
725
|
+
// For all doubles in the range lower_bound < f < upper_bound, the
|
|
726
|
+
// nearest float is f.
|
|
727
|
+
double lower_bound = (f + next_lower) * 0.5;
|
|
728
|
+
double upper_bound = f + (f - lower_bound);
|
|
729
|
+
// Note: because std::nextafter is slow, we calculate upper_bound
|
|
730
|
+
// assuming that it is the same distance from f as lower_bound is.
|
|
731
|
+
// For exact powers of two, upper_bound is actually twice as far
|
|
732
|
+
// from f as lower_bound is, but this turns out not to matter.
|
|
733
|
+
|
|
734
|
+
// Most callers pass floats that are either 0 or within the
|
|
735
|
+
// range 0.0001 through 100,000,000, so handle those first,
|
|
736
|
+
// since they don't need exponential notation.
|
|
737
|
+
const Spec* spec = nullptr;
|
|
738
|
+
if (f < 1.0) {
|
|
739
|
+
if (f >= 0.0001f) {
|
|
740
|
+
// For fractional values, we set up the multiplier at the same
|
|
741
|
+
// time as we output the leading "0." / "0.0" / "0.00" / "0.000"
|
|
742
|
+
double multiplier = 1e+11;
|
|
743
|
+
*out++ = '0';
|
|
744
|
+
*out++ = '.';
|
|
745
|
+
if (f < 0.1f) {
|
|
746
|
+
multiplier = 1e+12;
|
|
747
|
+
*out++ = '0';
|
|
748
|
+
if (f < 0.01f) {
|
|
749
|
+
multiplier = 1e+13;
|
|
750
|
+
*out++ = '0';
|
|
751
|
+
if (f < 0.001f) {
|
|
752
|
+
multiplier = 1e+14;
|
|
753
|
+
*out++ = '0';
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
OutputNecessaryDigits(lower_bound * multiplier, upper_bound * multiplier,
|
|
758
|
+
out);
|
|
759
|
+
return buffer;
|
|
760
|
+
}
|
|
761
|
+
spec = std::lower_bound(std::begin(kNegExpTable), std::end(kNegExpTable),
|
|
762
|
+
double{f}, ExpCompare());
|
|
763
|
+
if (spec == std::end(kNegExpTable)) --spec;
|
|
764
|
+
} else if (f < 1e8) {
|
|
765
|
+
// Handling non-exponential format greater than 1.0 is similar to the above,
|
|
766
|
+
// but instead of 0.0 / 0.00 / 0.000, the prefix is simply the truncated
|
|
767
|
+
// integer part of f.
|
|
768
|
+
int32_t as_int = static_cast<int32_t>(f);
|
|
769
|
+
out = numbers_internal::FastIntToBuffer(as_int, out);
|
|
770
|
+
// Easy: if the integer part is within (lower_bound, upper_bound), then we
|
|
771
|
+
// are already done.
|
|
772
|
+
if (as_int > lower_bound && as_int < upper_bound) {
|
|
773
|
+
return buffer;
|
|
774
|
+
}
|
|
775
|
+
*out++ = '.';
|
|
776
|
+
OutputNecessaryDigits((lower_bound - as_int) * 1e11,
|
|
777
|
+
(upper_bound - as_int) * 1e11, out);
|
|
778
|
+
return buffer;
|
|
779
|
+
} else {
|
|
780
|
+
spec = std::lower_bound(std::begin(kPosExpTable), std::end(kPosExpTable),
|
|
781
|
+
double{f}, ExpCompare());
|
|
782
|
+
if (spec == std::end(kPosExpTable)) --spec;
|
|
783
|
+
}
|
|
784
|
+
// Exponential notation from here on. "spec" was computed using lower_bound,
|
|
785
|
+
// which means it's the first spec from the table where min_range is greater
|
|
786
|
+
// or equal to f.
|
|
787
|
+
// Unfortunately that's not quite what we want; we want a min_range that is
|
|
788
|
+
// less or equal. So first thing, if it was greater, back up one entry.
|
|
789
|
+
if (spec->min_range > f) --spec;
|
|
790
|
+
|
|
791
|
+
// The digits might be "237000123", but we want "2.37000123",
|
|
792
|
+
// so we output the digits one character later, and then move the first
|
|
793
|
+
// digit back so we can stick the "." in.
|
|
794
|
+
char* start = out;
|
|
795
|
+
out = OutputNecessaryDigits(lower_bound * spec->multiplier,
|
|
796
|
+
upper_bound * spec->multiplier, start + 1);
|
|
797
|
+
start[0] = start[1];
|
|
798
|
+
start[1] = '.';
|
|
799
|
+
|
|
800
|
+
// If it turns out there was only one digit output, then back up over the '.'
|
|
801
|
+
if (out == &start[2]) --out;
|
|
802
|
+
|
|
803
|
+
// Now add the "e+NN" part.
|
|
804
|
+
memcpy(out, spec->expstr, 4);
|
|
805
|
+
out[4] = '\0';
|
|
806
|
+
return buffer;
|
|
807
|
+
}
|
|
808
|
+
|
|
403
809
|
// Given a 128-bit number expressed as a pair of uint64_t, high half first,
|
|
404
810
|
// return that number multiplied by the given 32-bit value. If the result is
|
|
405
811
|
// too large to fit in a 128-bit number, divide it by 2 until it fits.
|
|
@@ -178,6 +178,10 @@ inline constexpr int kFastToBuffer128Size = 41;
|
|
|
178
178
|
inline constexpr int kFastToBufferSize = 32;
|
|
179
179
|
inline constexpr int kSixDigitsToBufferSize = 16;
|
|
180
180
|
|
|
181
|
+
// Helper function used to implement absl::HighPrecision().
|
|
182
|
+
char* absl_nonnull RoundTripDoubleToBuffer(double d, char* absl_nonnull buffer);
|
|
183
|
+
char* absl_nonnull RoundTripFloatToBuffer(float f, char* absl_nonnull buffer);
|
|
184
|
+
|
|
181
185
|
// Helper function for fast formatting of floating-point values.
|
|
182
186
|
// The result is the same as printf's "%g", a.k.a. "%.6g"; that is, six
|
|
183
187
|
// significant digits are returned, trailing zeros are removed, and numbers
|
|
@@ -1780,6 +1780,39 @@ void ExhaustiveFloat(uint32_t cases, R&& runnable) {
|
|
|
1780
1780
|
}
|
|
1781
1781
|
}
|
|
1782
1782
|
|
|
1783
|
+
TEST_F(SimpleDtoaTest, ExhaustiveFloatToBuffer) {
|
|
1784
|
+
uint64_t test_count = 0;
|
|
1785
|
+
std::vector<float> mismatches;
|
|
1786
|
+
ExhaustiveFloat(kFloatNumCases, [&](float f) {
|
|
1787
|
+
if (f != f) return; // rule out NaNs
|
|
1788
|
+
++test_count;
|
|
1789
|
+
char fastbuf[absl::numbers_internal::kFastToBufferSize];
|
|
1790
|
+
absl::numbers_internal::RoundTripFloatToBuffer(f, fastbuf);
|
|
1791
|
+
float round_trip = strtof(fastbuf, nullptr);
|
|
1792
|
+
if (f != round_trip) {
|
|
1793
|
+
mismatches.push_back(f);
|
|
1794
|
+
if (mismatches.size() < 10) {
|
|
1795
|
+
LOG(ERROR) << "Round-trip failure with float. f=" << f << "="
|
|
1796
|
+
<< ToNineDigits(f) << " fast=" << fastbuf
|
|
1797
|
+
<< " strtof=" << ToNineDigits(round_trip);
|
|
1798
|
+
}
|
|
1799
|
+
}
|
|
1800
|
+
});
|
|
1801
|
+
if (!mismatches.empty()) {
|
|
1802
|
+
EXPECT_EQ(mismatches.size(), 0);
|
|
1803
|
+
for (size_t i = 0; i < mismatches.size(); ++i) {
|
|
1804
|
+
if (i > 100) i = mismatches.size() - 1;
|
|
1805
|
+
float f = mismatches[i];
|
|
1806
|
+
char buf[absl::numbers_internal::kFastToBufferSize];
|
|
1807
|
+
float rt = strtof(buf, nullptr);
|
|
1808
|
+
LOG(ERROR) << "Mismatch #" << i << " f=" << f << " (" << ToNineDigits(f)
|
|
1809
|
+
<< ") fast='"
|
|
1810
|
+
<< absl::numbers_internal::RoundTripFloatToBuffer(f, buf)
|
|
1811
|
+
<< "' rt=" << ToNineDigits(rt);
|
|
1812
|
+
}
|
|
1813
|
+
}
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1783
1816
|
TEST_F(SimpleDtoaTest, ExhaustiveDoubleToSixDigits) {
|
|
1784
1817
|
uint64_t test_count = 0;
|
|
1785
1818
|
std::vector<double> mismatches;
|
|
@@ -53,9 +53,10 @@
|
|
|
53
53
|
|
|
54
54
|
#include "absl/base/config.h"
|
|
55
55
|
#include "absl/base/dynamic_annotations.h"
|
|
56
|
-
#include "absl/base/internal/
|
|
56
|
+
#include "absl/base/internal/hardening.h"
|
|
57
57
|
#include "absl/base/macros.h"
|
|
58
58
|
#include "absl/base/optimization.h"
|
|
59
|
+
#include "absl/base/throw_delegate.h"
|
|
59
60
|
|
|
60
61
|
#if defined(__cpp_lib_string_resize_and_overwrite) && \
|
|
61
62
|
__cpp_lib_string_resize_and_overwrite >= 202110L
|
|
@@ -124,7 +125,7 @@ struct has_Resize_and_overwrite<
|
|
|
124
125
|
template <typename T, typename Op>
|
|
125
126
|
void StringResizeAndOverwriteFallback(T& str, typename T::size_type n, Op op) {
|
|
126
127
|
if (ABSL_PREDICT_FALSE(n > str.max_size())) {
|
|
127
|
-
|
|
128
|
+
ThrowStdLengthError("absl::StringResizeAndOverwrite");
|
|
128
129
|
}
|
|
129
130
|
#ifdef ABSL_HAVE_MEMORY_SANITIZER
|
|
130
131
|
auto old_size = str.size();
|
|
@@ -135,10 +136,13 @@ void StringResizeAndOverwriteFallback(T& str, typename T::size_type n, Op op) {
|
|
|
135
136
|
ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(str.data() + old_size, n - old_size);
|
|
136
137
|
}
|
|
137
138
|
#endif
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
139
|
+
typename T::size_type new_size =
|
|
140
|
+
static_cast<typename T::size_type>(std::move(op)(str.data(), n));
|
|
141
|
+
absl::base_internal::HardeningAssertGE(new_size, typename T::size_type{0});
|
|
142
|
+
absl::base_internal::HardeningAssertLE(new_size, n);
|
|
143
|
+
absl::base_internal::HardeningAssert(str.data()[n] ==
|
|
144
|
+
typename T::value_type{});
|
|
145
|
+
str.erase(new_size);
|
|
142
146
|
}
|
|
143
147
|
|
|
144
148
|
template <typename T, typename Op>
|
|
@@ -43,6 +43,13 @@
|
|
|
43
43
|
// Floating point numbers are formatted with six-digit precision, which is
|
|
44
44
|
// the default for "std::cout <<" or printf "%g" (the same as "%.6g").
|
|
45
45
|
//
|
|
46
|
+
// Floating point values can also be converted to a string which, if passed to
|
|
47
|
+
// `strtod()`, would produce the exact same original double (except in case of
|
|
48
|
+
// NaN; all NaNs are considered the same value) by passing the number to
|
|
49
|
+
// absl::HighPrecision. HighPrecision tries to keep the string short but
|
|
50
|
+
// it's not guaranteed to be as short as possible.
|
|
51
|
+
// See http://go/faster-double-strcat
|
|
52
|
+
//
|
|
46
53
|
// You can convert to hexadecimal output rather than decimal output using the
|
|
47
54
|
// `Hex` type contained here. To do so, pass `Hex(my_int)` as a parameter to
|
|
48
55
|
// `StrCat()` or `StrAppend()`. You may specify a minimum hex field width using
|
|
@@ -106,7 +113,6 @@
|
|
|
106
113
|
#include "absl/base/port.h"
|
|
107
114
|
#include "absl/meta/type_traits.h"
|
|
108
115
|
#include "absl/strings/has_absl_stringify.h"
|
|
109
|
-
#include "absl/strings/internal/resize_uninitialized.h"
|
|
110
116
|
#include "absl/strings/internal/stringify_sink.h"
|
|
111
117
|
#include "absl/strings/numbers.h"
|
|
112
118
|
#include "absl/strings/resize_and_overwrite.h"
|
|
@@ -305,6 +311,35 @@ struct Dec {
|
|
|
305
311
|
}
|
|
306
312
|
};
|
|
307
313
|
|
|
314
|
+
// -----------------------------------------------------------------------------
|
|
315
|
+
// HighPrecision
|
|
316
|
+
// -----------------------------------------------------------------------------
|
|
317
|
+
//
|
|
318
|
+
// Converts floating point values to a string which, if passed to
|
|
319
|
+
// `absl::SimpleAtof`/`absl::SimpleAtod`, would produce the exact same original
|
|
320
|
+
// floating point value (except in case of NaN; all NaNs are considered the same
|
|
321
|
+
// value). Tries to keep the string short but it's not guaranteed to be as short
|
|
322
|
+
// as possible.
|
|
323
|
+
//
|
|
324
|
+
// HighPrecision is conisderably slower than the default formatting, so only use
|
|
325
|
+
// it if you need the string to convert back to the same floating-point value.
|
|
326
|
+
|
|
327
|
+
inline strings_internal::AlphaNumBuffer<numbers_internal::kFastToBufferSize>
|
|
328
|
+
HighPrecision(float f) {
|
|
329
|
+
strings_internal::AlphaNumBuffer<numbers_internal::kFastToBufferSize> result;
|
|
330
|
+
result.size =
|
|
331
|
+
strlen(numbers_internal::RoundTripFloatToBuffer(f, &result.data[0]));
|
|
332
|
+
return result;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
inline strings_internal::AlphaNumBuffer<numbers_internal::kFastToBufferSize>
|
|
336
|
+
HighPrecision(double d) {
|
|
337
|
+
strings_internal::AlphaNumBuffer<numbers_internal::kFastToBufferSize> result;
|
|
338
|
+
result.size =
|
|
339
|
+
strlen(numbers_internal::RoundTripDoubleToBuffer(d, &result.data[0]));
|
|
340
|
+
return result;
|
|
341
|
+
}
|
|
342
|
+
|
|
308
343
|
// -----------------------------------------------------------------------------
|
|
309
344
|
// AlphaNum
|
|
310
345
|
// -----------------------------------------------------------------------------
|
|
@@ -228,8 +228,7 @@ void BM_StrAppendInt(benchmark::State& state) {
|
|
|
228
228
|
return BM_StrAppend(state, table);
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
-
|
|
232
|
-
void StrAppendConfig(B* benchmark) {
|
|
231
|
+
void StrAppendConfig(::benchmark::Benchmark* benchmark) {
|
|
233
232
|
for (int bytes : {10, 100, 1000, 10000}) {
|
|
234
233
|
for (int chunks : {1, 2, 4, 8}) {
|
|
235
234
|
// Only add the ones that divide properly. Otherwise we are over counting.
|
|
@@ -140,6 +140,9 @@ TEST(StrCat, Basics) {
|
|
|
140
140
|
result = absl::StrCat(-1);
|
|
141
141
|
EXPECT_EQ(result, "-1");
|
|
142
142
|
|
|
143
|
+
result = absl::StrCat(absl::HighPrecision(0.5));
|
|
144
|
+
EXPECT_EQ(result, "0.5");
|
|
145
|
+
|
|
143
146
|
result = absl::StrCat(absl::SixDigits(0.5));
|
|
144
147
|
EXPECT_EQ(result, "0.5");
|
|
145
148
|
|
|
@@ -182,16 +185,27 @@ TEST(StrCat, Basics) {
|
|
|
182
185
|
EXPECT_EQ(result, "To output a char by ASCII/numeric value, use +: 33");
|
|
183
186
|
|
|
184
187
|
float f = 100000.5;
|
|
188
|
+
result = absl::StrCat("A hundred K and a half is ", absl::HighPrecision(f));
|
|
189
|
+
EXPECT_EQ(result, "A hundred K and a half is 100000.5");
|
|
190
|
+
|
|
185
191
|
result = absl::StrCat("A hundred K and a half is ", absl::SixDigits(f));
|
|
186
192
|
EXPECT_EQ(result, "A hundred K and a half is 100000");
|
|
187
193
|
|
|
188
194
|
f = 100001.5;
|
|
195
|
+
result = absl::StrCat("A hundred K and one and a half is ",
|
|
196
|
+
absl::HighPrecision(f));
|
|
197
|
+
EXPECT_EQ(result, "A hundred K and one and a half is 100001.5");
|
|
198
|
+
|
|
189
199
|
result =
|
|
190
200
|
absl::StrCat("A hundred K and one and a half is ", absl::SixDigits(f));
|
|
191
201
|
EXPECT_EQ(result, "A hundred K and one and a half is 100002");
|
|
192
202
|
|
|
193
203
|
double d = 100000.5;
|
|
194
204
|
d *= d;
|
|
205
|
+
result = absl::StrCat("A hundred K and a half squared is ",
|
|
206
|
+
absl::HighPrecision(d));
|
|
207
|
+
EXPECT_EQ(result, "A hundred K and a half squared is 10000100000.25");
|
|
208
|
+
|
|
195
209
|
result =
|
|
196
210
|
absl::StrCat("A hundred K and a half squared is ", absl::SixDigits(d));
|
|
197
211
|
EXPECT_EQ(result, "A hundred K and a half squared is 1.00001e+10");
|
|
@@ -408,6 +422,20 @@ TEST(StrAppend, Basics) {
|
|
|
408
422
|
EXPECT_EQ(result.substr(old_size),
|
|
409
423
|
"To output a char by ASCII/numeric value, use +: 33");
|
|
410
424
|
|
|
425
|
+
float f = 100000.5;
|
|
426
|
+
old_size = result.size();
|
|
427
|
+
absl::StrAppend(&result, "A hundred K and a half is ",
|
|
428
|
+
absl::HighPrecision(f));
|
|
429
|
+
EXPECT_EQ(result.substr(old_size), "A hundred K and a half is 100000.5");
|
|
430
|
+
|
|
431
|
+
double d = f;
|
|
432
|
+
d *= d;
|
|
433
|
+
old_size = result.size();
|
|
434
|
+
absl::StrAppend(&result, "A hundred K and a half squared is ",
|
|
435
|
+
absl::HighPrecision(d));
|
|
436
|
+
EXPECT_EQ(result.substr(old_size),
|
|
437
|
+
"A hundred K and a half squared is 10000100000.25");
|
|
438
|
+
|
|
411
439
|
// Test 9 arguments, the old maximum
|
|
412
440
|
old_size = result.size();
|
|
413
441
|
absl::StrAppend(&result, 1, 22, 333, 4444, 55555, 666666, 7777777, 88888888,
|
|
@@ -501,12 +501,12 @@ TEST(StrJoin, Tuple) {
|
|
|
501
501
|
absl::StrJoin(std::make_tuple(&x, &y, &z), "-",
|
|
502
502
|
absl::DereferenceFormatter(TestFormatter())));
|
|
503
503
|
EXPECT_EQ("0x0000000a-hell-3.",
|
|
504
|
-
absl::StrJoin(std::make_tuple(
|
|
505
|
-
|
|
506
|
-
|
|
504
|
+
absl::StrJoin(std::make_tuple(std::make_unique<int>(x),
|
|
505
|
+
std::make_unique<std::string>(y),
|
|
506
|
+
std::make_unique<double>(z)),
|
|
507
507
|
"-", absl::DereferenceFormatter(TestFormatter())));
|
|
508
508
|
EXPECT_EQ("0x0000000a-hell-3.",
|
|
509
|
-
absl::StrJoin(std::make_tuple(
|
|
509
|
+
absl::StrJoin(std::make_tuple(std::make_unique<int>(x), &y, &z),
|
|
510
510
|
"-", absl::DereferenceFormatter(TestFormatter())));
|
|
511
511
|
}
|
|
512
512
|
|