re2 1.23.0 → 1.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/binding.gyp +3 -2
- package/package.json +5 -5
- package/vendor/abseil-cpp/CMake/AbseilDll.cmake +25 -4
- package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +6 -1
- package/vendor/abseil-cpp/CMakeLists.txt +2 -2
- package/vendor/abseil-cpp/MODULE.bazel +2 -2
- package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +0 -1
- package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +0 -2
- package/vendor/abseil-cpp/absl/algorithm/container.h +191 -140
- package/vendor/abseil-cpp/absl/algorithm/container_test.cc +818 -0
- package/vendor/abseil-cpp/absl/base/BUILD.bazel +44 -5
- package/vendor/abseil-cpp/absl/base/CMakeLists.txt +42 -3
- package/vendor/abseil-cpp/absl/base/attributes.h +5 -1
- package/vendor/abseil-cpp/absl/base/call_once_test.cc +10 -10
- package/vendor/abseil-cpp/absl/base/casts.cc +61 -0
- package/vendor/abseil-cpp/absl/base/casts.h +128 -2
- package/vendor/abseil-cpp/absl/base/casts_test.cc +151 -0
- package/vendor/abseil-cpp/absl/base/config.h +13 -37
- package/vendor/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +4 -0
- package/vendor/abseil-cpp/absl/base/internal/nullability_traits.h +71 -0
- package/vendor/abseil-cpp/absl/base/internal/nullability_traits_test.cc +98 -0
- package/vendor/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
- package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +13 -7
- package/vendor/abseil-cpp/absl/base/internal/spinlock.h +16 -11
- package/vendor/abseil-cpp/absl/base/internal/strerror_test.cc +2 -1
- package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +0 -9
- package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +0 -6
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -1
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
- package/vendor/abseil-cpp/absl/base/macros.h +40 -17
- package/vendor/abseil-cpp/absl/base/nullability.h +1 -1
- package/vendor/abseil-cpp/absl/base/optimization.h +1 -3
- package/vendor/abseil-cpp/absl/base/options.h +1 -27
- package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +5 -8
- package/vendor/abseil-cpp/absl/cleanup/cleanup.h +4 -0
- package/vendor/abseil-cpp/absl/container/BUILD.bazel +195 -2
- package/vendor/abseil-cpp/absl/container/CMakeLists.txt +136 -2
- package/vendor/abseil-cpp/absl/container/btree_map.h +56 -6
- package/vendor/abseil-cpp/absl/container/btree_set.h +52 -6
- package/vendor/abseil-cpp/absl/container/btree_test.cc +107 -1
- package/vendor/abseil-cpp/absl/container/chunked_queue.h +755 -0
- package/vendor/abseil-cpp/absl/container/chunked_queue_benchmark.cc +386 -0
- package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +768 -0
- package/vendor/abseil-cpp/absl/container/fixed_array.h +4 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_map.h +16 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +1 -2
- package/vendor/abseil-cpp/absl/container/flat_hash_set.h +16 -6
- package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +0 -2
- package/vendor/abseil-cpp/absl/container/inlined_vector.h +12 -4
- package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +21 -0
- package/vendor/abseil-cpp/absl/container/internal/btree_container.h +14 -5
- package/vendor/abseil-cpp/absl/container/internal/chunked_queue.h +173 -0
- package/vendor/abseil-cpp/absl/container/internal/common.h +51 -0
- package/vendor/abseil-cpp/absl/container/internal/container_memory.h +7 -1
- package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +11 -0
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +0 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +1 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +0 -14
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +11 -8
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +3 -4
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +23 -6
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +31 -15
- package/vendor/abseil-cpp/absl/container/internal/heterogeneous_lookup_testing.h +80 -0
- package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +4 -12
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -10
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +149 -23
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +120 -126
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +4 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +8 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +14 -59
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +111 -22
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +53 -112
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_lookup_test.h +10 -15
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_members_test.h +3 -3
- package/vendor/abseil-cpp/absl/container/internal/unordered_map_modifiers_test.h +45 -61
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_constructor_test.h +53 -112
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_lookup_test.h +6 -9
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_members_test.h +3 -3
- package/vendor/abseil-cpp/absl/container/internal/unordered_set_modifiers_test.h +25 -31
- package/vendor/abseil-cpp/absl/container/linked_hash_map.h +666 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_map_benchmark.cc +140 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_map_test.cc +987 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set.h +527 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set_benchmark.cc +84 -0
- package/vendor/abseil-cpp/absl/container/linked_hash_set_test.cc +947 -0
- package/vendor/abseil-cpp/absl/container/node_hash_map.h +17 -6
- package/vendor/abseil-cpp/absl/container/node_hash_set.h +16 -5
- package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +1 -2
- package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +79 -0
- package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +79 -0
- package/vendor/abseil-cpp/absl/copts/copts.py +17 -4
- package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +67 -13
- package/vendor/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
- package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +31 -0
- package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +34 -0
- package/vendor/abseil-cpp/absl/debugging/failure_signal_handler.cc +2 -2
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +118 -0
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +71 -0
- package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +97 -0
- package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
- package/vendor/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
- package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +4 -0
- package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -0
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +1 -1
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +0 -7
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +2 -1
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
- package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +2 -2
- package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +35 -67
- package/vendor/abseil-cpp/absl/debugging/stacktrace.h +3 -0
- package/vendor/abseil-cpp/absl/debugging/stacktrace_benchmark.cc +24 -1
- package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +39 -15
- package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
- package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +25 -40
- package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
- package/vendor/abseil-cpp/absl/flags/BUILD.bazel +1 -0
- package/vendor/abseil-cpp/absl/flags/declare.h +9 -0
- package/vendor/abseil-cpp/absl/flags/flag.h +2 -1
- package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
- package/vendor/abseil-cpp/absl/flags/internal/flag.cc +3 -2
- package/vendor/abseil-cpp/absl/flags/marshalling.cc +1 -16
- package/vendor/abseil-cpp/absl/flags/parse.cc +4 -2
- package/vendor/abseil-cpp/absl/flags/parse_test.cc +1 -1
- package/vendor/abseil-cpp/absl/flags/reflection.cc +4 -3
- package/vendor/abseil-cpp/absl/functional/BUILD.bazel +4 -0
- package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +4 -0
- package/vendor/abseil-cpp/absl/functional/any_invocable.h +3 -1
- package/vendor/abseil-cpp/absl/functional/function_ref.h +125 -20
- package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +122 -9
- package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +13 -2
- package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +42 -4
- package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +11 -0
- package/vendor/abseil-cpp/absl/hash/hash_test.cc +5 -2
- package/vendor/abseil-cpp/absl/hash/internal/hash.cc +184 -53
- package/vendor/abseil-cpp/absl/hash/internal/hash.h +116 -10
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +43 -4
- package/vendor/abseil-cpp/absl/log/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/log/CMakeLists.txt +35 -1
- package/vendor/abseil-cpp/absl/log/check_test_impl.inc +59 -4
- package/vendor/abseil-cpp/absl/log/die_if_null.cc +3 -1
- package/vendor/abseil-cpp/absl/log/die_if_null.h +24 -3
- package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +31 -1
- package/vendor/abseil-cpp/absl/log/internal/check_impl.h +2 -1
- package/vendor/abseil-cpp/absl/log/internal/check_op.cc +3 -1
- package/vendor/abseil-cpp/absl/log/internal/check_op.h +44 -18
- package/vendor/abseil-cpp/absl/log/internal/conditions.h +38 -35
- package/vendor/abseil-cpp/absl/log/internal/container.h +312 -0
- package/vendor/abseil-cpp/absl/log/internal/container_test.cc +254 -0
- package/vendor/abseil-cpp/absl/log/internal/log_impl.h +108 -110
- package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -2
- package/vendor/abseil-cpp/absl/log/internal/log_message.h +5 -1
- package/vendor/abseil-cpp/absl/log/internal/strip.h +30 -31
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +19 -19
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
- package/vendor/abseil-cpp/absl/log/log.h +2 -2
- package/vendor/abseil-cpp/absl/meta/BUILD.bazel +51 -0
- package/vendor/abseil-cpp/absl/meta/CMakeLists.txt +46 -0
- package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing.h +73 -0
- package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing_test.cc +40 -0
- package/vendor/abseil-cpp/absl/meta/internal/requires.h +67 -0
- package/vendor/abseil-cpp/absl/meta/internal/requires_test.cc +66 -0
- package/vendor/abseil-cpp/absl/meta/type_traits.h +42 -1
- package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +14 -0
- package/vendor/abseil-cpp/absl/numeric/int128.h +41 -21
- package/vendor/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
- package/vendor/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
- package/vendor/abseil-cpp/absl/numeric/int128_test.cc +52 -5
- package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +1 -0
- package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.cc +18 -7
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +1 -0
- package/vendor/abseil-cpp/absl/random/internal/fastmath_test.cc +3 -5
- package/vendor/abseil-cpp/absl/random/internal/platform.h +0 -13
- package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +0 -1
- package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +1 -27
- package/vendor/abseil-cpp/absl/status/BUILD.bazel +17 -0
- package/vendor/abseil-cpp/absl/status/CMakeLists.txt +16 -0
- package/vendor/abseil-cpp/absl/status/internal/status_internal.h +4 -2
- package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +2 -2
- package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +2 -1
- package/vendor/abseil-cpp/absl/status/status.cc +4 -0
- package/vendor/abseil-cpp/absl/status/status.h +5 -0
- package/vendor/abseil-cpp/absl/status/status_matchers.h +48 -0
- package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +27 -0
- package/vendor/abseil-cpp/absl/status/status_test.cc +1 -0
- package/vendor/abseil-cpp/absl/status/statusor.h +1 -1
- package/vendor/abseil-cpp/absl/strings/BUILD.bazel +101 -21
- package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +99 -5
- package/vendor/abseil-cpp/absl/strings/ascii.h +9 -4
- package/vendor/abseil-cpp/absl/strings/cord.cc +15 -10
- package/vendor/abseil-cpp/absl/strings/cord.h +1 -1
- package/vendor/abseil-cpp/absl/strings/escaping.cc +126 -94
- package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
- package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite_test.cc +95 -0
- package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +2 -0
- package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc +8 -8
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +24 -18
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +10 -16
- package/vendor/abseil-cpp/absl/strings/internal/escaping.h +9 -7
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer.cc +107 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer.h +115 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +423 -0
- package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +685 -0
- package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +0 -12
- package/vendor/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
- package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +21 -7
- package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +495 -8
- package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -15
- package/vendor/abseil-cpp/absl/strings/numbers.cc +71 -8
- package/vendor/abseil-cpp/absl/strings/numbers.h +25 -12
- package/vendor/abseil-cpp/absl/strings/numbers_test.cc +70 -0
- package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +194 -0
- package/vendor/abseil-cpp/absl/strings/resize_and_overwrite_test.cc +154 -0
- package/vendor/abseil-cpp/absl/strings/str_cat.cc +96 -91
- package/vendor/abseil-cpp/absl/strings/str_cat.h +17 -12
- package/vendor/abseil-cpp/absl/strings/str_format_test.cc +4 -4
- package/vendor/abseil-cpp/absl/strings/str_split.h +1 -1
- package/vendor/abseil-cpp/absl/strings/str_split_test.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/string_view.h +8 -718
- package/vendor/abseil-cpp/absl/strings/string_view_test.cc +1 -1265
- package/vendor/abseil-cpp/absl/strings/substitute.cc +24 -24
- package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +2 -3
- package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +15 -5
- package/vendor/abseil-cpp/absl/synchronization/mutex.cc +2 -1
- package/vendor/abseil-cpp/absl/synchronization/mutex.h +47 -23
- package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
- package/vendor/abseil-cpp/absl/time/CMakeLists.txt +2 -0
- package/vendor/abseil-cpp/absl/time/civil_time_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/time/civil_time_test.cc +58 -103
- package/vendor/abseil-cpp/absl/time/clock.cc +18 -16
- package/vendor/abseil-cpp/absl/time/clock_test.cc +2 -2
- package/vendor/abseil-cpp/absl/time/duration_benchmark.cc +144 -0
- package/vendor/abseil-cpp/absl/time/duration_test.cc +26 -29
- package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +7 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +4 -2
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +186 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab +9 -9
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +12 -12
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +47 -47
- package/vendor/abseil-cpp/absl/time/time.cc +4 -4
- package/vendor/abseil-cpp/absl/time/time.h +10 -10
- package/vendor/abseil-cpp/absl/time/time_test.cc +1 -0
- package/vendor/abseil-cpp/absl/types/compare.h +62 -61
- package/vendor/abseil-cpp/absl/types/compare_test.cc +3 -3
- package/vendor/abseil-cpp/absl/types/internal/span.h +1 -0
- package/vendor/abseil-cpp/absl/types/optional.h +2 -2
- package/vendor/abseil-cpp/absl/types/span.h +10 -2
- package/vendor/abseil-cpp/absl/utility/utility.h +13 -0
- package/vendor/abseil-cpp/ci/absl_alternate_options.h +0 -1
- package/vendor/abseil-cpp/ci/cmake_common.sh +1 -1
- package/vendor/abseil-cpp/ci/cmake_install_test.sh +6 -0
- package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +2 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +1 -0
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +6 -0
- package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +6 -0
- package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +3 -2
- package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +5 -0
- package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -0
- package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -0
- package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +6 -1
- package/vendor/abseil-cpp/absl/base/internal/identity.h +0 -39
- package/vendor/abseil-cpp/absl/strings/string_view.cc +0 -257
- package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +0 -380
|
@@ -28,11 +28,9 @@
|
|
|
28
28
|
// We disable format checker under vscode intellisense compilation.
|
|
29
29
|
// See https://github.com/microsoft/vscode-cpptools/issues/3683 for
|
|
30
30
|
// more details.
|
|
31
|
-
#if ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(
|
|
32
|
-
!defined(__INTELLISENSE__)
|
|
31
|
+
#if ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__INTELLISENSE__)
|
|
33
32
|
#define ABSL_INTERNAL_ENABLE_FORMAT_CHECKER 1
|
|
34
|
-
#endif // ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(
|
|
35
|
-
// !defined(__INTELLISENSE__)
|
|
33
|
+
#endif // ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__INTELLISENSE__)
|
|
36
34
|
#endif // ABSL_INTERNAL_ENABLE_FORMAT_CHECKER
|
|
37
35
|
|
|
38
36
|
namespace absl {
|
|
@@ -284,6 +284,11 @@ const NativePrintfTraits &VerifyNativeImplementation() {
|
|
|
284
284
|
return native_traits;
|
|
285
285
|
}
|
|
286
286
|
|
|
287
|
+
bool IsNativeHexFloatConversion(char f) { return f == 'a' || f == 'A'; }
|
|
288
|
+
bool IsNativeFloatConversion(char f) {
|
|
289
|
+
return f == 'f' || f == 'F' || f == 'e' || f == 'E' || f == 'a' || f == 'A';
|
|
290
|
+
}
|
|
291
|
+
|
|
287
292
|
class FormatConvertTest : public ::testing::Test { };
|
|
288
293
|
|
|
289
294
|
template <typename T>
|
|
@@ -799,20 +804,19 @@ void TestWithMultipleFormatsHelper(Floating tested_float) {
|
|
|
799
804
|
'e', 'E'}) {
|
|
800
805
|
std::string fmt_str = std::string(fmt) + f;
|
|
801
806
|
|
|
802
|
-
if (fmt == absl::string_view("%.5000") && f
|
|
803
|
-
f != 'a' && f != 'A') {
|
|
807
|
+
if (fmt == absl::string_view("%.5000") && !IsNativeFloatConversion(f)) {
|
|
804
808
|
// This particular test takes way too long with snprintf.
|
|
805
809
|
// Disable for the case we are not implementing natively.
|
|
806
810
|
continue;
|
|
807
811
|
}
|
|
808
812
|
|
|
809
|
-
if ((f
|
|
813
|
+
if (IsNativeHexFloatConversion(f) &&
|
|
810
814
|
!native_traits.hex_float_has_glibc_rounding) {
|
|
811
815
|
continue;
|
|
812
816
|
}
|
|
813
817
|
|
|
814
818
|
if (!native_traits.hex_float_prefers_denormal_repr &&
|
|
815
|
-
(f
|
|
819
|
+
IsNativeHexFloatConversion(f) &&
|
|
816
820
|
std::fpclassify(tested_float) == FP_SUBNORMAL) {
|
|
817
821
|
continue;
|
|
818
822
|
}
|
|
@@ -1059,6 +1063,17 @@ TEST_F(FormatConvertTest, DoubleRound) {
|
|
|
1059
1063
|
"0.000000000000000000000000000000000002"
|
|
1060
1064
|
"25694915357879201529997415146671170141"
|
|
1061
1065
|
"1837869002408041296803276054561138153076171875");
|
|
1066
|
+
|
|
1067
|
+
// Scientific exponent cases
|
|
1068
|
+
// Round to even with all zeros after round digit
|
|
1069
|
+
EXPECT_EQ(format("%0.13e", 1671075773261250), "1.6710757732612e+15");
|
|
1070
|
+
|
|
1071
|
+
// Rounding where precision is in first digit run
|
|
1072
|
+
EXPECT_EQ(format("%0.1e", -1.93437090148818698e-297), "-1.9e-297");
|
|
1073
|
+
EXPECT_EQ(format("%0.1e", -9.92255780642280927e-298), "-9.9e-298");
|
|
1074
|
+
|
|
1075
|
+
// Rounding large negative exponent first digit
|
|
1076
|
+
EXPECT_EQ(format("%0.1e", -8.956e-294), "-9.0e-294");
|
|
1062
1077
|
}
|
|
1063
1078
|
|
|
1064
1079
|
TEST_F(FormatConvertTest, DoubleRoundA) {
|
|
@@ -1317,14 +1332,13 @@ TEST_F(FormatConvertTest, LongDouble) {
|
|
|
1317
1332
|
'e', 'E'}) {
|
|
1318
1333
|
std::string fmt_str = std::string(fmt) + 'L' + f;
|
|
1319
1334
|
|
|
1320
|
-
if (fmt == absl::string_view("%.5000") && f
|
|
1321
|
-
f != 'a' && f != 'A') {
|
|
1335
|
+
if (fmt == absl::string_view("%.5000") && !IsNativeFloatConversion(f)) {
|
|
1322
1336
|
// This particular test takes way too long with snprintf.
|
|
1323
1337
|
// Disable for the case we are not implementing natively.
|
|
1324
1338
|
continue;
|
|
1325
1339
|
}
|
|
1326
1340
|
|
|
1327
|
-
if (f
|
|
1341
|
+
if (IsNativeHexFloatConversion(f)) {
|
|
1328
1342
|
if (!native_traits.hex_float_has_glibc_rounding ||
|
|
1329
1343
|
!native_traits.hex_float_optimizes_leading_digit_bit_count) {
|
|
1330
1344
|
continue;
|
|
@@ -20,7 +20,10 @@
|
|
|
20
20
|
#include <array>
|
|
21
21
|
#include <cassert>
|
|
22
22
|
#include <cmath>
|
|
23
|
+
#include <cstdint>
|
|
24
|
+
#include <cstring>
|
|
23
25
|
#include <limits>
|
|
26
|
+
#include <optional>
|
|
24
27
|
#include <string>
|
|
25
28
|
|
|
26
29
|
#include "absl/base/attributes.h"
|
|
@@ -31,7 +34,9 @@
|
|
|
31
34
|
#include "absl/numeric/bits.h"
|
|
32
35
|
#include "absl/numeric/int128.h"
|
|
33
36
|
#include "absl/numeric/internal/representation.h"
|
|
37
|
+
#include "absl/strings/internal/str_format/extension.h"
|
|
34
38
|
#include "absl/strings/numbers.h"
|
|
39
|
+
#include "absl/strings/string_view.h"
|
|
35
40
|
#include "absl/types/optional.h"
|
|
36
41
|
#include "absl/types/span.h"
|
|
37
42
|
|
|
@@ -451,6 +456,71 @@ char* PrintFractionalDigitsFast(uint128 v,
|
|
|
451
456
|
return p;
|
|
452
457
|
}
|
|
453
458
|
|
|
459
|
+
struct FractionalDigitPrinterResult {
|
|
460
|
+
char* end;
|
|
461
|
+
size_t skipped_zeros;
|
|
462
|
+
bool nonzero_remainder;
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
FractionalDigitPrinterResult PrintFractionalDigitsScientific(
|
|
466
|
+
uint64_t v, char* start, int exp, size_t precision, bool skip_zeros) {
|
|
467
|
+
char* p = start;
|
|
468
|
+
v <<= (64 - exp);
|
|
469
|
+
|
|
470
|
+
size_t skipped_zeros = 0;
|
|
471
|
+
while (v != 0 && precision > 0) {
|
|
472
|
+
char carry = MultiplyBy10WithCarry(&v, 0);
|
|
473
|
+
if (skip_zeros) {
|
|
474
|
+
if (carry == 0) {
|
|
475
|
+
++skipped_zeros;
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
skip_zeros = false;
|
|
479
|
+
}
|
|
480
|
+
*p++ = carry + '0';
|
|
481
|
+
--precision;
|
|
482
|
+
}
|
|
483
|
+
return {p, skipped_zeros, v != 0};
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
FractionalDigitPrinterResult PrintFractionalDigitsScientific(
|
|
487
|
+
uint128 v, char* start, int exp, size_t precision, bool skip_zeros) {
|
|
488
|
+
char* p = start;
|
|
489
|
+
v <<= (128 - exp);
|
|
490
|
+
auto high = static_cast<uint64_t>(v >> 64);
|
|
491
|
+
auto low = static_cast<uint64_t>(v);
|
|
492
|
+
|
|
493
|
+
size_t skipped_zeros = 0;
|
|
494
|
+
while (precision > 0 && low != 0) {
|
|
495
|
+
char carry = MultiplyBy10WithCarry(&low, 0);
|
|
496
|
+
carry = MultiplyBy10WithCarry(&high, carry);
|
|
497
|
+
if (skip_zeros) {
|
|
498
|
+
if (carry == 0) {
|
|
499
|
+
++skipped_zeros;
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
502
|
+
skip_zeros = false;
|
|
503
|
+
}
|
|
504
|
+
*p++ = carry + '0';
|
|
505
|
+
--precision;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
while (precision > 0 && high != 0) {
|
|
509
|
+
char carry = MultiplyBy10WithCarry(&high, 0);
|
|
510
|
+
if (skip_zeros) {
|
|
511
|
+
if (carry == 0) {
|
|
512
|
+
++skipped_zeros;
|
|
513
|
+
continue;
|
|
514
|
+
}
|
|
515
|
+
skip_zeros = false;
|
|
516
|
+
}
|
|
517
|
+
*p++ = carry + '0';
|
|
518
|
+
--precision;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
return {p, skipped_zeros, high != 0 || low != 0};
|
|
522
|
+
}
|
|
523
|
+
|
|
454
524
|
struct FormatState {
|
|
455
525
|
char sign_char;
|
|
456
526
|
size_t precision;
|
|
@@ -1333,6 +1403,427 @@ void WriteBufferToSink(char sign_char, absl::string_view str,
|
|
|
1333
1403
|
sink->Append(right_spaces, ' ');
|
|
1334
1404
|
}
|
|
1335
1405
|
|
|
1406
|
+
template <typename Int>
|
|
1407
|
+
void FormatE(Int mantissa, int exp, bool uppercase, const FormatState& state) {
|
|
1408
|
+
if (exp > 0) {
|
|
1409
|
+
const int total_bits =
|
|
1410
|
+
static_cast<int>(sizeof(Int) * 8) - LeadingZeros(mantissa) + exp;
|
|
1411
|
+
if (total_bits > 128) {
|
|
1412
|
+
FormatEPositiveExpSlow(mantissa, exp, uppercase, state);
|
|
1413
|
+
return;
|
|
1414
|
+
}
|
|
1415
|
+
} else {
|
|
1416
|
+
if (ABSL_PREDICT_FALSE(exp < -128)) {
|
|
1417
|
+
FormatENegativeExpSlow(mantissa, exp, uppercase, state);
|
|
1418
|
+
return;
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
FormatEFast(mantissa, exp, uppercase, state);
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
// Guaranteed to fit into 128 bits at this point
|
|
1425
|
+
template <typename Int>
|
|
1426
|
+
void FormatEFast(Int v, int exp, bool uppercase, const FormatState& state) {
|
|
1427
|
+
if (!v) {
|
|
1428
|
+
absl::string_view mantissa_str = state.ShouldPrintDot() ? "0." : "0";
|
|
1429
|
+
FinalPrint(state, mantissa_str, 0, state.precision,
|
|
1430
|
+
uppercase ? "E+00" : "e+00");
|
|
1431
|
+
return;
|
|
1432
|
+
}
|
|
1433
|
+
constexpr int kInputBits = sizeof(Int) * 8;
|
|
1434
|
+
constexpr int kMaxFractionalDigits = 128;
|
|
1435
|
+
constexpr int kBufferSize = 2 + // '.' + rounding
|
|
1436
|
+
kMaxFixedPrecision + // Integral
|
|
1437
|
+
kMaxFractionalDigits; // Fractional
|
|
1438
|
+
const int total_bits = kInputBits - LeadingZeros(v) + exp;
|
|
1439
|
+
char buffer[kBufferSize];
|
|
1440
|
+
char* integral_start = buffer + 2;
|
|
1441
|
+
char* integral_end = buffer + 2 + kMaxFixedPrecision;
|
|
1442
|
+
char* final_start;
|
|
1443
|
+
char* final_end;
|
|
1444
|
+
bool zero_integral = false;
|
|
1445
|
+
int scientific_exp = 0;
|
|
1446
|
+
size_t digits_printed = 0;
|
|
1447
|
+
size_t trailing_zeros = 0;
|
|
1448
|
+
bool has_more_non_zero = false;
|
|
1449
|
+
|
|
1450
|
+
auto check_integral_zeros =
|
|
1451
|
+
[](char* const begin, char* const end,
|
|
1452
|
+
const size_t precision, size_t digits_processed) -> bool {
|
|
1453
|
+
// When considering rounding to even, we care about the digits after the
|
|
1454
|
+
// round digit which means the total digits to move from the start is
|
|
1455
|
+
// precision + 2 since the first digit we print before the decimal point
|
|
1456
|
+
// is not a part of precision.
|
|
1457
|
+
size_t digit_upper_bound = precision + 2;
|
|
1458
|
+
if (digits_processed > digit_upper_bound) {
|
|
1459
|
+
return std::any_of(begin + digit_upper_bound, end,
|
|
1460
|
+
[](char c) { return c != '0'; });
|
|
1461
|
+
}
|
|
1462
|
+
return false;
|
|
1463
|
+
};
|
|
1464
|
+
|
|
1465
|
+
if (exp >= 0) {
|
|
1466
|
+
integral_end = total_bits <= 64 ? numbers_internal::FastIntToBuffer(
|
|
1467
|
+
static_cast<uint64_t>(v) << exp, integral_start)
|
|
1468
|
+
: numbers_internal::FastIntToBuffer(
|
|
1469
|
+
static_cast<uint128>(v) << exp, integral_start);
|
|
1470
|
+
*integral_end = '0';
|
|
1471
|
+
final_start = integral_start;
|
|
1472
|
+
// Integral is guaranteed to be non-zero at this point.
|
|
1473
|
+
scientific_exp = static_cast<int>(integral_end - integral_start) - 1;
|
|
1474
|
+
digits_printed = static_cast<size_t>(integral_end - integral_start);
|
|
1475
|
+
final_end = integral_end;
|
|
1476
|
+
has_more_non_zero = check_integral_zeros(integral_start, integral_end,
|
|
1477
|
+
state.precision, digits_printed);
|
|
1478
|
+
} else {
|
|
1479
|
+
exp = -exp;
|
|
1480
|
+
if (exp < kInputBits) {
|
|
1481
|
+
integral_end =
|
|
1482
|
+
numbers_internal::FastIntToBuffer(v >> exp, integral_start);
|
|
1483
|
+
}
|
|
1484
|
+
*integral_end = '0';
|
|
1485
|
+
// We didn't move integral_start and it gets set to 0 in
|
|
1486
|
+
zero_integral = exp >= kInputBits || v >> exp == 0;
|
|
1487
|
+
if (!zero_integral) {
|
|
1488
|
+
digits_printed = static_cast<size_t>(integral_end - integral_start);
|
|
1489
|
+
has_more_non_zero = check_integral_zeros(integral_start, integral_end,
|
|
1490
|
+
state.precision, digits_printed);
|
|
1491
|
+
final_end = integral_end;
|
|
1492
|
+
}
|
|
1493
|
+
// Print fractional digits
|
|
1494
|
+
char* fractional_start = integral_end;
|
|
1495
|
+
|
|
1496
|
+
size_t digits_to_print = (state.precision + 1) >= digits_printed
|
|
1497
|
+
? state.precision + 1 - digits_printed
|
|
1498
|
+
: 0;
|
|
1499
|
+
bool print_extra = digits_printed <= state.precision + 1;
|
|
1500
|
+
auto [fractional_end, skipped_zeros, has_nonzero_rem] =
|
|
1501
|
+
exp <= 64 ? PrintFractionalDigitsScientific(
|
|
1502
|
+
v, fractional_start, exp, digits_to_print + print_extra,
|
|
1503
|
+
zero_integral)
|
|
1504
|
+
: PrintFractionalDigitsScientific(
|
|
1505
|
+
static_cast<uint128>(v), fractional_start, exp,
|
|
1506
|
+
digits_to_print + print_extra, zero_integral);
|
|
1507
|
+
final_end = fractional_end;
|
|
1508
|
+
*fractional_end = '0';
|
|
1509
|
+
has_more_non_zero |= has_nonzero_rem;
|
|
1510
|
+
digits_printed += static_cast<size_t>(fractional_end - fractional_start);
|
|
1511
|
+
if (zero_integral) {
|
|
1512
|
+
scientific_exp = -1 * static_cast<int>(skipped_zeros + 1);
|
|
1513
|
+
} else {
|
|
1514
|
+
scientific_exp = static_cast<int>(integral_end - integral_start) - 1;
|
|
1515
|
+
}
|
|
1516
|
+
// Don't do any rounding here, we will do it ourselves.
|
|
1517
|
+
final_start = zero_integral ? fractional_start : integral_start;
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
// For rounding
|
|
1521
|
+
if (digits_printed >= state.precision + 1) {
|
|
1522
|
+
final_start[-1] = '0';
|
|
1523
|
+
char* round_digit_ptr = final_start + 1 + state.precision;
|
|
1524
|
+
if (*round_digit_ptr > '5') {
|
|
1525
|
+
RoundUp(round_digit_ptr - 1);
|
|
1526
|
+
} else if (*round_digit_ptr == '5') {
|
|
1527
|
+
if (has_more_non_zero) {
|
|
1528
|
+
RoundUp(round_digit_ptr - 1);
|
|
1529
|
+
} else {
|
|
1530
|
+
RoundToEven(round_digit_ptr - 1);
|
|
1531
|
+
}
|
|
1532
|
+
}
|
|
1533
|
+
final_end = round_digit_ptr;
|
|
1534
|
+
if (final_start[-1] == '1') {
|
|
1535
|
+
--final_start;
|
|
1536
|
+
++scientific_exp;
|
|
1537
|
+
--final_end;
|
|
1538
|
+
}
|
|
1539
|
+
} else {
|
|
1540
|
+
// Need to pad with zeros.
|
|
1541
|
+
trailing_zeros = state.precision - (digits_printed - 1);
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
if (state.precision > 0 || state.ShouldPrintDot()) {
|
|
1545
|
+
final_start[-1] = *final_start;
|
|
1546
|
+
*final_start = '.';
|
|
1547
|
+
--final_start;
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1550
|
+
// We need to add 2 to the buffer size for the +/- sign and the e
|
|
1551
|
+
constexpr size_t kExpBufferSize = numbers_internal::kFastToBufferSize + 2;
|
|
1552
|
+
char exp_buffer[kExpBufferSize];
|
|
1553
|
+
char* exp_ptr_start = exp_buffer;
|
|
1554
|
+
char* exp_ptr = exp_ptr_start;
|
|
1555
|
+
*exp_ptr++ = uppercase ? 'E' : 'e';
|
|
1556
|
+
if (scientific_exp >= 0) {
|
|
1557
|
+
*exp_ptr++ = '+';
|
|
1558
|
+
} else {
|
|
1559
|
+
*exp_ptr++ = '-';
|
|
1560
|
+
scientific_exp = -scientific_exp;
|
|
1561
|
+
}
|
|
1562
|
+
|
|
1563
|
+
if (scientific_exp < 10) {
|
|
1564
|
+
*exp_ptr++ = '0';
|
|
1565
|
+
}
|
|
1566
|
+
exp_ptr = numbers_internal::FastIntToBuffer(scientific_exp, exp_ptr);
|
|
1567
|
+
FinalPrint(state,
|
|
1568
|
+
absl::string_view(final_start,
|
|
1569
|
+
static_cast<size_t>(final_end - final_start)),
|
|
1570
|
+
0, trailing_zeros,
|
|
1571
|
+
absl::string_view(exp_ptr_start,
|
|
1572
|
+
static_cast<size_t>(exp_ptr - exp_ptr_start)));
|
|
1573
|
+
}
|
|
1574
|
+
|
|
1575
|
+
void FormatENegativeExpSlow(uint128 mantissa, int exp, bool uppercase,
|
|
1576
|
+
const FormatState& state) {
|
|
1577
|
+
assert(exp < 0);
|
|
1578
|
+
|
|
1579
|
+
FractionalDigitGenerator::RunConversion(
|
|
1580
|
+
mantissa, -exp,
|
|
1581
|
+
[&](FractionalDigitGenerator digit_gen) {
|
|
1582
|
+
int first_digit = 0;
|
|
1583
|
+
size_t nines = 0;
|
|
1584
|
+
int num_leading_zeros = 0;
|
|
1585
|
+
while (digit_gen.HasMoreDigits()) {
|
|
1586
|
+
auto digits = digit_gen.GetDigits();
|
|
1587
|
+
if (digits.digit_before_nine != 0) {
|
|
1588
|
+
first_digit = digits.digit_before_nine;
|
|
1589
|
+
nines = digits.num_nines;
|
|
1590
|
+
break;
|
|
1591
|
+
} else if (digits.num_nines > 0) {
|
|
1592
|
+
// This also means the first digit is 0
|
|
1593
|
+
first_digit = 9;
|
|
1594
|
+
nines = digits.num_nines - 1;
|
|
1595
|
+
num_leading_zeros++;
|
|
1596
|
+
break;
|
|
1597
|
+
}
|
|
1598
|
+
num_leading_zeros++;
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1601
|
+
bool change_to_zeros = false;
|
|
1602
|
+
if (nines >= state.precision || state.precision == 0) {
|
|
1603
|
+
bool round_up = false;
|
|
1604
|
+
if (nines == state.precision) {
|
|
1605
|
+
round_up = digit_gen.IsGreaterThanHalf();
|
|
1606
|
+
} else {
|
|
1607
|
+
round_up = nines > 0 || digit_gen.IsGreaterThanHalf();
|
|
1608
|
+
}
|
|
1609
|
+
if (round_up) {
|
|
1610
|
+
first_digit = (first_digit == 9 ? 1 : first_digit + 1);
|
|
1611
|
+
num_leading_zeros -= (first_digit == 1);
|
|
1612
|
+
change_to_zeros = true;
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
int scientific_exp = -(num_leading_zeros + 1);
|
|
1616
|
+
assert(scientific_exp < 0);
|
|
1617
|
+
char exp_buffer[numbers_internal::kFastToBufferSize];
|
|
1618
|
+
char* exp_start = exp_buffer;
|
|
1619
|
+
*exp_start++ = '-';
|
|
1620
|
+
if (scientific_exp > -10) {
|
|
1621
|
+
*exp_start++ = '0';
|
|
1622
|
+
}
|
|
1623
|
+
scientific_exp *= -1;
|
|
1624
|
+
char* exp_end =
|
|
1625
|
+
numbers_internal::FastIntToBuffer(scientific_exp, exp_start);
|
|
1626
|
+
const size_t total_digits =
|
|
1627
|
+
1 // First digit
|
|
1628
|
+
+ (state.ShouldPrintDot() ? 1 : 0) // Decimal point
|
|
1629
|
+
+ state.precision // Digits after decimal
|
|
1630
|
+
+ 1 // 'e' or 'E'
|
|
1631
|
+
+ static_cast<size_t>(exp_end - exp_buffer); // Exponent digits
|
|
1632
|
+
|
|
1633
|
+
const auto padding = ExtraWidthToPadding(
|
|
1634
|
+
total_digits + (state.sign_char != '\0' ? 1 : 0), state);
|
|
1635
|
+
state.sink->Append(padding.left_spaces, ' ');
|
|
1636
|
+
|
|
1637
|
+
if (state.sign_char != '\0') {
|
|
1638
|
+
state.sink->Append(1, state.sign_char);
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1641
|
+
state.sink->Append(1, static_cast<char>(first_digit + '0'));
|
|
1642
|
+
if (state.ShouldPrintDot()) {
|
|
1643
|
+
state.sink->Append(1, '.');
|
|
1644
|
+
}
|
|
1645
|
+
size_t digits_to_go = state.precision;
|
|
1646
|
+
size_t nines_to_print = std::min(nines, digits_to_go);
|
|
1647
|
+
state.sink->Append(nines_to_print, change_to_zeros ? '0' : '9');
|
|
1648
|
+
digits_to_go -= nines_to_print;
|
|
1649
|
+
while (digits_to_go > 0 && digit_gen.HasMoreDigits()) {
|
|
1650
|
+
auto digits = digit_gen.GetDigits();
|
|
1651
|
+
|
|
1652
|
+
if (digits.num_nines + 1 < digits_to_go) {
|
|
1653
|
+
state.sink->Append(1, digits.digit_before_nine + '0');
|
|
1654
|
+
state.sink->Append(digits.num_nines, '9');
|
|
1655
|
+
digits_to_go -= digits.num_nines + 1;
|
|
1656
|
+
} else {
|
|
1657
|
+
bool round_up = false;
|
|
1658
|
+
if (digits.num_nines + 1 > digits_to_go) {
|
|
1659
|
+
round_up = true;
|
|
1660
|
+
} else if (digit_gen.IsGreaterThanHalf()) {
|
|
1661
|
+
round_up = true;
|
|
1662
|
+
} else if (digit_gen.IsExactlyHalf()) {
|
|
1663
|
+
round_up =
|
|
1664
|
+
digits.num_nines != 0 || digits.digit_before_nine % 2 == 1;
|
|
1665
|
+
}
|
|
1666
|
+
if (round_up) {
|
|
1667
|
+
state.sink->Append(1, digits.digit_before_nine + '1');
|
|
1668
|
+
--digits_to_go;
|
|
1669
|
+
} else {
|
|
1670
|
+
state.sink->Append(1, digits.digit_before_nine + '0');
|
|
1671
|
+
state.sink->Append(digits_to_go - 1, '9');
|
|
1672
|
+
digits_to_go = 0;
|
|
1673
|
+
}
|
|
1674
|
+
break;
|
|
1675
|
+
}
|
|
1676
|
+
}
|
|
1677
|
+
state.sink->Append(digits_to_go, '0');
|
|
1678
|
+
state.sink->Append(1, uppercase ? 'E' : 'e');
|
|
1679
|
+
state.sink->Append(absl::string_view(
|
|
1680
|
+
exp_buffer, static_cast<size_t>(exp_end - exp_buffer)));
|
|
1681
|
+
state.sink->Append(padding.right_spaces, ' ');
|
|
1682
|
+
});
|
|
1683
|
+
}
|
|
1684
|
+
|
|
1685
|
+
std::optional<int> GetOneDigit(BinaryToDecimal& btd,
|
|
1686
|
+
absl::string_view& digits_view) {
|
|
1687
|
+
if (digits_view.empty()) {
|
|
1688
|
+
if (!btd.AdvanceDigits()) return std::nullopt;
|
|
1689
|
+
digits_view = btd.CurrentDigits();
|
|
1690
|
+
}
|
|
1691
|
+
char d = digits_view.front();
|
|
1692
|
+
digits_view.remove_prefix(1);
|
|
1693
|
+
return d - '0';
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
struct DigitRun {
|
|
1697
|
+
std::optional<int> digit;
|
|
1698
|
+
size_t nines;
|
|
1699
|
+
};
|
|
1700
|
+
|
|
1701
|
+
DigitRun GetDigits(BinaryToDecimal& btd, absl::string_view& digits_view) {
|
|
1702
|
+
auto peek_digit = [&]() -> std::optional<int> {
|
|
1703
|
+
if (digits_view.empty()) {
|
|
1704
|
+
if (!btd.AdvanceDigits()) return std::nullopt;
|
|
1705
|
+
digits_view = btd.CurrentDigits();
|
|
1706
|
+
}
|
|
1707
|
+
return digits_view.front() - '0';
|
|
1708
|
+
};
|
|
1709
|
+
|
|
1710
|
+
auto digit_before_nines = GetOneDigit(btd, digits_view);
|
|
1711
|
+
if (!digit_before_nines.has_value()) return {std::nullopt, 0};
|
|
1712
|
+
|
|
1713
|
+
auto next_digit = peek_digit();
|
|
1714
|
+
size_t num_nines = 0;
|
|
1715
|
+
while (next_digit == 9) {
|
|
1716
|
+
// consume the 9
|
|
1717
|
+
GetOneDigit(btd, digits_view);
|
|
1718
|
+
++num_nines;
|
|
1719
|
+
next_digit = peek_digit();
|
|
1720
|
+
}
|
|
1721
|
+
return digit_before_nines == 9
|
|
1722
|
+
? DigitRun{std::nullopt, num_nines + 1}
|
|
1723
|
+
: DigitRun{digit_before_nines, num_nines};
|
|
1724
|
+
}
|
|
1725
|
+
|
|
1726
|
+
void FormatEPositiveExpSlow(uint128 mantissa, int exp, bool uppercase,
|
|
1727
|
+
const FormatState& state) {
|
|
1728
|
+
BinaryToDecimal::RunConversion(
|
|
1729
|
+
mantissa, exp, [&](BinaryToDecimal btd) {
|
|
1730
|
+
int scientific_exp = static_cast<int>(btd.TotalDigits() - 1);
|
|
1731
|
+
absl::string_view digits_view = btd.CurrentDigits();
|
|
1732
|
+
|
|
1733
|
+
size_t digits_to_go = state.precision + 1;
|
|
1734
|
+
auto [first_digit_opt, nines] = GetDigits(btd, digits_view);
|
|
1735
|
+
if (!first_digit_opt.has_value() && nines == 0) {
|
|
1736
|
+
return;
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
int first_digit = first_digit_opt.value_or(9);
|
|
1740
|
+
if (!first_digit_opt) {
|
|
1741
|
+
--nines;
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1744
|
+
// At this point we are guaranteed to have some sort of first digit
|
|
1745
|
+
bool change_to_zeros = false;
|
|
1746
|
+
if (nines + 1 >= digits_to_go) {
|
|
1747
|
+
// Everything we need to print is in the first DigitRun
|
|
1748
|
+
auto next_digit_opt = GetDigits(btd, digits_view).digit;
|
|
1749
|
+
if (nines == state.precision) {
|
|
1750
|
+
change_to_zeros = next_digit_opt.value_or(0) > 4;
|
|
1751
|
+
} else {
|
|
1752
|
+
change_to_zeros = true;
|
|
1753
|
+
}
|
|
1754
|
+
if (change_to_zeros) {
|
|
1755
|
+
if (first_digit != 9) {
|
|
1756
|
+
first_digit = first_digit + 1;
|
|
1757
|
+
} else {
|
|
1758
|
+
first_digit = 1;
|
|
1759
|
+
++scientific_exp;
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
}
|
|
1763
|
+
|
|
1764
|
+
char exp_buffer[numbers_internal::kFastToBufferSize];
|
|
1765
|
+
char* exp_buffer_end =
|
|
1766
|
+
numbers_internal::FastIntToBuffer(scientific_exp, exp_buffer);
|
|
1767
|
+
const size_t total_digits_out =
|
|
1768
|
+
1 + state.ShouldPrintDot() + state.precision + 2 +
|
|
1769
|
+
(static_cast<size_t>(exp_buffer_end - exp_buffer));
|
|
1770
|
+
|
|
1771
|
+
const auto padding = ExtraWidthToPadding(
|
|
1772
|
+
total_digits_out + (state.sign_char != '\0' ? 1 : 0), state);
|
|
1773
|
+
|
|
1774
|
+
state.sink->Append(padding.left_spaces, ' ');
|
|
1775
|
+
if (state.sign_char != '\0') {
|
|
1776
|
+
state.sink->Append(1, state.sign_char);
|
|
1777
|
+
}
|
|
1778
|
+
state.sink->Append(1, static_cast<char>(first_digit + '0'));
|
|
1779
|
+
--digits_to_go;
|
|
1780
|
+
if (state.precision > 0 || state.ShouldPrintDot()) {
|
|
1781
|
+
state.sink->Append(1, '.');
|
|
1782
|
+
}
|
|
1783
|
+
state.sink->Append(std::min(digits_to_go, nines),
|
|
1784
|
+
change_to_zeros ? '0' : '9');
|
|
1785
|
+
digits_to_go -= std::min(digits_to_go, nines);
|
|
1786
|
+
while (digits_to_go > 0) {
|
|
1787
|
+
auto [digit_opt, curr_nines] = GetDigits(btd, digits_view);
|
|
1788
|
+
if (!digit_opt.has_value()) break;
|
|
1789
|
+
int digit = *digit_opt;
|
|
1790
|
+
if (curr_nines + 1 < digits_to_go) {
|
|
1791
|
+
state.sink->Append(1, static_cast<char>(digit + '0'));
|
|
1792
|
+
state.sink->Append(curr_nines, '9');
|
|
1793
|
+
digits_to_go -= curr_nines + 1;
|
|
1794
|
+
} else {
|
|
1795
|
+
bool need_round_up = false;
|
|
1796
|
+
auto next_digit_opt = GetDigits(btd, digits_view).digit;
|
|
1797
|
+
if (digits_to_go == 1) {
|
|
1798
|
+
need_round_up = curr_nines > 0 || next_digit_opt > 4;
|
|
1799
|
+
} else if (digits_to_go == curr_nines + 1) {
|
|
1800
|
+
// Only round if next digit is > 4
|
|
1801
|
+
need_round_up = next_digit_opt.value_or(0) > 4;
|
|
1802
|
+
} else {
|
|
1803
|
+
// we know we need to round since nine is after precision ends
|
|
1804
|
+
need_round_up = true;
|
|
1805
|
+
}
|
|
1806
|
+
state.sink->Append(1,
|
|
1807
|
+
static_cast<char>(digit + need_round_up + '0'));
|
|
1808
|
+
state.sink->Append(digits_to_go - 1, need_round_up ? '0' : '9');
|
|
1809
|
+
digits_to_go = 0;
|
|
1810
|
+
}
|
|
1811
|
+
}
|
|
1812
|
+
|
|
1813
|
+
if (digits_to_go > 0) {
|
|
1814
|
+
state.sink->Append(digits_to_go, '0');
|
|
1815
|
+
}
|
|
1816
|
+
state.sink->Append(1, uppercase ? 'E' : 'e');
|
|
1817
|
+
state.sink->Append(1, scientific_exp >= 0 ? '+' : '-');
|
|
1818
|
+
if (scientific_exp < 10) {
|
|
1819
|
+
state.sink->Append(1, '0');
|
|
1820
|
+
}
|
|
1821
|
+
state.sink->Append(absl::string_view(
|
|
1822
|
+
exp_buffer, static_cast<size_t>(exp_buffer_end - exp_buffer)));
|
|
1823
|
+
state.sink->Append(padding.right_spaces, ' ');
|
|
1824
|
+
});
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1336
1827
|
template <typename Float>
|
|
1337
1828
|
bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv,
|
|
1338
1829
|
FormatSinkImpl *sink) {
|
|
@@ -1371,14 +1862,10 @@ bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv,
|
|
|
1371
1862
|
return true;
|
|
1372
1863
|
} else if (c == FormatConversionCharInternal::e ||
|
|
1373
1864
|
c == FormatConversionCharInternal::E) {
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
if (!conv.has_alt_flag() && buffer.back() == '.') buffer.pop_back();
|
|
1379
|
-
PrintExponent(
|
|
1380
|
-
exp, FormatConversionCharIsUpper(conv.conversion_char()) ? 'E' : 'e',
|
|
1381
|
-
&buffer);
|
|
1865
|
+
FormatE(decomposed.mantissa, decomposed.exponent,
|
|
1866
|
+
FormatConversionCharIsUpper(conv.conversion_char()),
|
|
1867
|
+
{sign_char, precision, conv, sink});
|
|
1868
|
+
return true;
|
|
1382
1869
|
} else if (c == FormatConversionCharInternal::g ||
|
|
1383
1870
|
c == FormatConversionCharInternal::G) {
|
|
1384
1871
|
precision = std::max(precision, size_t{1}) - 1;
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
#include "absl/base/internal/raw_logging.h"
|
|
48
48
|
#include "absl/strings/internal/ostringstream.h"
|
|
49
49
|
#include "absl/strings/internal/resize_uninitialized.h"
|
|
50
|
+
#include "absl/strings/resize_and_overwrite.h"
|
|
50
51
|
#include "absl/strings/str_cat.h"
|
|
51
52
|
#include "absl/strings/string_view.h"
|
|
52
53
|
|
|
@@ -249,23 +250,25 @@ std::string JoinAlgorithm(Iterator start, Iterator end, absl::string_view s,
|
|
|
249
250
|
constexpr uint64_t kMaxSize =
|
|
250
251
|
uint64_t{(std::numeric_limits<size_t>::max)()};
|
|
251
252
|
ABSL_INTERNAL_CHECK(result_size <= kMaxSize, "size_t overflow");
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
253
|
+
|
|
254
|
+
StringResizeAndOverwrite(
|
|
255
|
+
result, static_cast<size_t>(result_size),
|
|
256
|
+
[&start, &end, &start_value, s](char* result_buf,
|
|
257
|
+
size_t result_buf_size) {
|
|
258
|
+
// Joins strings
|
|
259
|
+
memcpy(result_buf, start_value.data(), start_value.size());
|
|
260
|
+
result_buf += start_value.size();
|
|
261
|
+
for (Iterator it = start; ++it != end;) {
|
|
262
|
+
memcpy(result_buf, s.data(), s.size());
|
|
263
|
+
result_buf += s.size();
|
|
264
|
+
auto&& value = *it;
|
|
265
|
+
memcpy(result_buf, value.data(), value.size());
|
|
266
|
+
result_buf += value.size();
|
|
267
|
+
}
|
|
268
|
+
return result_buf_size;
|
|
269
|
+
});
|
|
266
270
|
}
|
|
267
271
|
}
|
|
268
|
-
|
|
269
272
|
return result;
|
|
270
273
|
}
|
|
271
274
|
|