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,13 +28,15 @@
|
|
|
28
28
|
#include "absl/base/internal/endian.h"
|
|
29
29
|
#include "absl/base/internal/raw_logging.h"
|
|
30
30
|
#include "absl/base/internal/unaligned_access.h"
|
|
31
|
+
#include "absl/base/macros.h"
|
|
31
32
|
#include "absl/base/nullability.h"
|
|
32
33
|
#include "absl/strings/ascii.h"
|
|
33
34
|
#include "absl/strings/charset.h"
|
|
35
|
+
#include "absl/strings/internal/append_and_overwrite.h"
|
|
34
36
|
#include "absl/strings/internal/escaping.h"
|
|
35
|
-
#include "absl/strings/internal/resize_uninitialized.h"
|
|
36
37
|
#include "absl/strings/internal/utf8.h"
|
|
37
38
|
#include "absl/strings/numbers.h"
|
|
39
|
+
#include "absl/strings/resize_and_overwrite.h"
|
|
38
40
|
#include "absl/strings/str_cat.h"
|
|
39
41
|
#include "absl/strings/string_view.h"
|
|
40
42
|
|
|
@@ -76,30 +78,31 @@ inline bool IsSurrogate(char32_t c, absl::string_view src,
|
|
|
76
78
|
//
|
|
77
79
|
// Unescapes C escape sequences and is the reverse of CEscape().
|
|
78
80
|
//
|
|
79
|
-
// If `src` is valid, stores the unescaped string `dst
|
|
80
|
-
//
|
|
81
|
-
// description in `error`. Set `error` to
|
|
82
|
-
// reporting.
|
|
81
|
+
// If `src` is valid, stores the unescaped string in `dst` and the length of
|
|
82
|
+
// unescaped string in `dst_size`, and returns true. Otherwise returns false
|
|
83
|
+
// and optionally stores the error description in `error`. Set `error` to
|
|
84
|
+
// nullptr to disable error reporting.
|
|
83
85
|
//
|
|
84
|
-
// `src` and `dst` may use the same underlying buffer
|
|
86
|
+
// `src` and `dst` may use the same underlying buffer (but keep in mind
|
|
87
|
+
// that if this returns an error, it will leave both `src` and `dst` in
|
|
88
|
+
// an unspecified state because they are using the same underlying buffer.)
|
|
89
|
+
// `dst` must have at least as much space as `src`.
|
|
85
90
|
// ----------------------------------------------------------------------
|
|
86
91
|
|
|
87
92
|
bool CUnescapeInternal(absl::string_view src, bool leave_nulls_escaped,
|
|
88
|
-
|
|
93
|
+
char* absl_nonnull dst, size_t* absl_nonnull dst_size,
|
|
89
94
|
std::string* absl_nullable error) {
|
|
90
|
-
strings_internal::STLStringResizeUninitialized(dst, src.size());
|
|
91
|
-
|
|
92
95
|
absl::string_view::size_type p = 0; // Current src position.
|
|
93
|
-
|
|
96
|
+
size_t d = 0; // Current dst position.
|
|
94
97
|
|
|
95
98
|
// When unescaping in-place, skip any prefix that does not have escaping.
|
|
96
|
-
if (src.data() == dst
|
|
99
|
+
if (src.data() == dst) {
|
|
97
100
|
while (p < src.size() && src[p] != '\\') p++, d++;
|
|
98
101
|
}
|
|
99
102
|
|
|
100
103
|
while (p < src.size()) {
|
|
101
104
|
if (src[p] != '\\') {
|
|
102
|
-
|
|
105
|
+
dst[d++] = src[p++];
|
|
103
106
|
} else {
|
|
104
107
|
if (++p >= src.size()) { // skip past the '\\'
|
|
105
108
|
if (error != nullptr) {
|
|
@@ -108,17 +111,19 @@ bool CUnescapeInternal(absl::string_view src, bool leave_nulls_escaped,
|
|
|
108
111
|
return false;
|
|
109
112
|
}
|
|
110
113
|
switch (src[p]) {
|
|
111
|
-
|
|
112
|
-
case '
|
|
113
|
-
case '
|
|
114
|
-
case '
|
|
115
|
-
case '
|
|
116
|
-
case '
|
|
117
|
-
case '
|
|
118
|
-
case '
|
|
119
|
-
case '
|
|
120
|
-
case '
|
|
121
|
-
case '
|
|
114
|
+
// clang-format off
|
|
115
|
+
case 'a': dst[d++] = '\a'; break;
|
|
116
|
+
case 'b': dst[d++] = '\b'; break;
|
|
117
|
+
case 'f': dst[d++] = '\f'; break;
|
|
118
|
+
case 'n': dst[d++] = '\n'; break;
|
|
119
|
+
case 'r': dst[d++] = '\r'; break;
|
|
120
|
+
case 't': dst[d++] = '\t'; break;
|
|
121
|
+
case 'v': dst[d++] = '\v'; break;
|
|
122
|
+
case '\\': dst[d++] = '\\'; break;
|
|
123
|
+
case '?': dst[d++] = '\?'; break;
|
|
124
|
+
case '\'': dst[d++] = '\''; break;
|
|
125
|
+
case '"': dst[d++] = '\"'; break;
|
|
126
|
+
// clang-format on
|
|
122
127
|
case '0':
|
|
123
128
|
case '1':
|
|
124
129
|
case '2':
|
|
@@ -145,13 +150,13 @@ bool CUnescapeInternal(absl::string_view src, bool leave_nulls_escaped,
|
|
|
145
150
|
}
|
|
146
151
|
if ((ch == 0) && leave_nulls_escaped) {
|
|
147
152
|
// Copy the escape sequence for the null character
|
|
148
|
-
|
|
153
|
+
dst[d++] = '\\';
|
|
149
154
|
while (octal_start <= p) {
|
|
150
|
-
|
|
155
|
+
dst[d++] = src[octal_start++];
|
|
151
156
|
}
|
|
152
157
|
break;
|
|
153
158
|
}
|
|
154
|
-
|
|
159
|
+
dst[d++] = static_cast<char>(ch);
|
|
155
160
|
break;
|
|
156
161
|
}
|
|
157
162
|
case 'x':
|
|
@@ -185,13 +190,13 @@ bool CUnescapeInternal(absl::string_view src, bool leave_nulls_escaped,
|
|
|
185
190
|
}
|
|
186
191
|
if ((ch == 0) && leave_nulls_escaped) {
|
|
187
192
|
// Copy the escape sequence for the null character
|
|
188
|
-
|
|
193
|
+
dst[d++] = '\\';
|
|
189
194
|
while (hex_start <= p) {
|
|
190
|
-
|
|
195
|
+
dst[d++] = src[hex_start++];
|
|
191
196
|
}
|
|
192
197
|
break;
|
|
193
198
|
}
|
|
194
|
-
|
|
199
|
+
dst[d++] = static_cast<char>(ch);
|
|
195
200
|
break;
|
|
196
201
|
}
|
|
197
202
|
case 'u': {
|
|
@@ -218,16 +223,16 @@ bool CUnescapeInternal(absl::string_view src, bool leave_nulls_escaped,
|
|
|
218
223
|
}
|
|
219
224
|
if ((rune == 0) && leave_nulls_escaped) {
|
|
220
225
|
// Copy the escape sequence for the null character
|
|
221
|
-
|
|
226
|
+
dst[d++] = '\\';
|
|
222
227
|
while (hex_start <= p) {
|
|
223
|
-
|
|
228
|
+
dst[d++] = src[hex_start++];
|
|
224
229
|
}
|
|
225
230
|
break;
|
|
226
231
|
}
|
|
227
232
|
if (IsSurrogate(rune, src.substr(hex_start, 5), error)) {
|
|
228
233
|
return false;
|
|
229
234
|
}
|
|
230
|
-
d += strings_internal::EncodeUTF8Char(dst
|
|
235
|
+
d += strings_internal::EncodeUTF8Char(dst + d, rune);
|
|
231
236
|
break;
|
|
232
237
|
}
|
|
233
238
|
case 'U': {
|
|
@@ -267,17 +272,17 @@ bool CUnescapeInternal(absl::string_view src, bool leave_nulls_escaped,
|
|
|
267
272
|
}
|
|
268
273
|
if ((rune == 0) && leave_nulls_escaped) {
|
|
269
274
|
// Copy the escape sequence for the null character
|
|
270
|
-
|
|
275
|
+
dst[d++] = '\\';
|
|
271
276
|
// U00000000
|
|
272
277
|
while (hex_start <= p) {
|
|
273
|
-
|
|
278
|
+
dst[d++] = src[hex_start++];
|
|
274
279
|
}
|
|
275
280
|
break;
|
|
276
281
|
}
|
|
277
282
|
if (IsSurrogate(rune, src.substr(hex_start, 9), error)) {
|
|
278
283
|
return false;
|
|
279
284
|
}
|
|
280
|
-
d += strings_internal::EncodeUTF8Char(dst
|
|
285
|
+
d += strings_internal::EncodeUTF8Char(dst + d, rune);
|
|
281
286
|
break;
|
|
282
287
|
}
|
|
283
288
|
default: {
|
|
@@ -291,7 +296,7 @@ bool CUnescapeInternal(absl::string_view src, bool leave_nulls_escaped,
|
|
|
291
296
|
}
|
|
292
297
|
}
|
|
293
298
|
|
|
294
|
-
|
|
299
|
+
*dst_size = d;
|
|
295
300
|
return true;
|
|
296
301
|
}
|
|
297
302
|
|
|
@@ -441,22 +446,22 @@ void CEscapeAndAppendInternal(absl::string_view src,
|
|
|
441
446
|
|
|
442
447
|
// We keep 3 slop bytes so that we can call `little_endian::Store32`
|
|
443
448
|
// invariably regardless of the length of the escaped character.
|
|
444
|
-
constexpr size_t
|
|
449
|
+
constexpr size_t kSlopBytes = 3;
|
|
445
450
|
size_t cur_dest_len = dest->size();
|
|
446
|
-
size_t
|
|
447
|
-
ABSL_INTERNAL_CHECK(
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
451
|
+
size_t append_buf_len = cur_dest_len + escaped_len + kSlopBytes;
|
|
452
|
+
ABSL_INTERNAL_CHECK(append_buf_len > cur_dest_len,
|
|
453
|
+
"std::string size overflow");
|
|
454
|
+
strings_internal::StringAppendAndOverwrite(
|
|
455
|
+
*dest, append_buf_len, [src, escaped_len](char* append_ptr, size_t) {
|
|
456
|
+
for (char c : src) {
|
|
457
|
+
unsigned char uc = static_cast<unsigned char>(c);
|
|
458
|
+
size_t char_len = kCEscapedLen[uc];
|
|
459
|
+
uint32_t little_endian_uint32 = kCEscapedLittleEndianUint32Array[uc];
|
|
460
|
+
little_endian::Store32(append_ptr, little_endian_uint32);
|
|
461
|
+
append_ptr += char_len;
|
|
462
|
+
}
|
|
463
|
+
return escaped_len;
|
|
464
|
+
});
|
|
460
465
|
}
|
|
461
466
|
|
|
462
467
|
// Reverses the mapping in Base64EscapeInternal; see that method's
|
|
@@ -807,23 +812,18 @@ bool Base64UnescapeInternal(const char* absl_nullable src, size_t slen,
|
|
|
807
812
|
// 4 characters. Any leftover chars are added directly for good measure.
|
|
808
813
|
const size_t dest_len = 3 * (slen / 4) + (slen % 4);
|
|
809
814
|
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
// could be shorter if there was padding
|
|
823
|
-
assert(len <= dest_len);
|
|
824
|
-
dest->erase(len);
|
|
825
|
-
|
|
826
|
-
return true;
|
|
815
|
+
bool ok;
|
|
816
|
+
StringResizeAndOverwrite(
|
|
817
|
+
*dest, dest_len, [src, slen, unbase64, &ok](char* buf, size_t buf_size) {
|
|
818
|
+
size_t len;
|
|
819
|
+
ok = Base64UnescapeInternal(src, slen, buf, buf_size, unbase64, &len);
|
|
820
|
+
if (!ok) {
|
|
821
|
+
len = 0;
|
|
822
|
+
}
|
|
823
|
+
assert(len <= buf_size); // Could be shorter if there was padding.
|
|
824
|
+
return len;
|
|
825
|
+
});
|
|
826
|
+
return ok;
|
|
827
827
|
}
|
|
828
828
|
|
|
829
829
|
/* clang-format off */
|
|
@@ -878,15 +878,11 @@ void HexStringToBytesInternal(const char* absl_nullable from, T to,
|
|
|
878
878
|
}
|
|
879
879
|
}
|
|
880
880
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
void BytesToHexStringInternal(const unsigned char* absl_nullable src, T dest,
|
|
885
|
-
size_t num) {
|
|
886
|
-
auto dest_ptr = &dest[0];
|
|
887
|
-
for (auto src_ptr = src; src_ptr != (src + num); ++src_ptr, dest_ptr += 2) {
|
|
881
|
+
void BytesToHexStringInternal(const unsigned char* absl_nullable src,
|
|
882
|
+
char* dest, size_t num) {
|
|
883
|
+
for (auto src_ptr = src; src_ptr != (src + num); ++src_ptr, dest += 2) {
|
|
888
884
|
const char* hex_p = &numbers_internal::kHexTable[*src_ptr * 2];
|
|
889
|
-
std::copy(hex_p, hex_p + 2,
|
|
885
|
+
std::copy(hex_p, hex_p + 2, dest);
|
|
890
886
|
}
|
|
891
887
|
}
|
|
892
888
|
|
|
@@ -897,9 +893,35 @@ void BytesToHexStringInternal(const unsigned char* absl_nullable src, T dest,
|
|
|
897
893
|
//
|
|
898
894
|
// See CUnescapeInternal() for implementation details.
|
|
899
895
|
// ----------------------------------------------------------------------
|
|
896
|
+
|
|
900
897
|
bool CUnescape(absl::string_view source, std::string* absl_nonnull dest,
|
|
901
898
|
std::string* absl_nullable error) {
|
|
902
|
-
|
|
899
|
+
bool success;
|
|
900
|
+
|
|
901
|
+
// `CUnescape()` allows for in-place unescaping, which means `source` may
|
|
902
|
+
// alias `*dest`. However, absl::StringResizeAndOverwrite() invalidates all
|
|
903
|
+
// iterators, pointers, and references into the string, regardless whether
|
|
904
|
+
// reallocation occurs. Therefore we need to avoid calling
|
|
905
|
+
// absl::StringResizeAndOverwrite() when `source.data() ==
|
|
906
|
+
// dest->data()`. Comparing the sizes is sufficient to cover this case.
|
|
907
|
+
if (dest->size() >= source.size()) {
|
|
908
|
+
size_t dest_size = 0;
|
|
909
|
+
success = CUnescapeInternal(source, kUnescapeNulls, dest->data(),
|
|
910
|
+
&dest_size, error);
|
|
911
|
+
ABSL_ASSERT(dest_size <= dest->size());
|
|
912
|
+
dest->erase(dest_size);
|
|
913
|
+
} else {
|
|
914
|
+
StringResizeAndOverwrite(
|
|
915
|
+
*dest, source.size(),
|
|
916
|
+
[source, error, &success](char* buf, size_t buf_size) {
|
|
917
|
+
size_t dest_size = 0;
|
|
918
|
+
success =
|
|
919
|
+
CUnescapeInternal(source, kUnescapeNulls, buf, &dest_size, error);
|
|
920
|
+
ABSL_ASSERT(dest_size <= buf_size);
|
|
921
|
+
return dest_size;
|
|
922
|
+
});
|
|
923
|
+
}
|
|
924
|
+
return success;
|
|
903
925
|
}
|
|
904
926
|
|
|
905
927
|
std::string CEscape(absl::string_view src) {
|
|
@@ -966,19 +988,23 @@ bool HexStringToBytes(absl::string_view hex, std::string* absl_nonnull bytes) {
|
|
|
966
988
|
return false;
|
|
967
989
|
}
|
|
968
990
|
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
991
|
+
StringResizeAndOverwrite(
|
|
992
|
+
output, num_bytes, [hex](char* buf, size_t buf_size) {
|
|
993
|
+
auto hex_p = hex.cbegin();
|
|
994
|
+
for (size_t i = 0; i < buf_size; ++i) {
|
|
995
|
+
int h1 = absl::kHexValueStrict[static_cast<size_t>(*hex_p++)];
|
|
996
|
+
int h2 = absl::kHexValueStrict[static_cast<size_t>(*hex_p++)];
|
|
997
|
+
if (h1 == -1 || h2 == -1) {
|
|
998
|
+
return size_t{0};
|
|
999
|
+
}
|
|
1000
|
+
buf[i] = static_cast<char>((h1 << 4) + h2);
|
|
1001
|
+
}
|
|
1002
|
+
return buf_size;
|
|
1003
|
+
});
|
|
981
1004
|
|
|
1005
|
+
if (output.size() != num_bytes) {
|
|
1006
|
+
return false;
|
|
1007
|
+
}
|
|
982
1008
|
*bytes = std::move(output);
|
|
983
1009
|
return true;
|
|
984
1010
|
}
|
|
@@ -986,16 +1012,22 @@ bool HexStringToBytes(absl::string_view hex, std::string* absl_nonnull bytes) {
|
|
|
986
1012
|
std::string HexStringToBytes(absl::string_view from) {
|
|
987
1013
|
std::string result;
|
|
988
1014
|
const auto num = from.size() / 2;
|
|
989
|
-
|
|
990
|
-
|
|
1015
|
+
StringResizeAndOverwrite(result, num, [from](char* buf, size_t buf_size) {
|
|
1016
|
+
absl::HexStringToBytesInternal<char*>(from.data(), buf, buf_size);
|
|
1017
|
+
return buf_size;
|
|
1018
|
+
});
|
|
991
1019
|
return result;
|
|
992
1020
|
}
|
|
993
1021
|
|
|
994
1022
|
std::string BytesToHexString(absl::string_view from) {
|
|
995
1023
|
std::string result;
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
1024
|
+
StringResizeAndOverwrite(
|
|
1025
|
+
result, 2 * from.size(), [from](char* buf, size_t buf_size) {
|
|
1026
|
+
absl::BytesToHexStringInternal(
|
|
1027
|
+
reinterpret_cast<const unsigned char*>(from.data()), buf,
|
|
1028
|
+
from.size());
|
|
1029
|
+
return buf_size;
|
|
1030
|
+
});
|
|
999
1031
|
return result;
|
|
1000
1032
|
}
|
|
1001
1033
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Copyright 2025 The Abseil Authors
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
#ifndef ABSL_STRINGS_INTERNAL_APPEND_AND_OVERWRITE_H_
|
|
16
|
+
#define ABSL_STRINGS_INTERNAL_APPEND_AND_OVERWRITE_H_
|
|
17
|
+
|
|
18
|
+
#include "absl/base/config.h"
|
|
19
|
+
#include "absl/base/internal/throw_delegate.h"
|
|
20
|
+
#include "absl/base/macros.h"
|
|
21
|
+
#include "absl/base/optimization.h"
|
|
22
|
+
#include "absl/strings/resize_and_overwrite.h"
|
|
23
|
+
|
|
24
|
+
namespace absl {
|
|
25
|
+
ABSL_NAMESPACE_BEGIN
|
|
26
|
+
namespace strings_internal {
|
|
27
|
+
|
|
28
|
+
// An internal-only variant similar to `absl::StringResizeAndOverwrite()`
|
|
29
|
+
// optimized for repeated appends to a string that uses exponential growth so
|
|
30
|
+
// that the amortized complexity of increasing the string size by a small amount
|
|
31
|
+
// is O(1), in contrast to O(str.size()) in the case of precise growth. Use of
|
|
32
|
+
// this function is subtle; see https://reviews.llvm.org/D102727 to understand
|
|
33
|
+
// the tradeoffs.
|
|
34
|
+
//
|
|
35
|
+
// Appends at most `append_n` characters to `str`, using the user-provided
|
|
36
|
+
// operation `append_op` to modify the possibly indeterminate
|
|
37
|
+
// contents. `append_op` must return the length of the buffer appended to `str`.
|
|
38
|
+
//
|
|
39
|
+
// Invalidates all iterators, pointers, and references into `str`, regardless
|
|
40
|
+
// of whether reallocation occurs.
|
|
41
|
+
//
|
|
42
|
+
// `append_op(value_type* buf, size_t buf_size)` is allowed to write
|
|
43
|
+
// `value_type{}` to `buf[buf_size]`, which facilitiates interoperation with
|
|
44
|
+
// functions that write a trailing NUL.
|
|
45
|
+
template <typename T, typename Op>
|
|
46
|
+
void StringAppendAndOverwrite(T& str, typename T::size_type append_n,
|
|
47
|
+
Op append_op) {
|
|
48
|
+
if (ABSL_PREDICT_FALSE(append_n > str.max_size() - str.size())) {
|
|
49
|
+
absl::base_internal::ThrowStdLengthError(
|
|
50
|
+
"absl::strings_internal::StringAppendAndOverwrite");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
auto old_size = str.size();
|
|
54
|
+
auto resize = old_size + append_n;
|
|
55
|
+
|
|
56
|
+
if (resize > str.capacity()) {
|
|
57
|
+
// Make sure to always grow by at least a factor of 2x.
|
|
58
|
+
const auto min_growth = str.capacity();
|
|
59
|
+
if (ABSL_PREDICT_FALSE(str.capacity() > str.max_size() - min_growth)) {
|
|
60
|
+
resize = str.max_size();
|
|
61
|
+
} else if (resize < str.capacity() + min_growth) {
|
|
62
|
+
resize = str.capacity() + min_growth;
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
resize = str.capacity();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Avoid calling StringResizeAndOverwrite() here since it does an MSAN
|
|
69
|
+
// verification on the entire string. StringResizeAndOverwriteImpl() is
|
|
70
|
+
// StringResizeAndOverwrite() without the MSAN verification.
|
|
71
|
+
StringResizeAndOverwriteImpl(
|
|
72
|
+
str, resize,
|
|
73
|
+
[old_size, append_n, do_append = std::move(append_op)](
|
|
74
|
+
typename T::value_type* data_ptr, typename T::size_type) mutable {
|
|
75
|
+
auto num_appended =
|
|
76
|
+
std::move(do_append)(data_ptr + old_size, append_n);
|
|
77
|
+
ABSL_HARDENING_ASSERT(num_appended >= 0 && num_appended <= append_n);
|
|
78
|
+
return old_size + num_appended;
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
#if defined(ABSL_HAVE_MEMORY_SANITIZER)
|
|
82
|
+
// Only check the region appended to. Checking the entire string would cause
|
|
83
|
+
// pathological quadratic verfication on repeated small appends.
|
|
84
|
+
__msan_check_mem_is_initialized(str.data() + old_size, str.size() - old_size);
|
|
85
|
+
#endif
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
} // namespace strings_internal
|
|
89
|
+
ABSL_NAMESPACE_END
|
|
90
|
+
} // namespace absl
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
#endif // ABSL_STRINGS_INTERNAL_APPEND_AND_OVERWRITE_H_
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Copyright 2025 The Abseil Authors
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
#include "absl/strings/internal/append_and_overwrite.h"
|
|
16
|
+
|
|
17
|
+
#include <algorithm>
|
|
18
|
+
#include <cstddef>
|
|
19
|
+
#include <string>
|
|
20
|
+
|
|
21
|
+
#include "gtest/gtest.h"
|
|
22
|
+
#include "absl/log/absl_check.h"
|
|
23
|
+
|
|
24
|
+
namespace {
|
|
25
|
+
|
|
26
|
+
struct AppendAndOverwriteParam {
|
|
27
|
+
size_t initial_size;
|
|
28
|
+
size_t append_capacity;
|
|
29
|
+
size_t append_size;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
using StringAppendAndOverwriteTest =
|
|
33
|
+
::testing::TestWithParam<AppendAndOverwriteParam>;
|
|
34
|
+
|
|
35
|
+
TEST_P(StringAppendAndOverwriteTest, StringAppendAndOverwrite) {
|
|
36
|
+
const auto& param = GetParam();
|
|
37
|
+
std::string s(param.initial_size, 'a');
|
|
38
|
+
absl::strings_internal::StringAppendAndOverwrite(
|
|
39
|
+
s, param.append_capacity, [&](char* p, size_t n) {
|
|
40
|
+
ABSL_CHECK_EQ(n, param.append_capacity);
|
|
41
|
+
std::fill_n(p, param.append_size, 'b');
|
|
42
|
+
p[param.append_size] = '\0';
|
|
43
|
+
return param.append_size;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
std::string expected =
|
|
47
|
+
std::string(param.initial_size, 'a') +
|
|
48
|
+
std::string(param.append_size,
|
|
49
|
+
'b');
|
|
50
|
+
|
|
51
|
+
EXPECT_EQ(s, expected);
|
|
52
|
+
EXPECT_EQ(s.c_str()[s.size()], '\0');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// clang-format off
|
|
56
|
+
INSTANTIATE_TEST_SUITE_P(StringAppendAndOverwriteTestSuite,
|
|
57
|
+
StringAppendAndOverwriteTest,
|
|
58
|
+
::testing::ValuesIn<AppendAndOverwriteParam>({
|
|
59
|
+
{0, 10, 5},
|
|
60
|
+
{10, 10, 10},
|
|
61
|
+
{10, 15, 15},
|
|
62
|
+
{10, 20, 15},
|
|
63
|
+
{10, 40, 40},
|
|
64
|
+
{10, 50, 40},
|
|
65
|
+
{30, 35, 35},
|
|
66
|
+
{30, 45, 35},
|
|
67
|
+
{10, 30, 15},
|
|
68
|
+
}));
|
|
69
|
+
// clang-format on
|
|
70
|
+
|
|
71
|
+
TEST(StringAppendAndOverwrite, AmortizedComplexity) {
|
|
72
|
+
std::string str;
|
|
73
|
+
std::string expected;
|
|
74
|
+
size_t prev_cap = str.capacity();
|
|
75
|
+
int cap_increase_count = 0;
|
|
76
|
+
for (int i = 0; i < 1000; ++i) {
|
|
77
|
+
char c = static_cast<char>('a' + (i % 26));
|
|
78
|
+
absl::strings_internal::StringAppendAndOverwrite(
|
|
79
|
+
str, 1, [c](char* buf, size_t buf_size) {
|
|
80
|
+
ABSL_CHECK_EQ(buf_size, 1);
|
|
81
|
+
buf[0] = c;
|
|
82
|
+
return size_t{1};
|
|
83
|
+
});
|
|
84
|
+
expected.push_back(c);
|
|
85
|
+
EXPECT_EQ(str, expected);
|
|
86
|
+
size_t new_cap = str.capacity();
|
|
87
|
+
if (new_cap > prev_cap) {
|
|
88
|
+
++cap_increase_count;
|
|
89
|
+
}
|
|
90
|
+
prev_cap = new_cap;
|
|
91
|
+
}
|
|
92
|
+
EXPECT_LT(cap_increase_count, 50);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
} // namespace
|
|
@@ -381,6 +381,8 @@ struct CordRepExternalImpl
|
|
|
381
381
|
this->releaser_invoker = &Release;
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
+
const Releaser* releaser() const { return &this->template get<0>(); }
|
|
385
|
+
|
|
384
386
|
~CordRepExternalImpl() {
|
|
385
387
|
InvokeReleaser(Rank1{}, std::move(this->template get<0>()),
|
|
386
388
|
absl::string_view(base, length));
|
|
@@ -1230,16 +1230,16 @@ TEST(CordRepBtreeTest, Dump) {
|
|
|
1230
1230
|
|
|
1231
1231
|
if (api != 3) {
|
|
1232
1232
|
// Does not contain contents
|
|
1233
|
-
EXPECT_THAT(str, Not(AnyOf(
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1233
|
+
EXPECT_THAT(str, Not(AnyOf(HasSubstr("data = \"Hello world\""),
|
|
1234
|
+
HasSubstr("data = \"Hello external\""),
|
|
1235
|
+
HasSubstr("data = \"ello w\""),
|
|
1236
|
+
HasSubstr("data = \"llo ext\""))));
|
|
1237
1237
|
} else {
|
|
1238
1238
|
// Contains contents
|
|
1239
|
-
EXPECT_THAT(str, AllOf(
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1239
|
+
EXPECT_THAT(str, AllOf(HasSubstr("data = \"Hello world\""),
|
|
1240
|
+
HasSubstr("data = \"Hello external\""),
|
|
1241
|
+
HasSubstr("data = \"ello w\""),
|
|
1242
|
+
HasSubstr("data = \"llo ext\"")));
|
|
1243
1243
|
}
|
|
1244
1244
|
}
|
|
1245
1245
|
|