re2 1.22.2 → 1.23.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/README.md +60 -4
- package/binding.gyp +5 -1
- package/lib/addon.cc +4 -0
- package/lib/new.cc +1 -246
- package/lib/pattern.cc +252 -0
- package/lib/pattern.h +10 -0
- package/lib/set.cc +777 -0
- package/lib/wrapped_re2_set.h +42 -0
- package/package.json +21 -9
- package/re2.d.ts +46 -9
- package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
- package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
- package/vendor/abseil-cpp/CMake/README.md +2 -2
- package/vendor/abseil-cpp/CMakeLists.txt +3 -3
- package/vendor/abseil-cpp/MODULE.bazel +6 -9
- package/vendor/abseil-cpp/README.md +6 -8
- package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
- package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
- package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
- package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
- package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
- package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
- package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
- package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
- package/vendor/abseil-cpp/absl/base/config.h +22 -129
- package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
- package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
- package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
- package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
- package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
- package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
- package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
- package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
- package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
- package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
- package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
- package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
- package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
- package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
- package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
- package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
- package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
- package/vendor/abseil-cpp/absl/base/options.h +3 -80
- package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
- package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
- package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
- package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
- package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
- package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
- package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
- package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
- package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
- package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
- package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
- package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
- package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
- package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
- package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
- package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
- package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
- package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
- package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
- package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
- package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
- package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
- package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
- package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
- package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
- package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
- package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
- package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
- package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
- package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
- package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
- package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
- package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
- package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
- package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
- package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
- package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
- package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
- package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
- package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
- package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
- package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
- package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
- package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
- package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
- package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
- package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
- package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
- package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
- package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
- package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
- package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
- package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
- package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
- package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
- package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
- package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
- package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
- package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
- package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
- package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
- package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
- package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
- package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
- package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
- package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
- package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
- package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
- package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
- package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
- package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
- package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
- package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
- package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
- package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
- package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
- package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
- package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
- package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
- package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
- package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
- package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
- package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
- package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
- package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
- package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
- package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
- package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
- package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
- package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
- package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
- package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
- package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
- package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
- package/vendor/abseil-cpp/absl/log/check.h +2 -1
- package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
- package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
- package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
- package/vendor/abseil-cpp/absl/log/globals.h +4 -5
- package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
- package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
- package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
- package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
- package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
- package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
- package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
- package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
- package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
- package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
- package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
- package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
- package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
- package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
- package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
- package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
- package/vendor/abseil-cpp/absl/log/log.h +48 -35
- package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
- package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
- package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
- package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
- package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
- package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
- package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
- package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
- package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
- package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
- package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
- package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
- package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
- package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
- package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
- package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
- package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
- package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
- package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
- package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
- package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
- package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
- package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
- package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
- package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
- package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
- package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
- package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
- package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
- package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
- package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
- package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
- package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
- package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
- package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
- package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
- package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
- package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
- package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
- package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
- package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
- package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
- package/vendor/abseil-cpp/absl/random/random.h +88 -53
- package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
- package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
- package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
- package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
- package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
- package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
- package/vendor/abseil-cpp/absl/status/status.cc +4 -8
- package/vendor/abseil-cpp/absl/status/status.h +8 -8
- package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
- package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
- package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
- package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
- package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
- package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
- package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
- package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
- package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
- package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
- package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
- package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
- package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
- package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
- package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
- package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
- package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
- package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
- package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
- package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
- package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
- package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
- package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
- package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
- package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
- package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
- package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
- package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
- package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
- package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
- package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
- package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
- package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
- package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
- package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
- package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
- package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
- package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
- package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
- package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
- package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
- package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
- package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
- package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
- package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
- package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
- package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
- package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
- package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
- package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
- package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
- package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
- package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
- package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
- package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
- package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
- package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
- package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
- package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
- package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
- package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
- package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
- package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
- package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
- package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
- package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
- package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
- package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
- package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
- package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
- package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
- package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
- package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
- package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
- package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
- package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
- package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
- package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
- package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
- package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
- package/vendor/abseil-cpp/absl/time/time.h +24 -18
- package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
- package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
- package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
- package/vendor/abseil-cpp/absl/types/any.h +9 -484
- package/vendor/abseil-cpp/absl/types/optional.h +7 -747
- package/vendor/abseil-cpp/absl/types/span.h +46 -19
- package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
- package/vendor/abseil-cpp/absl/types/variant.h +5 -784
- package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
- package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
- package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
- package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
- package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
- package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
- package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
- package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
- package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
- package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
- package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
- package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
- package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
- package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
- package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
- package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
- package/vendor/re2/.bazelrc +4 -4
- package/vendor/re2/.bcr/metadata.template.json +16 -0
- package/vendor/re2/.bcr/presubmit.yml +57 -0
- package/vendor/re2/.bcr/source.template.json +5 -0
- package/vendor/re2/.github/bazel.sh +1 -7
- package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
- package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
- package/vendor/re2/.github/workflows/ci.yml +5 -6
- package/vendor/re2/.github/workflows/pages.yml +3 -3
- package/vendor/re2/.github/workflows/python.yml +29 -24
- package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
- package/vendor/re2/.github/workflows/release.yml +15 -4
- package/vendor/re2/BUILD.bazel +25 -0
- package/vendor/re2/CMakeLists.txt +100 -85
- package/vendor/re2/CONTRIBUTING.md +0 -1
- package/vendor/re2/MODULE.bazel +10 -10
- package/vendor/re2/Makefile +1 -1
- package/vendor/re2/README.md +259 -0
- package/vendor/re2/python/BUILD.bazel +8 -0
- package/vendor/re2/python/re2.py +1 -1
- package/vendor/re2/python/re2_test.py +6 -0
- package/vendor/re2/python/setup.py +3 -3
- package/vendor/re2/re2/bitmap256.cc +3 -4
- package/vendor/re2/re2/bitstate.cc +15 -10
- package/vendor/re2/re2/dfa.cc +1 -2
- package/vendor/re2/re2/parse.cc +3 -4
- package/vendor/re2/re2/prog.cc +1 -2
- package/vendor/re2/re2/prog.h +1 -0
- package/vendor/re2/re2/re2.cc +5 -0
- package/vendor/re2/re2/re2.h +9 -9
- package/vendor/re2/re2/set.cc +6 -0
- package/vendor/re2/re2/set.h +5 -0
- package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
- package/vendor/re2/re2/testing/re2_test.cc +8 -0
- package/vendor/re2/re2/testing/set_test.cc +5 -0
- package/vendor/re2/re2/walker-inl.h +1 -1
- package/vendor/abseil-cpp/WORKSPACE +0 -76
- package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
- package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
- package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
- package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
- package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
- package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
- package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
- package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
- package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
- package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
- package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
- package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
- package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
- package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
- package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
- package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
- package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
- package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
- package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
- package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
- package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
- package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
- package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
- package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
- package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
- package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
- package/vendor/re2/.github/workflows/pr.yml +0 -34
- package/vendor/re2/README +0 -47
|
@@ -50,11 +50,6 @@ struct StringConstant {
|
|
|
50
50
|
"The input string_view must point to constant data.");
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
#ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
|
|
54
|
-
template <typename T>
|
|
55
|
-
constexpr absl::string_view StringConstant<T>::value;
|
|
56
|
-
#endif
|
|
57
|
-
|
|
58
53
|
// Factory function for `StringConstant` instances.
|
|
59
54
|
// It supports callables that have a constexpr default constructor and a
|
|
60
55
|
// constexpr operator().
|
|
@@ -16,11 +16,17 @@
|
|
|
16
16
|
|
|
17
17
|
#include "absl/strings/internal/utf8.h"
|
|
18
18
|
|
|
19
|
+
#include <cstddef>
|
|
20
|
+
#include <cstdint>
|
|
21
|
+
#include <limits>
|
|
22
|
+
|
|
23
|
+
#include "absl/base/config.h"
|
|
24
|
+
|
|
19
25
|
namespace absl {
|
|
20
26
|
ABSL_NAMESPACE_BEGIN
|
|
21
27
|
namespace strings_internal {
|
|
22
28
|
|
|
23
|
-
size_t EncodeUTF8Char(char
|
|
29
|
+
size_t EncodeUTF8Char(char* buffer, char32_t utf8_char) {
|
|
24
30
|
if (utf8_char <= 0x7F) {
|
|
25
31
|
*buffer = static_cast<char>(utf8_char);
|
|
26
32
|
return 1;
|
|
@@ -48,6 +54,95 @@ size_t EncodeUTF8Char(char *buffer, char32_t utf8_char) {
|
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
|
|
57
|
+
size_t WideToUtf8(wchar_t wc, char* buf, ShiftState& s) {
|
|
58
|
+
// Reinterpret the output buffer `buf` as `unsigned char*` for subsequent
|
|
59
|
+
// bitwise operations. This ensures well-defined behavior for bit
|
|
60
|
+
// manipulations (avoiding issues with signed `char`) and is safe under C++
|
|
61
|
+
// aliasing rules, as `unsigned char` can alias any type.
|
|
62
|
+
auto* ubuf = reinterpret_cast<unsigned char*>(buf);
|
|
63
|
+
const uint32_t v = static_cast<uint32_t>(wc);
|
|
64
|
+
constexpr size_t kError = static_cast<size_t>(-1);
|
|
65
|
+
|
|
66
|
+
if (v <= 0x007F) {
|
|
67
|
+
// 1-byte sequence (U+0000 to U+007F).
|
|
68
|
+
// 0xxxxxxx.
|
|
69
|
+
ubuf[0] = (0b0111'1111 & v);
|
|
70
|
+
s = {}; // Reset surrogate state.
|
|
71
|
+
return 1;
|
|
72
|
+
} else if (0x0080 <= v && v <= 0x07FF) {
|
|
73
|
+
// 2-byte sequence (U+0080 to U+07FF).
|
|
74
|
+
// 110xxxxx 10xxxxxx.
|
|
75
|
+
ubuf[0] = 0b1100'0000 | (0b0001'1111 & (v >> 6));
|
|
76
|
+
ubuf[1] = 0b1000'0000 | (0b0011'1111 & v);
|
|
77
|
+
s = {}; // Reset surrogate state.
|
|
78
|
+
return 2;
|
|
79
|
+
} else if ((0x0800 <= v && v <= 0xD7FF) || (0xE000 <= v && v <= 0xFFFF)) {
|
|
80
|
+
// 3-byte sequence (U+0800 to U+D7FF or U+E000 to U+FFFF).
|
|
81
|
+
// Excludes surrogate code points U+D800-U+DFFF.
|
|
82
|
+
// 1110xxxx 10xxxxxx 10xxxxxx.
|
|
83
|
+
ubuf[0] = 0b1110'0000 | (0b0000'1111 & (v >> 12));
|
|
84
|
+
ubuf[1] = 0b1000'0000 | (0b0011'1111 & (v >> 6));
|
|
85
|
+
ubuf[2] = 0b1000'0000 | (0b0011'1111 & v);
|
|
86
|
+
s = {}; // Reset surrogate state.
|
|
87
|
+
return 3;
|
|
88
|
+
} else if (0xD800 <= v && v <= 0xDBFF) {
|
|
89
|
+
// High Surrogate (U+D800 to U+DBFF).
|
|
90
|
+
// This part forms the first two bytes of an eventual 4-byte UTF-8 sequence.
|
|
91
|
+
const unsigned char high_bits_val = (0b0000'1111 & (v >> 6)) + 1;
|
|
92
|
+
|
|
93
|
+
// First byte of the 4-byte UTF-8 sequence (11110xxx).
|
|
94
|
+
ubuf[0] = 0b1111'0000 | (0b0000'0111 & (high_bits_val >> 2));
|
|
95
|
+
// Second byte of the 4-byte UTF-8 sequence (10xxxxxx).
|
|
96
|
+
ubuf[1] = 0b1000'0000 | //
|
|
97
|
+
(0b0011'0000 & (high_bits_val << 4)) | //
|
|
98
|
+
(0b0000'1111 & (v >> 2));
|
|
99
|
+
// Set state for high surrogate after writing to buffer.
|
|
100
|
+
s = {true, static_cast<unsigned char>(0b0000'0011 & v)};
|
|
101
|
+
return 2; // Wrote 2 bytes, expecting 2 more from a low surrogate.
|
|
102
|
+
} else if (0xDC00 <= v && v <= 0xDFFF) {
|
|
103
|
+
// Low Surrogate (U+DC00 to U+DFFF).
|
|
104
|
+
// This part forms the last two bytes of a 4-byte UTF-8 sequence,
|
|
105
|
+
// using state from a preceding high surrogate.
|
|
106
|
+
if (!s.saw_high_surrogate) {
|
|
107
|
+
// Error: Isolated low surrogate without a preceding high surrogate.
|
|
108
|
+
// s remains in its current (problematic) state.
|
|
109
|
+
// Caller should handle error.
|
|
110
|
+
return kError;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Third byte of the 4-byte UTF-8 sequence (10xxxxxx).
|
|
114
|
+
ubuf[0] = 0b1000'0000 | //
|
|
115
|
+
(0b0011'0000 & (s.bits << 4)) | //
|
|
116
|
+
(0b0000'1111 & (v >> 6));
|
|
117
|
+
// Fourth byte of the 4-byte UTF-8 sequence (10xxxxxx).
|
|
118
|
+
ubuf[1] = 0b1000'0000 | (0b0011'1111 & v);
|
|
119
|
+
|
|
120
|
+
s = {}; // Reset surrogate state, pair complete.
|
|
121
|
+
return 2; // Wrote 2 more bytes, completing the 4-byte sequence.
|
|
122
|
+
} else if constexpr (0xFFFF < std::numeric_limits<wchar_t>::max()) {
|
|
123
|
+
// Conditionally compile the 4-byte direct conversion branch.
|
|
124
|
+
// This block is compiled only if wchar_t can represent values > 0xFFFF.
|
|
125
|
+
// It's placed after surrogate checks to ensure surrogates are handled by
|
|
126
|
+
// their specific logic. This inner 'if' is the runtime check for the 4-byte
|
|
127
|
+
// range. At this point, v is known not to be in the 1, 2, or 3-byte BMP
|
|
128
|
+
// ranges, nor is it a surrogate code point.
|
|
129
|
+
if (0x10000 <= v && v <= 0x10FFFF) {
|
|
130
|
+
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.
|
|
131
|
+
ubuf[0] = 0b1111'0000 | (0b0000'0111 & (v >> 18));
|
|
132
|
+
ubuf[1] = 0b1000'0000 | (0b0011'1111 & (v >> 12));
|
|
133
|
+
ubuf[2] = 0b1000'0000 | (0b0011'1111 & (v >> 6));
|
|
134
|
+
ubuf[3] = 0b1000'0000 | (0b0011'1111 & v);
|
|
135
|
+
s = {}; // Reset surrogate state.
|
|
136
|
+
return 4;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Invalid wchar_t value (e.g., out of Unicode range, or unhandled after all
|
|
141
|
+
// checks).
|
|
142
|
+
s = {}; // Reset surrogate state.
|
|
143
|
+
return kError;
|
|
144
|
+
}
|
|
145
|
+
|
|
51
146
|
} // namespace strings_internal
|
|
52
147
|
ABSL_NAMESPACE_END
|
|
53
148
|
} // namespace absl
|
|
@@ -41,7 +41,21 @@ namespace strings_internal {
|
|
|
41
41
|
// characters into buffer, however never will more than kMaxEncodedUTF8Size
|
|
42
42
|
// bytes be written, regardless of the value of utf8_char.
|
|
43
43
|
enum { kMaxEncodedUTF8Size = 4 };
|
|
44
|
-
size_t EncodeUTF8Char(char
|
|
44
|
+
size_t EncodeUTF8Char(char* buffer, char32_t utf8_char);
|
|
45
|
+
|
|
46
|
+
struct ShiftState {
|
|
47
|
+
bool saw_high_surrogate = false;
|
|
48
|
+
unsigned char bits = 0;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// Converts `wc` from UTF-16 or UTF-32 to UTF-8 and writes to `buf`. `buf` is
|
|
52
|
+
// assumed to have enough space for the output. `s` is used to carry state
|
|
53
|
+
// between successive calls with a UTF-16 surrogate pair. Returns the number of
|
|
54
|
+
// chars written, or `static_cast<size_t>(-1)` on failure.
|
|
55
|
+
//
|
|
56
|
+
// This is basically std::wcrtomb(), but always outputting UTF-8 instead of
|
|
57
|
+
// respecting the current locale.
|
|
58
|
+
size_t WideToUtf8(wchar_t wc, char* buf, ShiftState& s);
|
|
45
59
|
|
|
46
60
|
} // namespace strings_internal
|
|
47
61
|
ABSL_NAMESPACE_END
|
|
@@ -14,14 +14,29 @@
|
|
|
14
14
|
|
|
15
15
|
#include "absl/strings/internal/utf8.h"
|
|
16
16
|
|
|
17
|
+
#include <cstddef>
|
|
17
18
|
#include <cstdint>
|
|
19
|
+
#include <cstring>
|
|
20
|
+
#include <string>
|
|
21
|
+
#include <type_traits>
|
|
18
22
|
#include <utility>
|
|
23
|
+
#include <vector>
|
|
19
24
|
|
|
25
|
+
#include "gmock/gmock.h"
|
|
20
26
|
#include "gtest/gtest.h"
|
|
21
27
|
#include "absl/base/port.h"
|
|
28
|
+
#include "absl/strings/string_view.h"
|
|
22
29
|
|
|
23
30
|
namespace {
|
|
24
31
|
|
|
32
|
+
using ::absl::strings_internal::kMaxEncodedUTF8Size;
|
|
33
|
+
using ::absl::strings_internal::ShiftState;
|
|
34
|
+
using ::absl::strings_internal::WideToUtf8;
|
|
35
|
+
using ::testing::StartsWith;
|
|
36
|
+
using ::testing::TestParamInfo;
|
|
37
|
+
using ::testing::TestWithParam;
|
|
38
|
+
using ::testing::ValuesIn;
|
|
39
|
+
|
|
25
40
|
#if !defined(__cpp_char8_t)
|
|
26
41
|
#if defined(__clang__)
|
|
27
42
|
#pragma clang diagnostic push
|
|
@@ -33,12 +48,12 @@ TEST(EncodeUTF8Char, BasicFunction) {
|
|
|
33
48
|
{0x00010000, u8"\U00010000"},
|
|
34
49
|
{0x0000FFFF, u8"\U0000FFFF"},
|
|
35
50
|
{0x0010FFFD, u8"\U0010FFFD"}};
|
|
36
|
-
for (auto
|
|
51
|
+
for (auto& test : tests) {
|
|
37
52
|
char buf0[7] = {'\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'};
|
|
38
53
|
char buf1[7] = {'\xFF', '\xFF', '\xFF', '\xFF', '\xFF', '\xFF', '\xFF'};
|
|
39
|
-
char
|
|
54
|
+
char* buf0_written =
|
|
40
55
|
&buf0[absl::strings_internal::EncodeUTF8Char(buf0, test.first)];
|
|
41
|
-
char
|
|
56
|
+
char* buf1_written =
|
|
42
57
|
&buf1[absl::strings_internal::EncodeUTF8Char(buf1, test.first)];
|
|
43
58
|
int apparent_length = 7;
|
|
44
59
|
while (buf0[apparent_length - 1] == '\x00' &&
|
|
@@ -63,4 +78,182 @@ TEST(EncodeUTF8Char, BasicFunction) {
|
|
|
63
78
|
#endif
|
|
64
79
|
#endif // !defined(__cpp_char8_t)
|
|
65
80
|
|
|
81
|
+
struct WideToUtf8TestCase {
|
|
82
|
+
std::string description;
|
|
83
|
+
wchar_t input;
|
|
84
|
+
std::string expected_utf8_str;
|
|
85
|
+
size_t expected_bytes_written;
|
|
86
|
+
ShiftState initial_state = {false, 0};
|
|
87
|
+
ShiftState expected_state = {false, 0};
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
std::vector<WideToUtf8TestCase> GetWideToUtf8TestCases() {
|
|
91
|
+
constexpr size_t kError = static_cast<size_t>(-1);
|
|
92
|
+
std::vector<WideToUtf8TestCase> cases = {
|
|
93
|
+
{"ASCII_A", L'A', "A", 1},
|
|
94
|
+
{"NullChar", L'\0', std::string("\0", 1), 1},
|
|
95
|
+
{"ASCII_Max_7F", L'\x7F', "\x7F", 1},
|
|
96
|
+
|
|
97
|
+
{"TwoByte_Min_80", L'\u0080', "\xC2\x80", 2},
|
|
98
|
+
{"PoundSign_A3", L'\u00A3', "\xC2\xA3", 2},
|
|
99
|
+
{"TwoByte_Max_7FF", L'\u07FF', "\xDF\xBF", 2},
|
|
100
|
+
|
|
101
|
+
{"ThreeByte_Min_800", L'\u0800', "\xE0\xA0\x80", 3},
|
|
102
|
+
{"EuroSign_20AC", L'\u20AC', "\xE2\x82\xAC", 3},
|
|
103
|
+
{"BMP_MaxBeforeSurrogates_D7FF", L'\uD7FF', "\xED\x9F\xBF", 3},
|
|
104
|
+
{"BMP_FFFF", L'\uFFFF', "\xEF\xBF\xBF", 3},
|
|
105
|
+
|
|
106
|
+
{"IsolatedHighSurr_D800", L'\xD800', "\xF0\x90", 2, {}, {true, 0}},
|
|
107
|
+
{"IsolatedHighSurr_DBFF", L'\xDBFF', "\xF4\x8F", 2, {}, {true, 3}},
|
|
108
|
+
|
|
109
|
+
{"HighSurr_D800_after_HighD800",
|
|
110
|
+
L'\xD800',
|
|
111
|
+
"\xF0\x90",
|
|
112
|
+
2,
|
|
113
|
+
{true, 0},
|
|
114
|
+
{true, 0}},
|
|
115
|
+
{"HighSurr_DBFF_after_HighDBFF",
|
|
116
|
+
L'\xDBFF',
|
|
117
|
+
"\xF4\x8F",
|
|
118
|
+
2,
|
|
119
|
+
{true, 3},
|
|
120
|
+
{true, 3}},
|
|
121
|
+
|
|
122
|
+
{"LowSurr_DC00_after_HighD800", L'\xDC00', "\x80\x80", 2, {true, 0}, {}},
|
|
123
|
+
{"LowSurr_DFFD_after_HighDBFF", L'\xDFFD', "\xBF\xBD", 2, {true, 3}, {}},
|
|
124
|
+
{"LowSurr_DC00_with_InitialState_saw_high_bits_1",
|
|
125
|
+
L'\xDC00',
|
|
126
|
+
"\x90\x80",
|
|
127
|
+
2,
|
|
128
|
+
{true, 1},
|
|
129
|
+
{}},
|
|
130
|
+
|
|
131
|
+
// Final state = initial on error.
|
|
132
|
+
{"Error_IsolatedLowSurr_DC00_NoPriorHigh", L'\xDC00', "", kError, {}, {}},
|
|
133
|
+
{"Error_IsolatedLowSurr_DFFF_NoPriorHigh", L'\xDFFF', "", kError, {}, {}},
|
|
134
|
+
|
|
135
|
+
#if (defined(WCHAR_MAX) && WCHAR_MAX > 0xFFFF)
|
|
136
|
+
{"DirectSupplementaryChars_U10000", static_cast<wchar_t>(0x10000),
|
|
137
|
+
"\xF0\x90\x80\x80", 4},
|
|
138
|
+
{"DirectSupplementaryChars_U10FFFD", static_cast<wchar_t>(0x10FFFD),
|
|
139
|
+
"\xF4\x8F\xBF\xBD", 4},
|
|
140
|
+
#endif
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
wchar_t minus_one = static_cast<wchar_t>(-1);
|
|
144
|
+
if constexpr (sizeof(wchar_t) == 2) {
|
|
145
|
+
cases.push_back({"WChar_MinusOne_as_FFFF", minus_one, "\xEF\xBF\xBF", 3});
|
|
146
|
+
} else {
|
|
147
|
+
cases.push_back(
|
|
148
|
+
{"Error_WChar_MinusOne_as_FFFFFFFF", minus_one, "", kError, {}, {}});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if constexpr (sizeof(wchar_t) >= 4) {
|
|
152
|
+
#ifdef WCHAR_MAX
|
|
153
|
+
if (static_cast<uintmax_t>(WCHAR_MAX) >= 0x110000UL) {
|
|
154
|
+
cases.push_back({"Error_OutOfRange_110000",
|
|
155
|
+
static_cast<wchar_t>(0x110000UL),
|
|
156
|
+
"",
|
|
157
|
+
kError,
|
|
158
|
+
{},
|
|
159
|
+
{}});
|
|
160
|
+
}
|
|
161
|
+
#else
|
|
162
|
+
cases.push_back({"Error_OutOfRange_110000_fallback",
|
|
163
|
+
static_cast<wchar_t>(0x110000UL),
|
|
164
|
+
"",
|
|
165
|
+
kError,
|
|
166
|
+
{},
|
|
167
|
+
{}});
|
|
168
|
+
#endif
|
|
169
|
+
}
|
|
170
|
+
return cases;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
class WideToUtf8ParamTest : public TestWithParam<WideToUtf8TestCase> {};
|
|
174
|
+
|
|
175
|
+
TEST_P(WideToUtf8ParamTest, SingleCharConversion) {
|
|
176
|
+
const auto& test_case = GetParam();
|
|
177
|
+
ShiftState state = test_case.initial_state;
|
|
178
|
+
constexpr char kFillChar = '\xAB';
|
|
179
|
+
std::string buffer(32, kFillChar);
|
|
180
|
+
|
|
181
|
+
size_t bytes_written = WideToUtf8(test_case.input, buffer.data(), state);
|
|
182
|
+
|
|
183
|
+
EXPECT_EQ(bytes_written, test_case.expected_bytes_written);
|
|
184
|
+
EXPECT_THAT(buffer, StartsWith(test_case.expected_utf8_str));
|
|
185
|
+
|
|
186
|
+
// The remaining bytes should be unchanged.
|
|
187
|
+
ASSERT_LT(test_case.expected_utf8_str.length(), buffer.size());
|
|
188
|
+
EXPECT_EQ(buffer[test_case.expected_utf8_str.length()], kFillChar);
|
|
189
|
+
|
|
190
|
+
EXPECT_EQ(state.saw_high_surrogate,
|
|
191
|
+
test_case.expected_state.saw_high_surrogate);
|
|
192
|
+
EXPECT_EQ(state.bits, test_case.expected_state.bits);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
INSTANTIATE_TEST_SUITE_P(WideCharToUtf8Conversion, WideToUtf8ParamTest,
|
|
196
|
+
ValuesIn(GetWideToUtf8TestCases()),
|
|
197
|
+
[](auto info) { return info.param.description; });
|
|
198
|
+
|
|
199
|
+
// Comprehensive test string for validating wchar_t to UTF-8 conversion.
|
|
200
|
+
// This string is designed to cover a variety of Unicode character types and
|
|
201
|
+
// sequences:
|
|
202
|
+
// 1. Basic ASCII characters (within names, numbers, and spacing).
|
|
203
|
+
// 2. Common 2-byte UTF-8 sequences:
|
|
204
|
+
// - Accented Latin characters (e.g., 'á' in "Holá").
|
|
205
|
+
// - Hebrew text with combining vowel points (e.g., "שָׁלוֹם").
|
|
206
|
+
// 3. Common 3-byte UTF-8 sequences:
|
|
207
|
+
// - Currency symbols (e.g., '€').
|
|
208
|
+
// - CJK characters (e.g., "你好", "中").
|
|
209
|
+
// - Components of complex emojis like the Zero Width Joiner (ZWJ) and
|
|
210
|
+
// Heart symbol.
|
|
211
|
+
// 4. Various 4-byte UTF-8 sequences (representing Supplementary Plane
|
|
212
|
+
// characters):
|
|
213
|
+
// - An emoji with a skin tone modifier ("👍🏻").
|
|
214
|
+
// - A flag emoji composed of regional indicators ("🇺🇸").
|
|
215
|
+
// - A complex ZWJ emoji sequence ("👩❤️💋👨") combining
|
|
216
|
+
// SP characters (👩, 💋, 👨) with BMP characters (ZWJ and ❤️).
|
|
217
|
+
// - These are critical for testing the correct handling of surrogate pairs
|
|
218
|
+
// when wchar_t is 2 bytes (e.g., on Windows).
|
|
219
|
+
// The goal is to ensure accurate conversion across a diverse set of
|
|
220
|
+
// characters.
|
|
221
|
+
//
|
|
222
|
+
// clang-format off
|
|
223
|
+
#define WIDE_STRING_LITERAL L"Holá €1 你好 שָׁלוֹם 👍🏻🇺🇸👩❤️💋👨 中"
|
|
224
|
+
#define UTF8_STRING_LITERAL u8"Holá €1 你好 שָׁלוֹם 👍🏻🇺🇸👩❤️💋👨 中"
|
|
225
|
+
// clang-format on
|
|
226
|
+
|
|
227
|
+
absl::string_view GetUtf8TestString() {
|
|
228
|
+
// `u8""` forces UTF-8 encoding; MSVC will default to e.g. CP1252 (and warn)
|
|
229
|
+
// without it. However, the resulting character type differs between pre-C++20
|
|
230
|
+
// (`char`) and C++20 (`char8_t`). So deduce the right character type for all
|
|
231
|
+
// C++ versions, init it with UTF-8, then `memcpy()` to get the result as a
|
|
232
|
+
// `char*`
|
|
233
|
+
static absl::string_view kUtf8TestString = [] {
|
|
234
|
+
using ConstChar8T = std::remove_reference_t<decltype(*u8"a")>;
|
|
235
|
+
constexpr ConstChar8T kOutputUtf8[] = UTF8_STRING_LITERAL;
|
|
236
|
+
static char output[sizeof kOutputUtf8];
|
|
237
|
+
std::memcpy(output, kOutputUtf8, sizeof kOutputUtf8);
|
|
238
|
+
return output;
|
|
239
|
+
}();
|
|
240
|
+
|
|
241
|
+
return kUtf8TestString;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
TEST(WideToUtf8, FullString) {
|
|
245
|
+
std::string buffer(kMaxEncodedUTF8Size * sizeof(WIDE_STRING_LITERAL), '\0');
|
|
246
|
+
char* buffer_ptr = buffer.data();
|
|
247
|
+
|
|
248
|
+
ShiftState state;
|
|
249
|
+
for (const wchar_t wc : WIDE_STRING_LITERAL) {
|
|
250
|
+
buffer_ptr += WideToUtf8(wc, buffer_ptr, state);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
EXPECT_THAT(buffer, StartsWith(GetUtf8TestString()));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
#undef WIDE_STRING_LITERAL
|
|
257
|
+
#undef UTF8_STRING_LITERAL
|
|
258
|
+
|
|
66
259
|
} // namespace
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
namespace absl {
|
|
48
48
|
ABSL_NAMESPACE_BEGIN
|
|
49
49
|
|
|
50
|
-
bool SimpleAtof(absl::string_view str,
|
|
50
|
+
bool SimpleAtof(absl::string_view str, float* absl_nonnull out) {
|
|
51
51
|
*out = 0.0;
|
|
52
52
|
str = StripAsciiWhitespace(str);
|
|
53
53
|
// std::from_chars doesn't accept an initial +, but SimpleAtof does, so if one
|
|
@@ -78,7 +78,7 @@ bool SimpleAtof(absl::string_view str, absl::Nonnull<float*> out) {
|
|
|
78
78
|
return true;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
bool SimpleAtod(absl::string_view str,
|
|
81
|
+
bool SimpleAtod(absl::string_view str, double* absl_nonnull out) {
|
|
82
82
|
*out = 0.0;
|
|
83
83
|
str = StripAsciiWhitespace(str);
|
|
84
84
|
// std::from_chars doesn't accept an initial +, but SimpleAtod does, so if one
|
|
@@ -109,7 +109,7 @@ bool SimpleAtod(absl::string_view str, absl::Nonnull<double*> out) {
|
|
|
109
109
|
return true;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
bool SimpleAtob(absl::string_view str,
|
|
112
|
+
bool SimpleAtob(absl::string_view str, bool* absl_nonnull out) {
|
|
113
113
|
ABSL_RAW_CHECK(out != nullptr, "Output pointer must not be nullptr.");
|
|
114
114
|
if (EqualsIgnoreCase(str, "true") || EqualsIgnoreCase(str, "t") ||
|
|
115
115
|
EqualsIgnoreCase(str, "yes") || EqualsIgnoreCase(str, "y") ||
|
|
@@ -168,7 +168,7 @@ constexpr uint64_t kDivisionBy100Mul = 10486u;
|
|
|
168
168
|
constexpr uint64_t kDivisionBy100Div = 1 << 20;
|
|
169
169
|
|
|
170
170
|
// Encode functions write the ASCII output of input `n` to `out_str`.
|
|
171
|
-
inline char* EncodeHundred(uint32_t n,
|
|
171
|
+
inline char* EncodeHundred(uint32_t n, char* absl_nonnull out_str) {
|
|
172
172
|
int num_digits = static_cast<int>(n - 10) >> 8;
|
|
173
173
|
uint32_t div10 = (n * kDivisionBy10Mul) / kDivisionBy10Div;
|
|
174
174
|
uint32_t mod10 = n - 10u * div10;
|
|
@@ -178,7 +178,7 @@ inline char* EncodeHundred(uint32_t n, absl::Nonnull<char*> out_str) {
|
|
|
178
178
|
return out_str + 2 + num_digits;
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
inline char* EncodeTenThousand(uint32_t n,
|
|
181
|
+
inline char* EncodeTenThousand(uint32_t n, char* absl_nonnull out_str) {
|
|
182
182
|
// We split lower 2 digits and upper 2 digits of n into 2 byte consecutive
|
|
183
183
|
// blocks. 123 -> [\0\1][\0\23]. We divide by 10 both blocks
|
|
184
184
|
// (it's 1 division + zeroing upper bits), and compute modulo 10 as well "in
|
|
@@ -234,8 +234,8 @@ inline uint64_t PrepareEightDigits(uint32_t i) {
|
|
|
234
234
|
return tens;
|
|
235
235
|
}
|
|
236
236
|
|
|
237
|
-
inline ABSL_ATTRIBUTE_ALWAYS_INLINE
|
|
238
|
-
uint32_t n,
|
|
237
|
+
inline ABSL_ATTRIBUTE_ALWAYS_INLINE char* absl_nonnull EncodeFullU32(
|
|
238
|
+
uint32_t n, char* absl_nonnull out_str) {
|
|
239
239
|
if (n < 10) {
|
|
240
240
|
*out_str = static_cast<char>('0' + n);
|
|
241
241
|
return out_str + 1;
|
|
@@ -284,7 +284,7 @@ inline ABSL_ATTRIBUTE_ALWAYS_INLINE char* EncodeFullU64(uint64_t i,
|
|
|
284
284
|
|
|
285
285
|
} // namespace
|
|
286
286
|
|
|
287
|
-
void numbers_internal::PutTwoDigits(uint32_t i,
|
|
287
|
+
void numbers_internal::PutTwoDigits(uint32_t i, char* absl_nonnull buf) {
|
|
288
288
|
assert(i < 100);
|
|
289
289
|
uint32_t base = kTwoZeroBytes;
|
|
290
290
|
uint32_t div10 = (i * kDivisionBy10Mul) / kDivisionBy10Div;
|
|
@@ -293,15 +293,15 @@ void numbers_internal::PutTwoDigits(uint32_t i, absl::Nonnull<char*> buf) {
|
|
|
293
293
|
little_endian::Store16(buf, static_cast<uint16_t>(base));
|
|
294
294
|
}
|
|
295
295
|
|
|
296
|
-
|
|
297
|
-
uint32_t n,
|
|
296
|
+
char* absl_nonnull numbers_internal::FastIntToBuffer(
|
|
297
|
+
uint32_t n, char* absl_nonnull out_str) {
|
|
298
298
|
out_str = EncodeFullU32(n, out_str);
|
|
299
299
|
*out_str = '\0';
|
|
300
300
|
return out_str;
|
|
301
301
|
}
|
|
302
302
|
|
|
303
|
-
|
|
304
|
-
int32_t i,
|
|
303
|
+
char* absl_nonnull numbers_internal::FastIntToBuffer(
|
|
304
|
+
int32_t i, char* absl_nonnull buffer) {
|
|
305
305
|
uint32_t u = static_cast<uint32_t>(i);
|
|
306
306
|
if (i < 0) {
|
|
307
307
|
*buffer++ = '-';
|
|
@@ -315,15 +315,15 @@ absl::Nonnull<char*> numbers_internal::FastIntToBuffer(
|
|
|
315
315
|
return buffer;
|
|
316
316
|
}
|
|
317
317
|
|
|
318
|
-
|
|
319
|
-
uint64_t i,
|
|
318
|
+
char* absl_nonnull numbers_internal::FastIntToBuffer(
|
|
319
|
+
uint64_t i, char* absl_nonnull buffer) {
|
|
320
320
|
buffer = EncodeFullU64(i, buffer);
|
|
321
321
|
*buffer = '\0';
|
|
322
322
|
return buffer;
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
-
|
|
326
|
-
int64_t i,
|
|
325
|
+
char* absl_nonnull numbers_internal::FastIntToBuffer(
|
|
326
|
+
int64_t i, char* absl_nonnull buffer) {
|
|
327
327
|
uint64_t u = static_cast<uint64_t>(i);
|
|
328
328
|
if (i < 0) {
|
|
329
329
|
*buffer++ = '-';
|
|
@@ -464,7 +464,7 @@ static ExpDigits SplitToSix(const double value) {
|
|
|
464
464
|
// Since we'd like to know if the fractional part of d is close to a half,
|
|
465
465
|
// we multiply it by 65536 and see if the fractional part is close to 32768.
|
|
466
466
|
// (The number doesn't have to be a power of two,but powers of two are faster)
|
|
467
|
-
uint64_t d64k = d * 65536;
|
|
467
|
+
uint64_t d64k = static_cast<uint64_t>(d * 65536);
|
|
468
468
|
uint32_t dddddd; // A 6-digit decimal integer.
|
|
469
469
|
if ((d64k % 65536) == 32767 || (d64k % 65536) == 32768) {
|
|
470
470
|
// OK, it's fairly likely that precision was lost above, which is
|
|
@@ -478,7 +478,8 @@ static ExpDigits SplitToSix(const double value) {
|
|
|
478
478
|
// value we're representing, of course, is M.mmm... * 2^exp2.
|
|
479
479
|
int exp2;
|
|
480
480
|
double m = std::frexp(value, &exp2);
|
|
481
|
-
uint64_t mantissa =
|
|
481
|
+
uint64_t mantissa =
|
|
482
|
+
static_cast<uint64_t>(m * (32768.0 * 65536.0 * 65536.0 * 65536.0));
|
|
482
483
|
// std::frexp returns an m value in the range [0.5, 1.0), however we
|
|
483
484
|
// can't multiply it by 2^64 and convert to an integer because some FPUs
|
|
484
485
|
// throw an exception when converting an number higher than 2^63 into an
|
|
@@ -545,7 +546,7 @@ static ExpDigits SplitToSix(const double value) {
|
|
|
545
546
|
// Helper function for fast formatting of floating-point.
|
|
546
547
|
// The result is the same as "%g", a.k.a. "%.6g".
|
|
547
548
|
size_t numbers_internal::SixDigitsToBuffer(double d,
|
|
548
|
-
|
|
549
|
+
char* absl_nonnull const buffer) {
|
|
549
550
|
static_assert(std::numeric_limits<float>::is_iec559,
|
|
550
551
|
"IEEE-754/IEC-559 support only");
|
|
551
552
|
|
|
@@ -693,9 +694,9 @@ static constexpr std::array<int8_t, 256> kAsciiToInt = {
|
|
|
693
694
|
|
|
694
695
|
// Parse the sign and optional hex or oct prefix in text.
|
|
695
696
|
inline bool safe_parse_sign_and_base(
|
|
696
|
-
absl::
|
|
697
|
-
|
|
698
|
-
|
|
697
|
+
absl::string_view* absl_nonnull text /*inout*/,
|
|
698
|
+
int* absl_nonnull base_ptr /*inout*/,
|
|
699
|
+
bool* absl_nonnull negative_ptr /*output*/) {
|
|
699
700
|
if (text->data() == nullptr) {
|
|
700
701
|
return false;
|
|
701
702
|
}
|
|
@@ -980,7 +981,7 @@ ABSL_CONST_INIT const IntType LookupTables<IntType>::kVminOverBase[] =
|
|
|
980
981
|
|
|
981
982
|
template <typename IntType>
|
|
982
983
|
inline bool safe_parse_positive_int(absl::string_view text, int base,
|
|
983
|
-
|
|
984
|
+
IntType* absl_nonnull value_p) {
|
|
984
985
|
IntType value = 0;
|
|
985
986
|
const IntType vmax = std::numeric_limits<IntType>::max();
|
|
986
987
|
assert(vmax > 0);
|
|
@@ -1017,7 +1018,7 @@ inline bool safe_parse_positive_int(absl::string_view text, int base,
|
|
|
1017
1018
|
|
|
1018
1019
|
template <typename IntType>
|
|
1019
1020
|
inline bool safe_parse_negative_int(absl::string_view text, int base,
|
|
1020
|
-
|
|
1021
|
+
IntType* absl_nonnull value_p) {
|
|
1021
1022
|
IntType value = 0;
|
|
1022
1023
|
const IntType vmin = std::numeric_limits<IntType>::min();
|
|
1023
1024
|
assert(vmin < 0);
|
|
@@ -1062,7 +1063,7 @@ inline bool safe_parse_negative_int(absl::string_view text, int base,
|
|
|
1062
1063
|
// http://pubs.opengroup.org/onlinepubs/9699919799/functions/strtol.html
|
|
1063
1064
|
template <typename IntType>
|
|
1064
1065
|
inline bool safe_int_internal(absl::string_view text,
|
|
1065
|
-
|
|
1066
|
+
IntType* absl_nonnull value_p, int base) {
|
|
1066
1067
|
*value_p = 0;
|
|
1067
1068
|
bool negative;
|
|
1068
1069
|
if (!safe_parse_sign_and_base(&text, &base, &negative)) {
|
|
@@ -1077,7 +1078,7 @@ inline bool safe_int_internal(absl::string_view text,
|
|
|
1077
1078
|
|
|
1078
1079
|
template <typename IntType>
|
|
1079
1080
|
inline bool safe_uint_internal(absl::string_view text,
|
|
1080
|
-
|
|
1081
|
+
IntType* absl_nonnull value_p, int base) {
|
|
1081
1082
|
*value_p = 0;
|
|
1082
1083
|
bool negative;
|
|
1083
1084
|
if (!safe_parse_sign_and_base(&text, &base, &negative) || negative) {
|
|
@@ -1111,32 +1112,52 @@ ABSL_CONST_INIT ABSL_DLL const char kHexTable[513] =
|
|
|
1111
1112
|
"e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
|
|
1112
1113
|
"f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
|
|
1113
1114
|
|
|
1114
|
-
bool
|
|
1115
|
+
bool safe_strto8_base(absl::string_view text, int8_t* absl_nonnull value,
|
|
1116
|
+
int base) {
|
|
1117
|
+
return safe_int_internal<int8_t>(text, value, base);
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
bool safe_strto16_base(absl::string_view text, int16_t* absl_nonnull value,
|
|
1121
|
+
int base) {
|
|
1122
|
+
return safe_int_internal<int16_t>(text, value, base);
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
bool safe_strto32_base(absl::string_view text, int32_t* absl_nonnull value,
|
|
1115
1126
|
int base) {
|
|
1116
1127
|
return safe_int_internal<int32_t>(text, value, base);
|
|
1117
1128
|
}
|
|
1118
1129
|
|
|
1119
|
-
bool safe_strto64_base(absl::string_view text,
|
|
1130
|
+
bool safe_strto64_base(absl::string_view text, int64_t* absl_nonnull value,
|
|
1120
1131
|
int base) {
|
|
1121
1132
|
return safe_int_internal<int64_t>(text, value, base);
|
|
1122
1133
|
}
|
|
1123
1134
|
|
|
1124
|
-
bool safe_strto128_base(absl::string_view text,
|
|
1135
|
+
bool safe_strto128_base(absl::string_view text, int128* absl_nonnull value,
|
|
1125
1136
|
int base) {
|
|
1126
1137
|
return safe_int_internal<absl::int128>(text, value, base);
|
|
1127
1138
|
}
|
|
1128
1139
|
|
|
1129
|
-
bool
|
|
1140
|
+
bool safe_strtou8_base(absl::string_view text, uint8_t* absl_nonnull value,
|
|
1141
|
+
int base) {
|
|
1142
|
+
return safe_uint_internal<uint8_t>(text, value, base);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
bool safe_strtou16_base(absl::string_view text, uint16_t* absl_nonnull value,
|
|
1146
|
+
int base) {
|
|
1147
|
+
return safe_uint_internal<uint16_t>(text, value, base);
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
bool safe_strtou32_base(absl::string_view text, uint32_t* absl_nonnull value,
|
|
1130
1151
|
int base) {
|
|
1131
1152
|
return safe_uint_internal<uint32_t>(text, value, base);
|
|
1132
1153
|
}
|
|
1133
1154
|
|
|
1134
|
-
bool safe_strtou64_base(absl::string_view text,
|
|
1155
|
+
bool safe_strtou64_base(absl::string_view text, uint64_t* absl_nonnull value,
|
|
1135
1156
|
int base) {
|
|
1136
1157
|
return safe_uint_internal<uint64_t>(text, value, base);
|
|
1137
1158
|
}
|
|
1138
1159
|
|
|
1139
|
-
bool safe_strtou128_base(absl::string_view text,
|
|
1160
|
+
bool safe_strtou128_base(absl::string_view text, uint128* absl_nonnull value,
|
|
1140
1161
|
int base) {
|
|
1141
1162
|
return safe_uint_internal<absl::uint128>(text, value, base);
|
|
1142
1163
|
}
|