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.
Files changed (280) hide show
  1. package/README.md +2 -0
  2. package/binding.gyp +3 -2
  3. package/package.json +5 -5
  4. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +25 -4
  5. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +6 -1
  6. package/vendor/abseil-cpp/CMakeLists.txt +2 -2
  7. package/vendor/abseil-cpp/MODULE.bazel +2 -2
  8. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +0 -1
  9. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +0 -2
  10. package/vendor/abseil-cpp/absl/algorithm/container.h +191 -140
  11. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +818 -0
  12. package/vendor/abseil-cpp/absl/base/BUILD.bazel +44 -5
  13. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +42 -3
  14. package/vendor/abseil-cpp/absl/base/attributes.h +5 -1
  15. package/vendor/abseil-cpp/absl/base/call_once_test.cc +10 -10
  16. package/vendor/abseil-cpp/absl/base/casts.cc +61 -0
  17. package/vendor/abseil-cpp/absl/base/casts.h +128 -2
  18. package/vendor/abseil-cpp/absl/base/casts_test.cc +151 -0
  19. package/vendor/abseil-cpp/absl/base/config.h +13 -37
  20. package/vendor/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
  21. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +4 -0
  22. package/vendor/abseil-cpp/absl/base/internal/nullability_traits.h +71 -0
  23. package/vendor/abseil-cpp/absl/base/internal/nullability_traits_test.cc +98 -0
  24. package/vendor/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
  25. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +13 -7
  26. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +16 -11
  27. package/vendor/abseil-cpp/absl/base/internal/strerror_test.cc +2 -1
  28. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +0 -9
  29. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +0 -6
  30. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -1
  31. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
  32. package/vendor/abseil-cpp/absl/base/macros.h +40 -17
  33. package/vendor/abseil-cpp/absl/base/nullability.h +1 -1
  34. package/vendor/abseil-cpp/absl/base/optimization.h +1 -3
  35. package/vendor/abseil-cpp/absl/base/options.h +1 -27
  36. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +5 -8
  37. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +4 -0
  38. package/vendor/abseil-cpp/absl/container/BUILD.bazel +195 -2
  39. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +136 -2
  40. package/vendor/abseil-cpp/absl/container/btree_map.h +56 -6
  41. package/vendor/abseil-cpp/absl/container/btree_set.h +52 -6
  42. package/vendor/abseil-cpp/absl/container/btree_test.cc +107 -1
  43. package/vendor/abseil-cpp/absl/container/chunked_queue.h +755 -0
  44. package/vendor/abseil-cpp/absl/container/chunked_queue_benchmark.cc +386 -0
  45. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +768 -0
  46. package/vendor/abseil-cpp/absl/container/fixed_array.h +4 -6
  47. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +16 -6
  48. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +1 -2
  49. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +16 -6
  50. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +0 -2
  51. package/vendor/abseil-cpp/absl/container/inlined_vector.h +12 -4
  52. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +21 -0
  53. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +14 -5
  54. package/vendor/abseil-cpp/absl/container/internal/chunked_queue.h +173 -0
  55. package/vendor/abseil-cpp/absl/container/internal/common.h +51 -0
  56. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +7 -1
  57. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +11 -0
  58. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +0 -2
  59. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +1 -2
  60. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +0 -14
  61. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +11 -8
  62. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +3 -4
  63. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +23 -6
  64. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +31 -15
  65. package/vendor/abseil-cpp/absl/container/internal/heterogeneous_lookup_testing.h +80 -0
  66. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +4 -12
  67. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -10
  68. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +149 -23
  69. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +120 -126
  70. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +4 -0
  71. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +8 -0
  72. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +14 -59
  73. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +111 -22
  74. package/vendor/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +53 -112
  75. package/vendor/abseil-cpp/absl/container/internal/unordered_map_lookup_test.h +10 -15
  76. package/vendor/abseil-cpp/absl/container/internal/unordered_map_members_test.h +3 -3
  77. package/vendor/abseil-cpp/absl/container/internal/unordered_map_modifiers_test.h +45 -61
  78. package/vendor/abseil-cpp/absl/container/internal/unordered_set_constructor_test.h +53 -112
  79. package/vendor/abseil-cpp/absl/container/internal/unordered_set_lookup_test.h +6 -9
  80. package/vendor/abseil-cpp/absl/container/internal/unordered_set_members_test.h +3 -3
  81. package/vendor/abseil-cpp/absl/container/internal/unordered_set_modifiers_test.h +25 -31
  82. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +666 -0
  83. package/vendor/abseil-cpp/absl/container/linked_hash_map_benchmark.cc +140 -0
  84. package/vendor/abseil-cpp/absl/container/linked_hash_map_test.cc +987 -0
  85. package/vendor/abseil-cpp/absl/container/linked_hash_set.h +527 -0
  86. package/vendor/abseil-cpp/absl/container/linked_hash_set_benchmark.cc +84 -0
  87. package/vendor/abseil-cpp/absl/container/linked_hash_set_test.cc +947 -0
  88. package/vendor/abseil-cpp/absl/container/node_hash_map.h +17 -6
  89. package/vendor/abseil-cpp/absl/container/node_hash_set.h +16 -5
  90. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +1 -2
  91. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +79 -0
  92. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +79 -0
  93. package/vendor/abseil-cpp/absl/copts/copts.py +17 -4
  94. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +67 -13
  95. package/vendor/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
  96. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +31 -0
  97. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +34 -0
  98. package/vendor/abseil-cpp/absl/debugging/failure_signal_handler.cc +2 -2
  99. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +118 -0
  100. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +71 -0
  101. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +97 -0
  102. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
  103. package/vendor/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
  104. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +4 -0
  105. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -0
  106. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +1 -1
  107. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +0 -7
  108. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
  109. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +2 -1
  110. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  111. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +2 -2
  112. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +35 -67
  113. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +3 -0
  114. package/vendor/abseil-cpp/absl/debugging/stacktrace_benchmark.cc +24 -1
  115. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +39 -15
  116. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
  117. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +25 -40
  118. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
  119. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +1 -0
  120. package/vendor/abseil-cpp/absl/flags/declare.h +9 -0
  121. package/vendor/abseil-cpp/absl/flags/flag.h +2 -1
  122. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
  123. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +3 -2
  124. package/vendor/abseil-cpp/absl/flags/marshalling.cc +1 -16
  125. package/vendor/abseil-cpp/absl/flags/parse.cc +4 -2
  126. package/vendor/abseil-cpp/absl/flags/parse_test.cc +1 -1
  127. package/vendor/abseil-cpp/absl/flags/reflection.cc +4 -3
  128. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +4 -0
  129. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +4 -0
  130. package/vendor/abseil-cpp/absl/functional/any_invocable.h +3 -1
  131. package/vendor/abseil-cpp/absl/functional/function_ref.h +125 -20
  132. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +122 -9
  133. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +13 -2
  134. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +42 -4
  135. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +11 -0
  136. package/vendor/abseil-cpp/absl/hash/hash_test.cc +5 -2
  137. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +184 -53
  138. package/vendor/abseil-cpp/absl/hash/internal/hash.h +116 -10
  139. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +43 -4
  140. package/vendor/abseil-cpp/absl/log/BUILD.bazel +2 -0
  141. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +35 -1
  142. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +59 -4
  143. package/vendor/abseil-cpp/absl/log/die_if_null.cc +3 -1
  144. package/vendor/abseil-cpp/absl/log/die_if_null.h +24 -3
  145. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +31 -1
  146. package/vendor/abseil-cpp/absl/log/internal/check_impl.h +2 -1
  147. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +3 -1
  148. package/vendor/abseil-cpp/absl/log/internal/check_op.h +44 -18
  149. package/vendor/abseil-cpp/absl/log/internal/conditions.h +38 -35
  150. package/vendor/abseil-cpp/absl/log/internal/container.h +312 -0
  151. package/vendor/abseil-cpp/absl/log/internal/container_test.cc +254 -0
  152. package/vendor/abseil-cpp/absl/log/internal/log_impl.h +108 -110
  153. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -2
  154. package/vendor/abseil-cpp/absl/log/internal/log_message.h +5 -1
  155. package/vendor/abseil-cpp/absl/log/internal/strip.h +30 -31
  156. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +19 -19
  157. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
  158. package/vendor/abseil-cpp/absl/log/log.h +2 -2
  159. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +51 -0
  160. package/vendor/abseil-cpp/absl/meta/CMakeLists.txt +46 -0
  161. package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing.h +73 -0
  162. package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing_test.cc +40 -0
  163. package/vendor/abseil-cpp/absl/meta/internal/requires.h +67 -0
  164. package/vendor/abseil-cpp/absl/meta/internal/requires_test.cc +66 -0
  165. package/vendor/abseil-cpp/absl/meta/type_traits.h +42 -1
  166. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +14 -0
  167. package/vendor/abseil-cpp/absl/numeric/int128.h +41 -21
  168. package/vendor/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
  169. package/vendor/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
  170. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +52 -5
  171. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +1 -0
  172. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +1 -0
  173. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +18 -7
  174. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +1 -0
  175. package/vendor/abseil-cpp/absl/random/internal/fastmath_test.cc +3 -5
  176. package/vendor/abseil-cpp/absl/random/internal/platform.h +0 -13
  177. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +0 -1
  178. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +1 -27
  179. package/vendor/abseil-cpp/absl/status/BUILD.bazel +17 -0
  180. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +16 -0
  181. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +4 -2
  182. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +2 -2
  183. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +2 -1
  184. package/vendor/abseil-cpp/absl/status/status.cc +4 -0
  185. package/vendor/abseil-cpp/absl/status/status.h +5 -0
  186. package/vendor/abseil-cpp/absl/status/status_matchers.h +48 -0
  187. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +27 -0
  188. package/vendor/abseil-cpp/absl/status/status_test.cc +1 -0
  189. package/vendor/abseil-cpp/absl/status/statusor.h +1 -1
  190. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +101 -21
  191. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +99 -5
  192. package/vendor/abseil-cpp/absl/strings/ascii.h +9 -4
  193. package/vendor/abseil-cpp/absl/strings/cord.cc +15 -10
  194. package/vendor/abseil-cpp/absl/strings/cord.h +1 -1
  195. package/vendor/abseil-cpp/absl/strings/escaping.cc +126 -94
  196. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
  197. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite_test.cc +95 -0
  198. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +2 -0
  199. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc +8 -8
  200. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +24 -18
  201. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +10 -16
  202. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +9 -7
  203. package/vendor/abseil-cpp/absl/strings/internal/generic_printer.cc +107 -0
  204. package/vendor/abseil-cpp/absl/strings/internal/generic_printer.h +115 -0
  205. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +423 -0
  206. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +685 -0
  207. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +0 -12
  208. package/vendor/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
  209. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +21 -7
  210. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +495 -8
  211. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -15
  212. package/vendor/abseil-cpp/absl/strings/numbers.cc +71 -8
  213. package/vendor/abseil-cpp/absl/strings/numbers.h +25 -12
  214. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +70 -0
  215. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +194 -0
  216. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite_test.cc +154 -0
  217. package/vendor/abseil-cpp/absl/strings/str_cat.cc +96 -91
  218. package/vendor/abseil-cpp/absl/strings/str_cat.h +17 -12
  219. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +4 -4
  220. package/vendor/abseil-cpp/absl/strings/str_split.h +1 -1
  221. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +1 -1
  222. package/vendor/abseil-cpp/absl/strings/string_view.h +8 -718
  223. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +1 -1265
  224. package/vendor/abseil-cpp/absl/strings/substitute.cc +24 -24
  225. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +2 -3
  226. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +1 -0
  227. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
  228. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +15 -5
  229. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +2 -1
  230. package/vendor/abseil-cpp/absl/synchronization/mutex.h +47 -23
  231. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  232. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +2 -0
  233. package/vendor/abseil-cpp/absl/time/civil_time_benchmark.cc +1 -2
  234. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +58 -103
  235. package/vendor/abseil-cpp/absl/time/clock.cc +18 -16
  236. package/vendor/abseil-cpp/absl/time/clock_test.cc +2 -2
  237. package/vendor/abseil-cpp/absl/time/duration_benchmark.cc +144 -0
  238. package/vendor/abseil-cpp/absl/time/duration_test.cc +26 -29
  239. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +7 -1
  240. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +4 -2
  241. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
  242. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +186 -0
  243. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
  244. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  245. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +0 -0
  246. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +0 -0
  247. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +0 -0
  248. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +0 -0
  249. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab +9 -9
  250. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +12 -12
  251. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +47 -47
  252. package/vendor/abseil-cpp/absl/time/time.cc +4 -4
  253. package/vendor/abseil-cpp/absl/time/time.h +10 -10
  254. package/vendor/abseil-cpp/absl/time/time_test.cc +1 -0
  255. package/vendor/abseil-cpp/absl/types/compare.h +62 -61
  256. package/vendor/abseil-cpp/absl/types/compare_test.cc +3 -3
  257. package/vendor/abseil-cpp/absl/types/internal/span.h +1 -0
  258. package/vendor/abseil-cpp/absl/types/optional.h +2 -2
  259. package/vendor/abseil-cpp/absl/types/span.h +10 -2
  260. package/vendor/abseil-cpp/absl/utility/utility.h +13 -0
  261. package/vendor/abseil-cpp/ci/absl_alternate_options.h +0 -1
  262. package/vendor/abseil-cpp/ci/cmake_common.sh +1 -1
  263. package/vendor/abseil-cpp/ci/cmake_install_test.sh +6 -0
  264. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +1 -0
  265. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +2 -0
  266. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +1 -0
  267. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +1 -0
  268. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +1 -0
  269. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +1 -0
  270. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +1 -0
  271. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +6 -0
  272. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +6 -0
  273. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +3 -2
  274. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +5 -0
  275. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -0
  276. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -0
  277. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +6 -1
  278. package/vendor/abseil-cpp/absl/base/internal/identity.h +0 -39
  279. package/vendor/abseil-cpp/absl/strings/string_view.cc +0 -257
  280. 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`, and returns
80
- // true. Otherwise returns false and optionally stores the error
81
- // description in `error`. Set `error` to nullptr to disable error
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
- std::string* absl_nonnull dst,
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
- std::string::size_type d = 0; // Current dst position.
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->data()) {
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
- (*dst)[d++] = src[p++];
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
- case 'a': (*dst)[d++] = '\a'; break;
112
- case 'b': (*dst)[d++] = '\b'; break;
113
- case 'f': (*dst)[d++] = '\f'; break;
114
- case 'n': (*dst)[d++] = '\n'; break;
115
- case 'r': (*dst)[d++] = '\r'; break;
116
- case 't': (*dst)[d++] = '\t'; break;
117
- case 'v': (*dst)[d++] = '\v'; break;
118
- case '\\': (*dst)[d++] = '\\'; break;
119
- case '?': (*dst)[d++] = '\?'; break;
120
- case '\'': (*dst)[d++] = '\''; break;
121
- case '"': (*dst)[d++] = '\"'; break;
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
- (*dst)[d++] = '\\';
153
+ dst[d++] = '\\';
149
154
  while (octal_start <= p) {
150
- (*dst)[d++] = src[octal_start++];
155
+ dst[d++] = src[octal_start++];
151
156
  }
152
157
  break;
153
158
  }
154
- (*dst)[d++] = static_cast<char>(ch);
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
- (*dst)[d++] = '\\';
193
+ dst[d++] = '\\';
189
194
  while (hex_start <= p) {
190
- (*dst)[d++] = src[hex_start++];
195
+ dst[d++] = src[hex_start++];
191
196
  }
192
197
  break;
193
198
  }
194
- (*dst)[d++] = static_cast<char>(ch);
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
- (*dst)[d++] = '\\';
226
+ dst[d++] = '\\';
222
227
  while (hex_start <= p) {
223
- (*dst)[d++] = src[hex_start++];
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->data() + d, rune);
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
- (*dst)[d++] = '\\';
275
+ dst[d++] = '\\';
271
276
  // U00000000
272
277
  while (hex_start <= p) {
273
- (*dst)[d++] = src[hex_start++];
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->data() + d, rune);
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
- dst->erase(d);
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 slop_bytes = 3;
449
+ constexpr size_t kSlopBytes = 3;
445
450
  size_t cur_dest_len = dest->size();
446
- size_t new_dest_len = cur_dest_len + escaped_len + slop_bytes;
447
- ABSL_INTERNAL_CHECK(new_dest_len > cur_dest_len, "std::string size overflow");
448
- strings_internal::AppendUninitializedTraits<std::string>::Append(
449
- dest, escaped_len + slop_bytes);
450
- char* append_ptr = &(*dest)[cur_dest_len];
451
-
452
- for (char c : src) {
453
- unsigned char uc = static_cast<unsigned char>(c);
454
- size_t char_len = kCEscapedLen[uc];
455
- uint32_t little_endian_uint32 = kCEscapedLittleEndianUint32Array[uc];
456
- little_endian::Store32(append_ptr, little_endian_uint32);
457
- append_ptr += char_len;
458
- }
459
- dest->resize(new_dest_len - slop_bytes);
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
- strings_internal::STLStringResizeUninitialized(dest, dest_len);
811
-
812
- // We are getting the destination buffer by getting the beginning of the
813
- // string and converting it into a char *.
814
- size_t len;
815
- const bool ok =
816
- Base64UnescapeInternal(src, slen, &(*dest)[0], dest_len, unbase64, &len);
817
- if (!ok) {
818
- dest->clear();
819
- return false;
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
- // This is a templated function so that T can be either a char* or a
882
- // std::string.
883
- template <typename T>
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, dest_ptr);
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
- return CUnescapeInternal(source, kUnescapeNulls, dest, error);
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
- absl::strings_internal::STLStringResizeUninitialized(&output, num_bytes);
970
- auto hex_p = hex.cbegin();
971
- for (std::string::iterator bin_p = output.begin(); bin_p != output.end();
972
- ++bin_p) {
973
- int h1 = absl::kHexValueStrict[static_cast<size_t>(*hex_p++)];
974
- int h2 = absl::kHexValueStrict[static_cast<size_t>(*hex_p++)];
975
- if (h1 == -1 || h2 == -1) {
976
- output.resize(static_cast<size_t>(bin_p - output.begin()));
977
- return false;
978
- }
979
- *bin_p = static_cast<char>((h1 << 4) + h2);
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
- strings_internal::STLStringResizeUninitialized(&result, num);
990
- absl::HexStringToBytesInternal<std::string&>(from.data(), result, num);
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
- strings_internal::STLStringResizeUninitialized(&result, 2 * from.size());
997
- absl::BytesToHexStringInternal<std::string&>(
998
- reinterpret_cast<const unsigned char*>(from.data()), result, from.size());
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((HasSubstr("data = \"Hello world\""),
1234
- HasSubstr("data = \"Hello external\""),
1235
- HasSubstr("data = \"ello w\""),
1236
- HasSubstr("data = \"llo ext\"")))));
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((HasSubstr("data = \"Hello world\""),
1240
- HasSubstr("data = \"Hello external\""),
1241
- HasSubstr("data = \"ello w\""),
1242
- HasSubstr("data = \"llo ext\""))));
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