re2 1.24.0 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/LICENSE +15 -20
  2. package/README.md +63 -4
  3. package/binding.gyp +1 -2
  4. package/lib/addon.cc +9 -5
  5. package/lib/exec.cc +4 -4
  6. package/lib/match.cc +4 -4
  7. package/lib/new.cc +6 -6
  8. package/lib/pattern.cc +148 -1
  9. package/lib/replace.cc +5 -4
  10. package/lib/search.cc +1 -1
  11. package/lib/set.cc +85 -10
  12. package/lib/test.cc +1 -1
  13. package/lib/unicode_properties.h +15840 -0
  14. package/lib/wrapped_re2.h +40 -4
  15. package/lib/wrapped_re2_set.h +3 -1
  16. package/llms-full.txt +497 -0
  17. package/llms.txt +135 -0
  18. package/package.json +19 -11
  19. package/re2.d.ts +2 -0
  20. package/re2.js +1 -0
  21. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +87 -74
  22. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  23. package/vendor/abseil-cpp/FAQ.md +130 -79
  24. package/vendor/abseil-cpp/MODULE.bazel +6 -7
  25. package/vendor/abseil-cpp/absl/BUILD.bazel +6 -0
  26. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +4 -0
  27. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +4 -0
  28. package/vendor/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  29. package/vendor/abseil-cpp/absl/algorithm/container.h +164 -17
  30. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +390 -13
  31. package/vendor/abseil-cpp/absl/base/BUILD.bazel +53 -6
  32. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +28 -4
  33. package/vendor/abseil-cpp/absl/base/attributes.h +61 -42
  34. package/vendor/abseil-cpp/absl/base/call_once.h +1 -0
  35. package/vendor/abseil-cpp/absl/base/casts.h +8 -1
  36. package/vendor/abseil-cpp/absl/base/casts_test.cc +3 -6
  37. package/vendor/abseil-cpp/absl/base/config.h +53 -9
  38. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +9 -9
  39. package/vendor/abseil-cpp/absl/base/fast_type_id.h +30 -2
  40. package/vendor/abseil-cpp/absl/base/fast_type_id_test.cc +3 -0
  41. package/vendor/abseil-cpp/absl/base/internal/exception_safety_testing.h +15 -12
  42. package/vendor/abseil-cpp/absl/base/internal/hardening.h +136 -0
  43. package/vendor/abseil-cpp/absl/base/internal/hardening_test.cc +168 -0
  44. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +2 -2
  45. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -0
  46. package/vendor/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  47. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +1 -2
  48. package/vendor/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  49. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  50. package/vendor/abseil-cpp/absl/base/macros.h +36 -20
  51. package/vendor/abseil-cpp/absl/base/nullability.h +4 -3
  52. package/vendor/abseil-cpp/absl/base/optimization.h +3 -2
  53. package/vendor/abseil-cpp/absl/base/optimization_test.cc +4 -3
  54. package/vendor/abseil-cpp/absl/base/options.h +55 -1
  55. package/vendor/abseil-cpp/absl/base/policy_checks.h +5 -5
  56. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  57. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  58. package/vendor/abseil-cpp/absl/base/throw_delegate_test.cc +19 -28
  59. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -0
  60. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +2 -0
  61. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +3 -2
  62. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  63. package/vendor/abseil-cpp/absl/container/BUILD.bazel +19 -7
  64. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +6 -5
  65. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +3 -5
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +5 -5
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +11 -14
  68. package/vendor/abseil-cpp/absl/container/chunked_queue.h +8 -6
  69. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +5 -5
  70. package/vendor/abseil-cpp/absl/container/fixed_array.h +14 -13
  71. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +3 -3
  72. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +18 -6
  73. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +34 -1
  74. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +21 -7
  75. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +39 -7
  76. package/vendor/abseil-cpp/absl/container/inlined_vector.h +29 -29
  77. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +2 -2
  78. package/vendor/abseil-cpp/absl/container/internal/btree.h +32 -24
  79. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +16 -17
  80. package/vendor/abseil-cpp/absl/container/internal/common.h +6 -5
  81. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  82. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +16 -16
  83. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +13 -13
  84. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +41 -31
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +2 -2
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +4 -4
  87. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +3 -3
  88. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +27 -19
  89. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -2
  90. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +0 -17
  91. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +12 -30
  92. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +28 -28
  93. package/vendor/abseil-cpp/absl/container/internal/layout.h +13 -13
  94. package/vendor/abseil-cpp/absl/container/internal/layout_test.cc +3 -2
  95. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +60 -62
  96. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +59 -39
  97. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +619 -326
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +25 -2
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +4 -4
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +575 -159
  101. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +2 -2
  102. package/vendor/abseil-cpp/absl/container/node_hash_map.h +27 -15
  103. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +34 -0
  104. package/vendor/abseil-cpp/absl/container/node_hash_set.h +25 -11
  105. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +39 -7
  106. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +7 -4
  107. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +0 -1
  108. package/vendor/abseil-cpp/absl/crc/CMakeLists.txt +2 -3
  109. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +2 -1
  110. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +6 -6
  111. package/vendor/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  112. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  113. package/vendor/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  114. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +143 -81
  115. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +9 -31
  116. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +3 -33
  117. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  118. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +2 -1
  119. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +12 -2
  120. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +2 -3
  121. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -0
  122. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -4
  123. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  124. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +4 -0
  125. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +46 -36
  126. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +18 -58
  127. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +5 -48
  128. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +10 -124
  129. package/vendor/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  130. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +58 -106
  131. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +37 -36
  132. package/vendor/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  133. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -3
  134. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +1 -1
  135. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  136. package/vendor/abseil-cpp/absl/flags/commandlineflag_test.cc +1 -1
  137. package/vendor/abseil-cpp/absl/flags/flag_benchmark.cc +5 -5
  138. package/vendor/abseil-cpp/absl/flags/flag_test.cc +30 -30
  139. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +4 -4
  140. package/vendor/abseil-cpp/absl/flags/internal/flag.h +6 -6
  141. package/vendor/abseil-cpp/absl/flags/marshalling.h +2 -28
  142. package/vendor/abseil-cpp/absl/flags/marshalling_test.cc +12 -11
  143. package/vendor/abseil-cpp/absl/flags/reflection_test.cc +1 -1
  144. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +26 -1
  145. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +29 -1
  146. package/vendor/abseil-cpp/absl/functional/any_invocable.h +13 -14
  147. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +46 -47
  148. package/vendor/abseil-cpp/absl/functional/bind_back.h +79 -0
  149. package/vendor/abseil-cpp/absl/functional/bind_back_test.cc +237 -0
  150. package/vendor/abseil-cpp/absl/functional/bind_front.h +7 -1
  151. package/vendor/abseil-cpp/absl/functional/bind_front_test.cc +4 -4
  152. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +2 -2
  153. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +28 -28
  154. package/vendor/abseil-cpp/absl/functional/internal/back_binder.h +95 -0
  155. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  156. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  157. package/vendor/abseil-cpp/absl/functional/overload_test.cc +13 -13
  158. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +1 -2
  159. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +1 -2
  160. package/vendor/abseil-cpp/absl/hash/hash.h +1 -1
  161. package/vendor/abseil-cpp/absl/hash/hash_test.cc +14 -20
  162. package/vendor/abseil-cpp/absl/hash/hash_testing.h +11 -9
  163. package/vendor/abseil-cpp/absl/hash/internal/city.cc +39 -51
  164. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +165 -47
  165. package/vendor/abseil-cpp/absl/hash/internal/hash.h +86 -27
  166. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +36 -1
  167. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +8 -5
  168. package/vendor/abseil-cpp/absl/log/BUILD.bazel +5 -2
  169. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +5 -3
  170. package/vendor/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  171. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +15 -1
  172. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -4
  173. package/vendor/abseil-cpp/absl/log/internal/log_message.h +14 -0
  174. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  175. package/vendor/abseil-cpp/absl/log/internal/proto.cc +13 -0
  176. package/vendor/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  177. package/vendor/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  178. package/vendor/abseil-cpp/absl/log/internal/structured_proto_test.cc +3 -3
  179. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +2 -2
  180. package/vendor/abseil-cpp/absl/log/internal/vlog_config_benchmark.cc +3 -3
  181. package/vendor/abseil-cpp/absl/log/log_format_test.cc +19 -2
  182. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +18 -0
  183. package/vendor/abseil-cpp/absl/log/log_streamer.h +29 -2
  184. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +18 -0
  185. package/vendor/abseil-cpp/absl/log/scoped_mock_log_test.cc +1 -1
  186. package/vendor/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  187. package/vendor/abseil-cpp/absl/log/vlog_is_on_test.cc +6 -5
  188. package/vendor/abseil-cpp/absl/memory/memory.h +55 -5
  189. package/vendor/abseil-cpp/absl/memory/memory_test.cc +55 -1
  190. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  191. package/vendor/abseil-cpp/absl/meta/internal/requires.h +1 -1
  192. package/vendor/abseil-cpp/absl/meta/type_traits.h +119 -55
  193. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +7 -7
  194. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +6 -6
  195. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +3 -1
  196. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +0 -4
  197. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +32 -33
  198. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +25 -2
  199. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +8 -5
  200. package/vendor/abseil-cpp/absl/random/BUILD.bazel +13 -1
  201. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +23 -2
  202. package/vendor/abseil-cpp/absl/random/benchmarks.cc +1 -1
  203. package/vendor/abseil-cpp/absl/random/beta_distribution.h +2 -2
  204. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  205. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +43 -0
  206. package/vendor/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  207. package/vendor/abseil-cpp/absl/random/distributions.h +17 -17
  208. package/vendor/abseil-cpp/absl/random/distributions_test.cc +4 -4
  209. package/vendor/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  210. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +4 -2
  211. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  212. package/vendor/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  213. package/vendor/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  214. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  215. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc +3 -2
  216. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +14 -40
  217. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  218. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +2 -2
  219. package/vendor/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  220. package/vendor/abseil-cpp/absl/random/internal/pcg_engine_test.cc +3 -2
  221. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  222. package/vendor/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  223. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +3 -2
  224. package/vendor/abseil-cpp/absl/random/internal/randen_test.cc +3 -2
  225. package/vendor/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  226. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +4 -4
  227. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  228. package/vendor/abseil-cpp/absl/random/internal/traits.h +21 -0
  229. package/vendor/abseil-cpp/absl/random/internal/traits_test.cc +5 -0
  230. package/vendor/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  231. package/vendor/abseil-cpp/absl/random/internal/uniform_helper_test.cc +2 -1
  232. package/vendor/abseil-cpp/absl/random/mocking_access.h +74 -0
  233. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +9 -19
  234. package/vendor/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  235. package/vendor/abseil-cpp/absl/status/BUILD.bazel +81 -0
  236. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +91 -0
  237. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  238. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +26 -2
  239. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +22 -8
  240. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +43 -43
  241. package/vendor/abseil-cpp/absl/status/status.cc +62 -70
  242. package/vendor/abseil-cpp/absl/status/status.h +249 -23
  243. package/vendor/abseil-cpp/absl/status/status_benchmark.cc +12 -0
  244. package/vendor/abseil-cpp/absl/status/status_builder.cc +196 -0
  245. package/vendor/abseil-cpp/absl/status/status_builder.h +978 -0
  246. package/vendor/abseil-cpp/absl/status/status_builder_test.cc +380 -0
  247. package/vendor/abseil-cpp/absl/status/status_macros.h +484 -0
  248. package/vendor/abseil-cpp/absl/status/status_macros_test.cc +634 -0
  249. package/vendor/abseil-cpp/absl/status/status_matchers.h +2 -1
  250. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +3 -4
  251. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  252. package/vendor/abseil-cpp/absl/status/status_test.cc +443 -13
  253. package/vendor/abseil-cpp/absl/status/statusor.h +69 -36
  254. package/vendor/abseil-cpp/absl/status/statusor_test.cc +132 -35
  255. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +42 -7
  256. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +33 -4
  257. package/vendor/abseil-cpp/absl/strings/ascii.h +1 -2
  258. package/vendor/abseil-cpp/absl/strings/atod_manual_test.cc +5 -5
  259. package/vendor/abseil-cpp/absl/strings/cord.cc +26 -7
  260. package/vendor/abseil-cpp/absl/strings/cord.h +23 -13
  261. package/vendor/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  262. package/vendor/abseil-cpp/absl/strings/cord_test.cc +85 -9
  263. package/vendor/abseil-cpp/absl/strings/escaping.cc +183 -35
  264. package/vendor/abseil-cpp/absl/strings/escaping.h +12 -2
  265. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +1 -3
  266. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +22 -18
  267. package/vendor/abseil-cpp/absl/strings/has_absl_stringify_test.cc +2 -2
  268. package/vendor/abseil-cpp/absl/strings/has_ostream_operator_test.cc +2 -2
  269. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +10 -10
  270. package/vendor/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc +1 -1
  271. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  272. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  273. package/vendor/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  274. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +2 -26
  275. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +23 -2
  276. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +6 -2
  277. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -24
  278. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized_test.cc +16 -41
  279. package/vendor/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  280. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  281. package/vendor/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  282. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +12 -20
  283. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +510 -307
  284. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +0 -1
  285. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +9 -10
  286. package/vendor/abseil-cpp/absl/strings/internal/string_constant_test.cc +6 -5
  287. package/vendor/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  288. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream.h +119 -0
  289. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream_test.cc +111 -0
  290. package/vendor/abseil-cpp/absl/strings/numbers.cc +406 -0
  291. package/vendor/abseil-cpp/absl/strings/numbers.h +4 -0
  292. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +33 -0
  293. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +10 -6
  294. package/vendor/abseil-cpp/absl/strings/str_cat.h +36 -1
  295. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +1 -2
  296. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +28 -0
  297. package/vendor/abseil-cpp/absl/strings/str_join_test.cc +4 -4
  298. package/vendor/abseil-cpp/absl/strings/str_split.h +11 -6
  299. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +13 -0
  300. package/vendor/abseil-cpp/absl/strings/substitute.h +2 -2
  301. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +3 -0
  302. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +21 -0
  303. package/vendor/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  304. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +13 -0
  305. package/vendor/abseil-cpp/absl/synchronization/mutex.h +32 -2
  306. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +17 -3
  307. package/vendor/abseil-cpp/absl/time/BUILD.bazel +80 -0
  308. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +73 -0
  309. package/vendor/abseil-cpp/absl/time/clock.h +3 -0
  310. package/vendor/abseil-cpp/absl/time/clock_interface.cc +71 -0
  311. package/vendor/abseil-cpp/absl/time/clock_interface.h +93 -0
  312. package/vendor/abseil-cpp/absl/time/clock_interface_test.cc +128 -0
  313. package/vendor/abseil-cpp/absl/time/format.cc +3 -10
  314. package/vendor/abseil-cpp/absl/time/format_test.cc +12 -0
  315. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +90 -89
  316. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +80 -5
  317. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +1 -2
  318. package/vendor/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  319. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  320. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver +0 -0
  321. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
  322. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh +0 -0
  323. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon +0 -0
  324. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi +0 -0
  325. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane +0 -0
  326. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific +0 -0
  327. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau +0 -0
  328. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol +0 -0
  329. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +1 -1
  330. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +3 -3
  331. package/vendor/abseil-cpp/absl/time/simulated_clock.cc +225 -0
  332. package/vendor/abseil-cpp/absl/time/simulated_clock.h +109 -0
  333. package/vendor/abseil-cpp/absl/time/simulated_clock_test.cc +614 -0
  334. package/vendor/abseil-cpp/absl/types/BUILD.bazel +116 -0
  335. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +100 -0
  336. package/vendor/abseil-cpp/absl/types/any.h +26 -4
  337. package/vendor/abseil-cpp/absl/types/any_span.h +1067 -0
  338. package/vendor/abseil-cpp/absl/types/any_span_benchmark.cc +258 -0
  339. package/vendor/abseil-cpp/absl/types/any_span_test.cc +1210 -0
  340. package/vendor/abseil-cpp/absl/types/compare.h +4 -4
  341. package/vendor/abseil-cpp/absl/types/internal/any_span.h +477 -0
  342. package/vendor/abseil-cpp/absl/types/internal/span.h +5 -6
  343. package/vendor/abseil-cpp/absl/types/optional.h +30 -3
  344. package/vendor/abseil-cpp/absl/types/optional_ref.h +295 -0
  345. package/vendor/abseil-cpp/absl/types/optional_ref_test.cc +370 -0
  346. package/vendor/abseil-cpp/absl/types/source_location.cc +18 -0
  347. package/vendor/abseil-cpp/absl/types/source_location.h +172 -0
  348. package/vendor/abseil-cpp/absl/types/source_location_test.cc +139 -0
  349. package/vendor/abseil-cpp/absl/types/span.h +19 -23
  350. package/vendor/abseil-cpp/absl/types/variant.h +75 -18
  351. package/vendor/abseil-cpp/absl/types/variant_test.cc +23 -23
  352. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -0
  353. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +1 -0
  354. package/vendor/abseil-cpp/absl/utility/utility.h +99 -16
  355. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -0
  356. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +10 -4
  357. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +13 -6
  358. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +10 -4
  359. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +12 -5
  360. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +9 -2
  361. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  362. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +10 -3
  363. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +8 -2
  364. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +4 -3
  365. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +2 -2
  366. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -1
  367. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -1
  368. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +0 -118
  369. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +0 -71
  370. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +0 -97
@@ -17,6 +17,7 @@
17
17
 
18
18
  #include <cstdint>
19
19
 
20
+ #include "absl/base/config.h"
20
21
  #include "absl/strings/string_view.h"
21
22
 
22
23
  namespace absl {
@@ -23,16 +23,6 @@ namespace absl {
23
23
  ABSL_NAMESPACE_BEGIN
24
24
  namespace strings_internal {
25
25
 
26
- // The two strings below provide maps from normal 6-bit characters to their
27
- // base64-escaped equivalent.
28
- // For the inverse case, see kUn(WebSafe)Base64 in the external
29
- // escaping.cc.
30
- ABSL_CONST_INIT const char kBase64Chars[] =
31
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
32
-
33
- ABSL_CONST_INIT const char kWebSafeBase64Chars[] =
34
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
35
-
36
26
  size_t CalculateBase64EscapedLenInternal(size_t input_len, bool do_padding) {
37
27
  // Base64 encodes three bytes of input at a time. If the input is not
38
28
  // divisible by three, we pad as appropriate.
@@ -73,137 +63,6 @@ size_t CalculateBase64EscapedLenInternal(size_t input_len, bool do_padding) {
73
63
  return len;
74
64
  }
75
65
 
76
- // ----------------------------------------------------------------------
77
- // Take the input in groups of 4 characters and turn each
78
- // character into a code 0 to 63 thus:
79
- // A-Z map to 0 to 25
80
- // a-z map to 26 to 51
81
- // 0-9 map to 52 to 61
82
- // +(- for WebSafe) maps to 62
83
- // /(_ for WebSafe) maps to 63
84
- // There will be four numbers, all less than 64 which can be represented
85
- // by a 6 digit binary number (aaaaaa, bbbbbb, cccccc, dddddd respectively).
86
- // Arrange the 6 digit binary numbers into three bytes as such:
87
- // aaaaaabb bbbbcccc ccdddddd
88
- // Equals signs (one or two) are used at the end of the encoded block to
89
- // indicate that the text was not an integer multiple of three bytes long.
90
- // ----------------------------------------------------------------------
91
- size_t Base64EscapeInternal(const unsigned char* src, size_t szsrc, char* dest,
92
- size_t szdest, const char* base64,
93
- bool do_padding) {
94
- static const char kPad64 = '=';
95
-
96
- if (szsrc * 4 > szdest * 3) return 0;
97
-
98
- char* cur_dest = dest;
99
- const unsigned char* cur_src = src;
100
-
101
- char* const limit_dest = dest + szdest;
102
- const unsigned char* const limit_src = src + szsrc;
103
-
104
- // (from https://tools.ietf.org/html/rfc3548)
105
- // Special processing is performed if fewer than 24 bits are available
106
- // at the end of the data being encoded. A full encoding quantum is
107
- // always completed at the end of a quantity. When fewer than 24 input
108
- // bits are available in an input group, zero bits are added (on the
109
- // right) to form an integral number of 6-bit groups.
110
- //
111
- // If do_padding is true, padding at the end of the data is performed. This
112
- // output padding uses the '=' character.
113
-
114
- // Three bytes of data encodes to four characters of cyphertext.
115
- // So we can pump through three-byte chunks atomically.
116
- if (szsrc >= 3) { // "limit_src - 3" is UB if szsrc < 3.
117
- while (cur_src < limit_src - 3) { // While we have >= 32 bits.
118
- uint32_t in = absl::big_endian::Load32(cur_src) >> 8;
119
-
120
- cur_dest[0] = base64[in >> 18];
121
- in &= 0x3FFFF;
122
- cur_dest[1] = base64[in >> 12];
123
- in &= 0xFFF;
124
- cur_dest[2] = base64[in >> 6];
125
- in &= 0x3F;
126
- cur_dest[3] = base64[in];
127
-
128
- cur_dest += 4;
129
- cur_src += 3;
130
- }
131
- }
132
- // To save time, we didn't update szdest or szsrc in the loop. So do it now.
133
- szdest = static_cast<size_t>(limit_dest - cur_dest);
134
- szsrc = static_cast<size_t>(limit_src - cur_src);
135
-
136
- /* now deal with the tail (<=3 bytes) */
137
- switch (szsrc) {
138
- case 0:
139
- // Nothing left; nothing more to do.
140
- break;
141
- case 1: {
142
- // One byte left: this encodes to two characters, and (optionally)
143
- // two pad characters to round out the four-character cypherblock.
144
- if (szdest < 2) return 0;
145
- uint32_t in = cur_src[0];
146
- cur_dest[0] = base64[in >> 2];
147
- in &= 0x3;
148
- cur_dest[1] = base64[in << 4];
149
- cur_dest += 2;
150
- szdest -= 2;
151
- if (do_padding) {
152
- if (szdest < 2) return 0;
153
- cur_dest[0] = kPad64;
154
- cur_dest[1] = kPad64;
155
- cur_dest += 2;
156
- szdest -= 2;
157
- }
158
- break;
159
- }
160
- case 2: {
161
- // Two bytes left: this encodes to three characters, and (optionally)
162
- // one pad character to round out the four-character cypherblock.
163
- if (szdest < 3) return 0;
164
- uint32_t in = absl::big_endian::Load16(cur_src);
165
- cur_dest[0] = base64[in >> 10];
166
- in &= 0x3FF;
167
- cur_dest[1] = base64[in >> 4];
168
- in &= 0x00F;
169
- cur_dest[2] = base64[in << 2];
170
- cur_dest += 3;
171
- szdest -= 3;
172
- if (do_padding) {
173
- if (szdest < 1) return 0;
174
- cur_dest[0] = kPad64;
175
- cur_dest += 1;
176
- szdest -= 1;
177
- }
178
- break;
179
- }
180
- case 3: {
181
- // Three bytes left: same as in the big loop above. We can't do this in
182
- // the loop because the loop above always reads 4 bytes, and the fourth
183
- // byte is past the end of the input.
184
- if (szdest < 4) return 0;
185
- uint32_t in =
186
- (uint32_t{cur_src[0]} << 16) + absl::big_endian::Load16(cur_src + 1);
187
- cur_dest[0] = base64[in >> 18];
188
- in &= 0x3FFFF;
189
- cur_dest[1] = base64[in >> 12];
190
- in &= 0xFFF;
191
- cur_dest[2] = base64[in >> 6];
192
- in &= 0x3F;
193
- cur_dest[3] = base64[in];
194
- cur_dest += 4;
195
- szdest -= 4;
196
- break;
197
- }
198
- default:
199
- // Should not be reached: blocks of 4 bytes are handled
200
- // in the while loop before this switch statement.
201
- ABSL_RAW_LOG(FATAL, "Logic problem? szsrc = %zu", szsrc);
202
- break;
203
- }
204
- return static_cast<size_t>(cur_dest - dest);
205
- }
206
-
207
66
  } // namespace strings_internal
208
67
  ABSL_NAMESPACE_END
209
68
  } // namespace absl
@@ -15,43 +15,19 @@
15
15
  #ifndef ABSL_STRINGS_INTERNAL_ESCAPING_H_
16
16
  #define ABSL_STRINGS_INTERNAL_ESCAPING_H_
17
17
 
18
- #include <cassert>
18
+ #include <cstddef>
19
19
 
20
- #include "absl/strings/resize_and_overwrite.h"
20
+ #include "absl/base/config.h"
21
21
 
22
22
  namespace absl {
23
23
  ABSL_NAMESPACE_BEGIN
24
24
  namespace strings_internal {
25
25
 
26
- ABSL_CONST_INIT extern const char kBase64Chars[];
27
- ABSL_CONST_INIT extern const char kWebSafeBase64Chars[];
28
-
29
26
  // Calculates the length of a Base64 encoding (RFC 4648) of a string of length
30
27
  // `input_len`, with or without padding per `do_padding`. Note that 'web-safe'
31
28
  // encoding (section 5 of the RFC) does not change this length.
32
29
  size_t CalculateBase64EscapedLenInternal(size_t input_len, bool do_padding);
33
30
 
34
- // Base64-encodes `src` using the alphabet provided in `base64` (which
35
- // determines whether to do web-safe encoding or not) and writes the result to
36
- // `dest`. If `do_padding` is true, `dest` is padded with '=' chars until its
37
- // length is a multiple of 3. Returns the length of `dest`.
38
- size_t Base64EscapeInternal(const unsigned char* src, size_t szsrc, char* dest,
39
- size_t szdest, const char* base64, bool do_padding);
40
- template <typename String>
41
- void Base64EscapeInternal(const unsigned char* src, size_t szsrc, String* dest,
42
- bool do_padding, const char* base64_chars) {
43
- const size_t calc_escaped_size =
44
- CalculateBase64EscapedLenInternal(szsrc, do_padding);
45
- StringResizeAndOverwrite(
46
- *dest, calc_escaped_size,
47
- [src, szsrc, base64_chars, do_padding](char* buf, size_t buf_size) {
48
- const size_t escaped_len = Base64EscapeInternal(
49
- src, szsrc, buf, buf_size, base64_chars, do_padding);
50
- assert(escaped_len == buf_size);
51
- return escaped_len;
52
- });
53
- }
54
-
55
31
  } // namespace strings_internal
56
32
  ABSL_NAMESPACE_END
57
33
  } // namespace absl
@@ -112,6 +112,23 @@ inline constexpr bool is_supported_ptr<
112
112
  // would be a fork.
113
113
  decltype(T().~ArenaSafeUniquePtr())> = true;
114
114
 
115
+ // `proto2::Arena::UniquePtr` is at least as safe as `std::unique_ptr`.
116
+ template <class T>
117
+ inline constexpr bool is_supported_ptr<
118
+ T,
119
+ // Check for `proto2::Arena::UniquePtr` without having to include its
120
+ // header here. This does match any type named `UniquePtr`, regardless
121
+ // of the scope it is defined in, but we try to restrict by probing some
122
+ // methods.
123
+ std::void_t<decltype(
124
+ // Check the class name using the destructor.
125
+ T().~UniquePtr(),
126
+ // Check some other members, to try to duck type into the right class.
127
+ T().get(), T().reset(), T().try_heap_release(),
128
+ T().GetOwningArena()
129
+ ->template MakeUnique<int>(nullptr)
130
+ .~UniquePtr())>> = true;
131
+
115
132
  // Specialization for floats: print floating point types using their
116
133
  // max_digits10 precision. This ensures each distinct underlying values
117
134
  // can be represented uniquely, even though it's not (strictly speaking)
@@ -220,6 +237,8 @@ std::ostream& GenericPrintImpl(std::ostream& os, const T& v) {
220
237
  if constexpr (is_any_string<T> || std::is_same_v<T, absl::string_view>) {
221
238
  // Specialization for strings: prints with plausible quoting and escaping.
222
239
  return PrintEscapedString(os, v);
240
+ } else if constexpr (is_supported_ptr<T>) {
241
+ return (PrintSmartPointerContents)(os, v);
223
242
  } else if constexpr (absl::HasAbslStringify<T>::value) {
224
243
  // If someone has specified `AbslStringify`, we should prefer that.
225
244
  return os << absl::StrCat(v);
@@ -246,8 +265,6 @@ std::ostream& GenericPrintImpl(std::ostream& os, const T& v) {
246
265
  w)) {})) {
247
266
  // For std::variant, use `std::visit(v)`
248
267
  return (PrintVariant)(os, v);
249
- } else if constexpr (is_supported_ptr<T>) {
250
- return (PrintSmartPointerContents)(os, v);
251
268
  } else if constexpr (meta_internal::Requires<const T>(
252
269
  [&](auto&& w) -> decltype(w.ok(), w.status(), *w) {
253
270
  })) {
@@ -263,6 +280,10 @@ std::ostream& GenericPrintImpl(std::ostream& os, const T& v) {
263
280
  // Specialization for nullptr.
264
281
  return os << "nullptr";
265
282
 
283
+ } else if constexpr (std::is_same_v<T, std::monostate>) {
284
+ // Specialization for `std::monostate`.
285
+ return os << "monostate";
286
+
266
287
  } else if constexpr (std::is_floating_point_v<T>) {
267
288
  // For floating point print with enough precision for a roundtrip.
268
289
  return PrintPreciseFP(os, v);
@@ -373,6 +373,10 @@ TEST(GenericPrinterTest, Optional) {
373
373
  generic_logging_test::Streamable{3})));
374
374
  }
375
375
 
376
+ TEST(GenericPrinterTest, Monostate) {
377
+ EXPECT_EQ("monostate", GenericPrintToString(std::monostate{}));
378
+ }
379
+
376
380
  TEST(GenericPrinterTest, Tuple) {
377
381
  EXPECT_EQ("<1, two, 3>", GenericPrintToString(std::make_tuple(1, "two", 3)));
378
382
  }
@@ -396,8 +400,8 @@ TEST(GenericPrinterTest, Variant) {
396
400
  }
397
401
 
398
402
  TEST(GenericPrinterTest, VariantMonostate) {
399
- EXPECT_THAT(GenericPrintToString(std::variant<std::monostate, std::string>()),
400
- IsUnprintable());
403
+ EXPECT_EQ("('(index = 0)' monostate)",
404
+ GenericPrintToString(std::variant<std::monostate, std::string>()));
401
405
  }
402
406
 
403
407
  TEST(GenericPrinterTest, VariantNonStreamable) {
@@ -22,8 +22,9 @@
22
22
  #include <type_traits>
23
23
  #include <utility>
24
24
 
25
+ #include "absl/base/optimization.h"
25
26
  #include "absl/base/port.h"
26
- #include "absl/meta/type_traits.h" // for void_t
27
+ #include "absl/strings/resize_and_overwrite.h"
27
28
 
28
29
  namespace absl {
29
30
  ABSL_NAMESPACE_BEGIN
@@ -41,8 +42,8 @@ struct ResizeUninitializedTraits {
41
42
  // __resize_default_init is provided by libc++ >= 8.0
42
43
  template <typename string_type>
43
44
  struct ResizeUninitializedTraits<
44
- string_type, absl::void_t<decltype(std::declval<string_type&>()
45
- .__resize_default_init(237))> > {
45
+ string_type, std::void_t<decltype(std::declval<string_type&>()
46
+ .__resize_default_init(237))> > {
46
47
  using HasMember = std::true_type;
47
48
  static void Resize(string_type* s, size_t new_size) {
48
49
  s->__resize_default_init(new_size);
@@ -68,33 +69,39 @@ inline void STLStringResizeUninitialized(string_type* s, size_t new_size) {
68
69
  ResizeUninitializedTraits<string_type>::Resize(s, new_size);
69
70
  }
70
71
 
71
- // In this type trait, we look for an __append_default_init member function, and
72
- // we use it if available, otherwise, we use append.
73
- template <typename string_type, typename = void>
74
- struct AppendUninitializedTraits {
75
- static void Append(string_type* s, size_t n) {
76
- s->append(n, typename string_type::value_type());
77
- }
78
- };
79
-
80
- template <typename string_type>
81
- struct AppendUninitializedTraits<
82
- string_type, absl::void_t<decltype(std::declval<string_type&>()
83
- .__append_default_init(237))> > {
84
- static void Append(string_type* s, size_t n) {
85
- s->__append_default_init(n);
86
- }
87
- };
88
-
89
72
  // Like STLStringResizeUninitialized(str, new_size), except guaranteed to use
90
73
  // exponential growth so that the amortized complexity of increasing the string
91
74
  // size by a small amount is O(1), in contrast to O(str->size()) in the case of
92
75
  // precise growth.
76
+ //
77
+ // TODO: b/446221957 - Delete this function.
93
78
  template <typename string_type>
79
+ [[deprecated]]
94
80
  void STLStringResizeUninitializedAmortized(string_type* s, size_t new_size) {
95
- const size_t size = s->size();
96
- if (new_size > size) {
97
- AppendUninitializedTraits<string_type>::Append(s, new_size - size);
81
+ if (new_size > s->size()) {
82
+ if (new_size > s->capacity()) {
83
+ // Make sure to always grow by at least a factor of 2x. Change min_growth
84
+ // if you want to experiment with other growth strategies.
85
+ const auto min_growth = s->capacity();
86
+ if (ABSL_PREDICT_FALSE(s->capacity() > s->max_size() - min_growth)) {
87
+ s->reserve(s->max_size());
88
+ } else if (new_size < s->capacity() + min_growth) {
89
+ s->reserve(s->capacity() + min_growth);
90
+ }
91
+ }
92
+ // This calls absl::strings_internal::StringResizeAndOverwriteImpl() because
93
+ // the public API absl::StringResizeAndOverwrite() verifies that the
94
+ // required range has been initialized. No other code should be calling
95
+ // absl::strings_internal::StringResizeAndOverwriteImpl(). Instead it should
96
+ // be implemented correctly with absl::StringResizeAndOverwrite().
97
+ absl::strings_internal::StringResizeAndOverwriteImpl(
98
+ *s, new_size, [](typename string_type::value_type*, size_t buf_size) {
99
+ // TODO: b/446221957 - It is undefined behavior if any character in
100
+ // the range [0, return_value) is uninitialized, but we rely on this
101
+ // here to implement the old STLStringResizeUninitializedAmortized()
102
+ // API.
103
+ return buf_size;
104
+ });
98
105
  } else {
99
106
  s->erase(new_size);
100
107
  }
@@ -14,106 +14,81 @@
14
14
 
15
15
  #include "absl/strings/internal/resize_uninitialized.h"
16
16
 
17
+ #include <cstddef>
18
+ #include <limits>
19
+
17
20
  #include "gtest/gtest.h"
18
21
 
19
22
  namespace {
20
23
 
21
24
  int resize_call_count = 0;
22
- int append_call_count = 0;
23
25
 
24
26
  // A mock string class whose only purpose is to track how many times its
25
- // resize()/append() methods have been called.
27
+ // resize() method has been called.
26
28
  struct resizable_string {
27
29
  using value_type = char;
30
+ using size_type = size_t;
28
31
  size_t size() const { return 0; }
29
32
  size_t capacity() const { return 0; }
30
- char& operator[](size_t) {
31
- static char c = '\0';
32
- return c;
33
- }
33
+ char* data() { return buffer; }
34
+ char& operator[](size_t) { return buffer[0]; }
34
35
  void resize(size_t) { resize_call_count += 1; }
35
- void append(size_t, value_type) { append_call_count += 1; }
36
36
  void reserve(size_t) {}
37
37
  resizable_string& erase(size_t = 0, size_t = 0) { return *this; }
38
+ size_t max_size() const { return std::numeric_limits<size_t>::max(); }
39
+ char buffer[1] = {};
38
40
  };
39
41
 
40
42
  int resize_default_init_call_count = 0;
41
- int append_default_init_call_count = 0;
42
43
 
43
44
  // A mock string class whose only purpose is to track how many times its
44
- // resize()/__resize_default_init()/append()/__append_default_init() methods
45
- // have been called.
45
+ // resize()/__resize_default_init() methods have been called.
46
46
  struct default_init_string {
47
+ using value_type = char;
48
+ using size_type = size_t;
47
49
  size_t size() const { return 0; }
48
50
  size_t capacity() const { return 0; }
49
- char& operator[](size_t) {
50
- static char c = '\0';
51
- return c;
52
- }
51
+ char* data() { return buffer; }
52
+ char& operator[](size_t) { return buffer[0]; }
53
53
  void resize(size_t) { resize_call_count += 1; }
54
54
  void __resize_default_init(size_t) { resize_default_init_call_count += 1; }
55
- void __append_default_init(size_t) { append_default_init_call_count += 1; }
56
55
  void reserve(size_t) {}
57
56
  default_init_string& erase(size_t = 0, size_t = 0) { return *this; }
57
+ size_t max_size() const { return std::numeric_limits<size_t>::max(); }
58
+ char buffer[1];
58
59
  };
59
60
 
60
61
  TEST(ResizeUninit, WithAndWithout) {
61
62
  resize_call_count = 0;
62
- append_call_count = 0;
63
63
  resize_default_init_call_count = 0;
64
- append_default_init_call_count = 0;
65
64
  {
66
65
  resizable_string rs;
67
66
 
68
67
  EXPECT_EQ(resize_call_count, 0);
69
- EXPECT_EQ(append_call_count, 0);
70
68
  EXPECT_EQ(resize_default_init_call_count, 0);
71
- EXPECT_EQ(append_default_init_call_count, 0);
72
69
  EXPECT_FALSE(
73
70
  absl::strings_internal::STLStringSupportsNontrashingResize(&rs));
74
71
  EXPECT_EQ(resize_call_count, 0);
75
- EXPECT_EQ(append_call_count, 0);
76
72
  EXPECT_EQ(resize_default_init_call_count, 0);
77
- EXPECT_EQ(append_default_init_call_count, 0);
78
73
  absl::strings_internal::STLStringResizeUninitialized(&rs, 237);
79
74
  EXPECT_EQ(resize_call_count, 1);
80
- EXPECT_EQ(append_call_count, 0);
81
75
  EXPECT_EQ(resize_default_init_call_count, 0);
82
- EXPECT_EQ(append_default_init_call_count, 0);
83
- absl::strings_internal::STLStringResizeUninitializedAmortized(&rs, 1000);
84
- EXPECT_EQ(resize_call_count, 1);
85
- EXPECT_EQ(append_call_count, 1);
86
- EXPECT_EQ(resize_default_init_call_count, 0);
87
- EXPECT_EQ(append_default_init_call_count, 0);
88
76
  }
89
77
 
90
78
  resize_call_count = 0;
91
- append_call_count = 0;
92
79
  resize_default_init_call_count = 0;
93
- append_default_init_call_count = 0;
94
80
  {
95
81
  default_init_string rus;
96
82
 
97
83
  EXPECT_EQ(resize_call_count, 0);
98
- EXPECT_EQ(append_call_count, 0);
99
84
  EXPECT_EQ(resize_default_init_call_count, 0);
100
- EXPECT_EQ(append_default_init_call_count, 0);
101
85
  EXPECT_TRUE(
102
86
  absl::strings_internal::STLStringSupportsNontrashingResize(&rus));
103
87
  EXPECT_EQ(resize_call_count, 0);
104
- EXPECT_EQ(append_call_count, 0);
105
88
  EXPECT_EQ(resize_default_init_call_count, 0);
106
- EXPECT_EQ(append_default_init_call_count, 0);
107
89
  absl::strings_internal::STLStringResizeUninitialized(&rus, 237);
108
90
  EXPECT_EQ(resize_call_count, 0);
109
- EXPECT_EQ(append_call_count, 0);
110
- EXPECT_EQ(resize_default_init_call_count, 1);
111
- EXPECT_EQ(append_default_init_call_count, 0);
112
- absl::strings_internal::STLStringResizeUninitializedAmortized(&rus, 1000);
113
- EXPECT_EQ(resize_call_count, 0);
114
- EXPECT_EQ(append_call_count, 0);
115
91
  EXPECT_EQ(resize_default_init_call_count, 1);
116
- EXPECT_EQ(append_default_init_call_count, 1);
117
92
  }
118
93
  }
119
94