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
@@ -35,6 +35,7 @@
35
35
  #include "absl/base/config.h"
36
36
  #include "absl/base/internal/endian.h"
37
37
  #include "absl/base/internal/raw_logging.h"
38
+ #include "absl/base/macros.h"
38
39
  #include "absl/base/nullability.h"
39
40
  #include "absl/base/optimization.h"
40
41
  #include "absl/numeric/bits.h"
@@ -400,6 +401,411 @@ char* absl_nonnull numbers_internal::FastIntToBuffer(
400
401
  return buffer;
401
402
  }
402
403
 
404
+ // Although DBL_DIG is typically 15, DBL_MAX is normally represented with 17
405
+ // digits of precision. When converted to a string value with fewer digits
406
+ // of precision using strtod(), the result can be bigger than DBL_MAX due to
407
+ // a rounding error. Converting this value back to a double will produce an
408
+ // Inf which will trigger a SIGFPE if FP exceptions are enabled. We skip
409
+ // the precision check for sufficiently large values to avoid the SIGFPE.
410
+ static constexpr double kDoublePrecisionCheckMax =
411
+ std::numeric_limits<double>::max() / 1.000000000000001;
412
+
413
+ char* absl_nonnull numbers_internal::RoundTripDoubleToBuffer(
414
+ double d, char* absl_nonnull buffer) {
415
+ // DBL_DIG is 15 for IEEE-754 doubles, which are used on almost all
416
+ // platforms these days. Just in case some system exists where DBL_DIG
417
+ // is significantly larger -- and risks overflowing our buffer -- we have
418
+ // this assert.
419
+ static_assert(std::numeric_limits<double>::digits10 < 20,
420
+ "std::numeric_limits<double>::digits10 is too big");
421
+
422
+ // We avoid snprintf for NaNs because it inconsistently outputs "-nan"
423
+ // or "nan" when given a nan with the sign bit set.
424
+ if (std::isnan(d)) {
425
+ strcpy(buffer, "nan"); // NOLINT(runtime/printf)
426
+ return buffer;
427
+ }
428
+ bool full_precision_needed = true;
429
+ if (std::abs(d) <= kDoublePrecisionCheckMax) {
430
+ int snprintf_result =
431
+ snprintf(buffer, numbers_internal::kFastToBufferSize, "%.*g",
432
+ std::numeric_limits<double>::digits10, d);
433
+
434
+ // The snprintf should never overflow because the buffer is significantly
435
+ // larger than the precision we asked for.
436
+ ABSL_ASSERT(snprintf_result > 0 &&
437
+ snprintf_result < numbers_internal::kFastToBufferSize);
438
+
439
+ full_precision_needed = strtod(buffer, nullptr) != d;
440
+ }
441
+
442
+ if (full_precision_needed) {
443
+ int snprintf_result =
444
+ snprintf(buffer, numbers_internal::kFastToBufferSize, "%.*g",
445
+ std::numeric_limits<double>::digits10 + 2, d);
446
+
447
+ // Should never overflow; see above.
448
+ ABSL_ASSERT(snprintf_result > 0 &&
449
+ snprintf_result < numbers_internal::kFastToBufferSize);
450
+ }
451
+ return buffer;
452
+ }
453
+
454
+ namespace {
455
+
456
+ // This table is used to quickly calculate the base-ten exponent of a given
457
+ // float, and then to provide a multiplier to bring that number into the
458
+ // range 1-999,999,999, that is, into uint32_t range. Finally, the exp
459
+ // string is made available so there is one less int-to-string conversion
460
+ // to be done.
461
+ struct Spec {
462
+ double min_range;
463
+ double multiplier;
464
+ const char expstr[5];
465
+ };
466
+
467
+ // clang-format off
468
+ constexpr Spec kNegExpTable[] = {
469
+ Spec{1.4e-45f, 1e+55, "e-45"},
470
+ Spec{1e-44f, 1e+54, "e-44"},
471
+ Spec{1e-43f, 1e+53, "e-43"},
472
+ Spec{1e-42f, 1e+52, "e-42"},
473
+ Spec{1e-41f, 1e+51, "e-41"},
474
+ Spec{1e-40f, 1e+50, "e-40"},
475
+ Spec{1e-39f, 1e+49, "e-39"},
476
+ Spec{1e-38f, 1e+48, "e-38"},
477
+ Spec{1e-37f, 1e+47, "e-37"},
478
+ Spec{1e-36f, 1e+46, "e-36"},
479
+ Spec{1e-35f, 1e+45, "e-35"},
480
+ Spec{1e-34f, 1e+44, "e-34"},
481
+ Spec{1e-33f, 1e+43, "e-33"},
482
+ Spec{1e-32f, 1e+42, "e-32"},
483
+ Spec{1e-31f, 1e+41, "e-31"},
484
+ Spec{1e-30f, 1e+40, "e-30"},
485
+ Spec{1e-29f, 1e+39, "e-29"},
486
+ Spec{1e-28f, 1e+38, "e-28"},
487
+ Spec{1e-27f, 1e+37, "e-27"},
488
+ Spec{1e-26f, 1e+36, "e-26"},
489
+ Spec{1e-25f, 1e+35, "e-25"},
490
+ Spec{1e-24f, 1e+34, "e-24"},
491
+ Spec{1e-23f, 1e+33, "e-23"},
492
+ Spec{1e-22f, 1e+32, "e-22"},
493
+ Spec{1e-21f, 1e+31, "e-21"},
494
+ Spec{1e-20f, 1e+30, "e-20"},
495
+ Spec{1e-19f, 1e+29, "e-19"},
496
+ Spec{1e-18f, 1e+28, "e-18"},
497
+ Spec{1e-17f, 1e+27, "e-17"},
498
+ Spec{1e-16f, 1e+26, "e-16"},
499
+ Spec{1e-15f, 1e+25, "e-15"},
500
+ Spec{1e-14f, 1e+24, "e-14"},
501
+ Spec{1e-13f, 1e+23, "e-13"},
502
+ Spec{1e-12f, 1e+22, "e-12"},
503
+ Spec{1e-11f, 1e+21, "e-11"},
504
+ Spec{1e-10f, 1e+20, "e-10"},
505
+ Spec{1e-09f, 1e+19, "e-09"},
506
+ Spec{1e-08f, 1e+18, "e-08"},
507
+ Spec{1e-07f, 1e+17, "e-07"},
508
+ Spec{1e-06f, 1e+16, "e-06"},
509
+ Spec{1e-05f, 1e+15, "e-05"},
510
+ Spec{1e-04f, 1e+14, "e-04"},
511
+ };
512
+ // clang-format on
513
+
514
+ // clang-format off
515
+ constexpr Spec kPosExpTable[] = {
516
+ Spec{1e+08f, 1e+02, "e+08"},
517
+ Spec{1e+09f, 1e+01, "e+09"},
518
+ Spec{1e+10f, 1e+00, "e+10"},
519
+ Spec{1e+11f, 1e-01, "e+11"},
520
+ Spec{1e+12f, 1e-02, "e+12"},
521
+ Spec{1e+13f, 1e-03, "e+13"},
522
+ Spec{1e+14f, 1e-04, "e+14"},
523
+ Spec{1e+15f, 1e-05, "e+15"},
524
+ Spec{1e+16f, 1e-06, "e+16"},
525
+ Spec{1e+17f, 1e-07, "e+17"},
526
+ Spec{1e+18f, 1e-08, "e+18"},
527
+ Spec{1e+19f, 1e-09, "e+19"},
528
+ Spec{1e+20f, 1e-10, "e+20"},
529
+ Spec{1e+21f, 1e-11, "e+21"},
530
+ Spec{1e+22f, 1e-12, "e+22"},
531
+ Spec{1e+23f, 1e-13, "e+23"},
532
+ Spec{1e+24f, 1e-14, "e+24"},
533
+ Spec{1e+25f, 1e-15, "e+25"},
534
+ Spec{1e+26f, 1e-16, "e+26"},
535
+ Spec{1e+27f, 1e-17, "e+27"},
536
+ Spec{1e+28f, 1e-18, "e+28"},
537
+ Spec{1e+29f, 1e-19, "e+29"},
538
+ Spec{1e+30f, 1e-20, "e+30"},
539
+ Spec{1e+31f, 1e-21, "e+31"},
540
+ Spec{1e+32f, 1e-22, "e+32"},
541
+ Spec{1e+33f, 1e-23, "e+33"},
542
+ Spec{1e+34f, 1e-24, "e+34"},
543
+ Spec{1e+35f, 1e-25, "e+35"},
544
+ Spec{1e+36f, 1e-26, "e+36"},
545
+ Spec{1e+37f, 1e-27, "e+37"},
546
+ Spec{1e+38f, 1e-28, "e+38"},
547
+ Spec{1e+39, 1e-29, "e+39"},
548
+ };
549
+ // clang-format on
550
+
551
+ struct ExpCompare {
552
+ bool operator()(const Spec& spec, double d) const {
553
+ return spec.min_range < d;
554
+ }
555
+ };
556
+
557
+ } // namespace
558
+
559
+ // Utility routine(s) for RoundTripFloatToBuffer:
560
+ // OutputNecessaryDigits takes two 11-digit numbers, whose integer portion
561
+ // represents the fractional part of a floating-point number, and outputs a
562
+ // number that is in-between them, with the fewest digits possible. For
563
+ // instance, given 12345678900 and 12345876900, it would output "0123457".
564
+ // When there are multiple final digits that would satisfy this requirement,
565
+ // this routine attempts to use a digit that would represent the average of
566
+ // lower_double and upper_double.
567
+ //
568
+ // Although the routine works using integers, all callers use doubles, so
569
+ // for their convenience this routine accepts doubles.
570
+ static char* absl_nonnull OutputNecessaryDigits(double lower_double,
571
+ double upper_double,
572
+ char* absl_nonnull out) {
573
+ assert(lower_double > 0);
574
+ assert(lower_double < upper_double - 10);
575
+ assert(upper_double < 100000000000.0);
576
+
577
+ // Narrow the range a bit; without this bias, an input of lower=87654320010.0
578
+ // and upper=87654320100.0 would produce an output of 876543201
579
+ //
580
+ // We do this in three steps: first, we lower the upper bound and truncate it
581
+ // to an integer. Then, we increase the lower bound by exactly the amount we
582
+ // just decreased the upper bound by - at that point, the midpoint is exactly
583
+ // where it used to be. Then we truncate the lower bound.
584
+
585
+ uint64_t upper64 = static_cast<uint64_t>(upper_double - (1.0 / 1024));
586
+ double shrink = upper_double - upper64;
587
+ uint64_t lower64 = static_cast<uint64_t>(lower_double + shrink);
588
+
589
+ // Theory of operation: we convert the lower number to ascii representation,
590
+ // two digits at a time. As we go, we remove the same digits from the upper
591
+ // number. When we see the upper number does not share those same digits, we
592
+ // know we can stop converting. When we stop, the last digit we output is
593
+ // taken from the average of upper and lower values, rounded up.
594
+ char buf[2];
595
+ uint32_t lodigits =
596
+ static_cast<uint32_t>(lower64 / 1000000000); // 1,000,000,000
597
+ uint64_t mul64 = lodigits * uint64_t{1000000000};
598
+
599
+ numbers_internal::PutTwoDigits(lodigits, out);
600
+ out += 2;
601
+ if (upper64 - mul64 >= 1000000000) { // digit mismatch!
602
+ numbers_internal::PutTwoDigits(static_cast<uint32_t>(upper64 / 1000000000),
603
+ buf);
604
+ if (out[-2] != buf[0]) {
605
+ out[-2] = static_cast<char>('0' + (upper64 + lower64 + 10000000000) /
606
+ 20000000000);
607
+ --out;
608
+ } else {
609
+ numbers_internal::PutTwoDigits(
610
+ static_cast<uint32_t>((upper64 + lower64 + 1000000000) / 2000000000),
611
+ out - 2);
612
+ }
613
+ *out = '\0';
614
+ return out;
615
+ }
616
+ uint32_t lower = static_cast<uint32_t>(lower64 - mul64);
617
+ uint32_t upper = static_cast<uint32_t>(upper64 - mul64);
618
+
619
+ lodigits = lower / 10000000; // 10,000,000
620
+ uint32_t mul = lodigits * 10000000;
621
+ numbers_internal::PutTwoDigits(lodigits, out);
622
+ out += 2;
623
+ if (upper - mul >= 10000000) { // digit mismatch!
624
+ numbers_internal::PutTwoDigits(upper / 10000000, buf);
625
+ if (out[-2] != buf[0]) {
626
+ out[-2] = '0' + (upper + lower + 100000000) / 200000000;
627
+ --out;
628
+ } else {
629
+ numbers_internal::PutTwoDigits((upper + lower + 10000000) / 20000000,
630
+ out - 2);
631
+ }
632
+ *out = '\0';
633
+ return out;
634
+ }
635
+ lower -= mul;
636
+ upper -= mul;
637
+
638
+ lodigits = lower / 100000; // 100,000
639
+ mul = lodigits * 100000;
640
+ numbers_internal::PutTwoDigits(lodigits, out);
641
+ out += 2;
642
+ if (upper - mul >= 100000) { // digit mismatch!
643
+ numbers_internal::PutTwoDigits(upper / 100000, buf);
644
+ if (out[-2] != buf[0]) {
645
+ out[-2] = static_cast<char>('0' + (upper + lower + 1000000) / 2000000);
646
+ --out;
647
+ } else {
648
+ numbers_internal::PutTwoDigits((upper + lower + 100000) / 200000,
649
+ out - 2);
650
+ }
651
+ *out = '\0';
652
+ return out;
653
+ }
654
+ lower -= mul;
655
+ upper -= mul;
656
+
657
+ lodigits = lower / 1000;
658
+ mul = lodigits * 1000;
659
+ numbers_internal::PutTwoDigits(lodigits, out);
660
+ out += 2;
661
+ if (upper - mul >= 1000) { // digit mismatch!
662
+ numbers_internal::PutTwoDigits(upper / 1000, buf);
663
+ if (out[-2] != buf[0]) {
664
+ out[-2] = static_cast<char>('0' + (upper + lower + 10000) / 20000);
665
+ --out;
666
+ } else {
667
+ numbers_internal::PutTwoDigits((upper + lower + 1000) / 2000, out - 2);
668
+ }
669
+ *out = '\0';
670
+ return out;
671
+ }
672
+ lower -= mul;
673
+ upper -= mul;
674
+
675
+ numbers_internal::PutTwoDigits(lower / 10, out);
676
+ out += 2;
677
+ numbers_internal::PutTwoDigits(upper / 10, buf);
678
+ if (out[-2] != buf[0]) {
679
+ out[-2] = static_cast<char>('0' + (upper + lower + 100) / 200);
680
+ --out;
681
+ } else {
682
+ numbers_internal::PutTwoDigits((upper + lower + 10) / 20, out - 2);
683
+ }
684
+ *out = '\0';
685
+ return out;
686
+ }
687
+
688
+ // RoundTripFloatToBuffer converts the given float into a string which, if
689
+ // passed to strtof, will produce the exact same original float. It does this
690
+ // by computing the range of possible doubles which map to the given float, and
691
+ // then examining the digits of the doubles in that range. If all the doubles
692
+ // in the range start with "2.37", then clearly our float does, too. As soon as
693
+ // they diverge, only one more digit is needed.
694
+ char* absl_nonnull numbers_internal::RoundTripFloatToBuffer(
695
+ float f, char* absl_nonnull buffer) {
696
+ static_assert(std::numeric_limits<float>::is_iec559,
697
+ "IEEE-754/IEC-559 support only");
698
+
699
+ // We write data to out, incrementing as we go, but FloatToBuffer always
700
+ // returns the address of the buffer passed in.
701
+ char* out = buffer;
702
+
703
+ if (std::isnan(f)) {
704
+ strcpy(out, "nan"); // NOLINT(runtime/printf)
705
+ return buffer;
706
+ }
707
+ if (f == 0) { // +0 and -0 are handled here
708
+ if (std::signbit(f)) {
709
+ strcpy(out, "-0"); // NOLINT(runtime/printf)
710
+ } else {
711
+ strcpy(out, "0"); // NOLINT(runtime/printf)
712
+ }
713
+ return buffer;
714
+ }
715
+ if (f < 0) {
716
+ *out++ = '-';
717
+ f = -f;
718
+ }
719
+ if (f > std::numeric_limits<float>::max()) {
720
+ strcpy(out, "inf"); // NOLINT(runtime/printf)
721
+ return buffer;
722
+ }
723
+
724
+ double next_lower = nextafterf(f, 0.0f);
725
+ // For all doubles in the range lower_bound < f < upper_bound, the
726
+ // nearest float is f.
727
+ double lower_bound = (f + next_lower) * 0.5;
728
+ double upper_bound = f + (f - lower_bound);
729
+ // Note: because std::nextafter is slow, we calculate upper_bound
730
+ // assuming that it is the same distance from f as lower_bound is.
731
+ // For exact powers of two, upper_bound is actually twice as far
732
+ // from f as lower_bound is, but this turns out not to matter.
733
+
734
+ // Most callers pass floats that are either 0 or within the
735
+ // range 0.0001 through 100,000,000, so handle those first,
736
+ // since they don't need exponential notation.
737
+ const Spec* spec = nullptr;
738
+ if (f < 1.0) {
739
+ if (f >= 0.0001f) {
740
+ // For fractional values, we set up the multiplier at the same
741
+ // time as we output the leading "0." / "0.0" / "0.00" / "0.000"
742
+ double multiplier = 1e+11;
743
+ *out++ = '0';
744
+ *out++ = '.';
745
+ if (f < 0.1f) {
746
+ multiplier = 1e+12;
747
+ *out++ = '0';
748
+ if (f < 0.01f) {
749
+ multiplier = 1e+13;
750
+ *out++ = '0';
751
+ if (f < 0.001f) {
752
+ multiplier = 1e+14;
753
+ *out++ = '0';
754
+ }
755
+ }
756
+ }
757
+ OutputNecessaryDigits(lower_bound * multiplier, upper_bound * multiplier,
758
+ out);
759
+ return buffer;
760
+ }
761
+ spec = std::lower_bound(std::begin(kNegExpTable), std::end(kNegExpTable),
762
+ double{f}, ExpCompare());
763
+ if (spec == std::end(kNegExpTable)) --spec;
764
+ } else if (f < 1e8) {
765
+ // Handling non-exponential format greater than 1.0 is similar to the above,
766
+ // but instead of 0.0 / 0.00 / 0.000, the prefix is simply the truncated
767
+ // integer part of f.
768
+ int32_t as_int = static_cast<int32_t>(f);
769
+ out = numbers_internal::FastIntToBuffer(as_int, out);
770
+ // Easy: if the integer part is within (lower_bound, upper_bound), then we
771
+ // are already done.
772
+ if (as_int > lower_bound && as_int < upper_bound) {
773
+ return buffer;
774
+ }
775
+ *out++ = '.';
776
+ OutputNecessaryDigits((lower_bound - as_int) * 1e11,
777
+ (upper_bound - as_int) * 1e11, out);
778
+ return buffer;
779
+ } else {
780
+ spec = std::lower_bound(std::begin(kPosExpTable), std::end(kPosExpTable),
781
+ double{f}, ExpCompare());
782
+ if (spec == std::end(kPosExpTable)) --spec;
783
+ }
784
+ // Exponential notation from here on. "spec" was computed using lower_bound,
785
+ // which means it's the first spec from the table where min_range is greater
786
+ // or equal to f.
787
+ // Unfortunately that's not quite what we want; we want a min_range that is
788
+ // less or equal. So first thing, if it was greater, back up one entry.
789
+ if (spec->min_range > f) --spec;
790
+
791
+ // The digits might be "237000123", but we want "2.37000123",
792
+ // so we output the digits one character later, and then move the first
793
+ // digit back so we can stick the "." in.
794
+ char* start = out;
795
+ out = OutputNecessaryDigits(lower_bound * spec->multiplier,
796
+ upper_bound * spec->multiplier, start + 1);
797
+ start[0] = start[1];
798
+ start[1] = '.';
799
+
800
+ // If it turns out there was only one digit output, then back up over the '.'
801
+ if (out == &start[2]) --out;
802
+
803
+ // Now add the "e+NN" part.
804
+ memcpy(out, spec->expstr, 4);
805
+ out[4] = '\0';
806
+ return buffer;
807
+ }
808
+
403
809
  // Given a 128-bit number expressed as a pair of uint64_t, high half first,
404
810
  // return that number multiplied by the given 32-bit value. If the result is
405
811
  // too large to fit in a 128-bit number, divide it by 2 until it fits.
@@ -178,6 +178,10 @@ inline constexpr int kFastToBuffer128Size = 41;
178
178
  inline constexpr int kFastToBufferSize = 32;
179
179
  inline constexpr int kSixDigitsToBufferSize = 16;
180
180
 
181
+ // Helper function used to implement absl::HighPrecision().
182
+ char* absl_nonnull RoundTripDoubleToBuffer(double d, char* absl_nonnull buffer);
183
+ char* absl_nonnull RoundTripFloatToBuffer(float f, char* absl_nonnull buffer);
184
+
181
185
  // Helper function for fast formatting of floating-point values.
182
186
  // The result is the same as printf's "%g", a.k.a. "%.6g"; that is, six
183
187
  // significant digits are returned, trailing zeros are removed, and numbers
@@ -1780,6 +1780,39 @@ void ExhaustiveFloat(uint32_t cases, R&& runnable) {
1780
1780
  }
1781
1781
  }
1782
1782
 
1783
+ TEST_F(SimpleDtoaTest, ExhaustiveFloatToBuffer) {
1784
+ uint64_t test_count = 0;
1785
+ std::vector<float> mismatches;
1786
+ ExhaustiveFloat(kFloatNumCases, [&](float f) {
1787
+ if (f != f) return; // rule out NaNs
1788
+ ++test_count;
1789
+ char fastbuf[absl::numbers_internal::kFastToBufferSize];
1790
+ absl::numbers_internal::RoundTripFloatToBuffer(f, fastbuf);
1791
+ float round_trip = strtof(fastbuf, nullptr);
1792
+ if (f != round_trip) {
1793
+ mismatches.push_back(f);
1794
+ if (mismatches.size() < 10) {
1795
+ LOG(ERROR) << "Round-trip failure with float. f=" << f << "="
1796
+ << ToNineDigits(f) << " fast=" << fastbuf
1797
+ << " strtof=" << ToNineDigits(round_trip);
1798
+ }
1799
+ }
1800
+ });
1801
+ if (!mismatches.empty()) {
1802
+ EXPECT_EQ(mismatches.size(), 0);
1803
+ for (size_t i = 0; i < mismatches.size(); ++i) {
1804
+ if (i > 100) i = mismatches.size() - 1;
1805
+ float f = mismatches[i];
1806
+ char buf[absl::numbers_internal::kFastToBufferSize];
1807
+ float rt = strtof(buf, nullptr);
1808
+ LOG(ERROR) << "Mismatch #" << i << " f=" << f << " (" << ToNineDigits(f)
1809
+ << ") fast='"
1810
+ << absl::numbers_internal::RoundTripFloatToBuffer(f, buf)
1811
+ << "' rt=" << ToNineDigits(rt);
1812
+ }
1813
+ }
1814
+ }
1815
+
1783
1816
  TEST_F(SimpleDtoaTest, ExhaustiveDoubleToSixDigits) {
1784
1817
  uint64_t test_count = 0;
1785
1818
  std::vector<double> mismatches;
@@ -53,9 +53,10 @@
53
53
 
54
54
  #include "absl/base/config.h"
55
55
  #include "absl/base/dynamic_annotations.h"
56
- #include "absl/base/internal/throw_delegate.h"
56
+ #include "absl/base/internal/hardening.h"
57
57
  #include "absl/base/macros.h"
58
58
  #include "absl/base/optimization.h"
59
+ #include "absl/base/throw_delegate.h"
59
60
 
60
61
  #if defined(__cpp_lib_string_resize_and_overwrite) && \
61
62
  __cpp_lib_string_resize_and_overwrite >= 202110L
@@ -124,7 +125,7 @@ struct has_Resize_and_overwrite<
124
125
  template <typename T, typename Op>
125
126
  void StringResizeAndOverwriteFallback(T& str, typename T::size_type n, Op op) {
126
127
  if (ABSL_PREDICT_FALSE(n > str.max_size())) {
127
- absl::base_internal::ThrowStdLengthError("absl::StringResizeAndOverwrite");
128
+ ThrowStdLengthError("absl::StringResizeAndOverwrite");
128
129
  }
129
130
  #ifdef ABSL_HAVE_MEMORY_SANITIZER
130
131
  auto old_size = str.size();
@@ -135,10 +136,13 @@ void StringResizeAndOverwriteFallback(T& str, typename T::size_type n, Op op) {
135
136
  ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(str.data() + old_size, n - old_size);
136
137
  }
137
138
  #endif
138
- auto new_size = std::move(op)(str.data(), n);
139
- ABSL_HARDENING_ASSERT(new_size >= 0 && new_size <= n);
140
- ABSL_HARDENING_ASSERT(str.data()[n] == typename T::value_type{});
141
- str.erase(static_cast<typename T::size_type>(new_size));
139
+ typename T::size_type new_size =
140
+ static_cast<typename T::size_type>(std::move(op)(str.data(), n));
141
+ absl::base_internal::HardeningAssertGE(new_size, typename T::size_type{0});
142
+ absl::base_internal::HardeningAssertLE(new_size, n);
143
+ absl::base_internal::HardeningAssert(str.data()[n] ==
144
+ typename T::value_type{});
145
+ str.erase(new_size);
142
146
  }
143
147
 
144
148
  template <typename T, typename Op>
@@ -43,6 +43,13 @@
43
43
  // Floating point numbers are formatted with six-digit precision, which is
44
44
  // the default for "std::cout <<" or printf "%g" (the same as "%.6g").
45
45
  //
46
+ // Floating point values can also be converted to a string which, if passed to
47
+ // `strtod()`, would produce the exact same original double (except in case of
48
+ // NaN; all NaNs are considered the same value) by passing the number to
49
+ // absl::HighPrecision. HighPrecision tries to keep the string short but
50
+ // it's not guaranteed to be as short as possible.
51
+ // See http://go/faster-double-strcat
52
+ //
46
53
  // You can convert to hexadecimal output rather than decimal output using the
47
54
  // `Hex` type contained here. To do so, pass `Hex(my_int)` as a parameter to
48
55
  // `StrCat()` or `StrAppend()`. You may specify a minimum hex field width using
@@ -106,7 +113,6 @@
106
113
  #include "absl/base/port.h"
107
114
  #include "absl/meta/type_traits.h"
108
115
  #include "absl/strings/has_absl_stringify.h"
109
- #include "absl/strings/internal/resize_uninitialized.h"
110
116
  #include "absl/strings/internal/stringify_sink.h"
111
117
  #include "absl/strings/numbers.h"
112
118
  #include "absl/strings/resize_and_overwrite.h"
@@ -305,6 +311,35 @@ struct Dec {
305
311
  }
306
312
  };
307
313
 
314
+ // -----------------------------------------------------------------------------
315
+ // HighPrecision
316
+ // -----------------------------------------------------------------------------
317
+ //
318
+ // Converts floating point values to a string which, if passed to
319
+ // `absl::SimpleAtof`/`absl::SimpleAtod`, would produce the exact same original
320
+ // floating point value (except in case of NaN; all NaNs are considered the same
321
+ // value). Tries to keep the string short but it's not guaranteed to be as short
322
+ // as possible.
323
+ //
324
+ // HighPrecision is conisderably slower than the default formatting, so only use
325
+ // it if you need the string to convert back to the same floating-point value.
326
+
327
+ inline strings_internal::AlphaNumBuffer<numbers_internal::kFastToBufferSize>
328
+ HighPrecision(float f) {
329
+ strings_internal::AlphaNumBuffer<numbers_internal::kFastToBufferSize> result;
330
+ result.size =
331
+ strlen(numbers_internal::RoundTripFloatToBuffer(f, &result.data[0]));
332
+ return result;
333
+ }
334
+
335
+ inline strings_internal::AlphaNumBuffer<numbers_internal::kFastToBufferSize>
336
+ HighPrecision(double d) {
337
+ strings_internal::AlphaNumBuffer<numbers_internal::kFastToBufferSize> result;
338
+ result.size =
339
+ strlen(numbers_internal::RoundTripDoubleToBuffer(d, &result.data[0]));
340
+ return result;
341
+ }
342
+
308
343
  // -----------------------------------------------------------------------------
309
344
  // AlphaNum
310
345
  // -----------------------------------------------------------------------------
@@ -228,8 +228,7 @@ void BM_StrAppendInt(benchmark::State& state) {
228
228
  return BM_StrAppend(state, table);
229
229
  }
230
230
 
231
- template <typename B>
232
- void StrAppendConfig(B* benchmark) {
231
+ void StrAppendConfig(::benchmark::Benchmark* benchmark) {
233
232
  for (int bytes : {10, 100, 1000, 10000}) {
234
233
  for (int chunks : {1, 2, 4, 8}) {
235
234
  // Only add the ones that divide properly. Otherwise we are over counting.
@@ -140,6 +140,9 @@ TEST(StrCat, Basics) {
140
140
  result = absl::StrCat(-1);
141
141
  EXPECT_EQ(result, "-1");
142
142
 
143
+ result = absl::StrCat(absl::HighPrecision(0.5));
144
+ EXPECT_EQ(result, "0.5");
145
+
143
146
  result = absl::StrCat(absl::SixDigits(0.5));
144
147
  EXPECT_EQ(result, "0.5");
145
148
 
@@ -182,16 +185,27 @@ TEST(StrCat, Basics) {
182
185
  EXPECT_EQ(result, "To output a char by ASCII/numeric value, use +: 33");
183
186
 
184
187
  float f = 100000.5;
188
+ result = absl::StrCat("A hundred K and a half is ", absl::HighPrecision(f));
189
+ EXPECT_EQ(result, "A hundred K and a half is 100000.5");
190
+
185
191
  result = absl::StrCat("A hundred K and a half is ", absl::SixDigits(f));
186
192
  EXPECT_EQ(result, "A hundred K and a half is 100000");
187
193
 
188
194
  f = 100001.5;
195
+ result = absl::StrCat("A hundred K and one and a half is ",
196
+ absl::HighPrecision(f));
197
+ EXPECT_EQ(result, "A hundred K and one and a half is 100001.5");
198
+
189
199
  result =
190
200
  absl::StrCat("A hundred K and one and a half is ", absl::SixDigits(f));
191
201
  EXPECT_EQ(result, "A hundred K and one and a half is 100002");
192
202
 
193
203
  double d = 100000.5;
194
204
  d *= d;
205
+ result = absl::StrCat("A hundred K and a half squared is ",
206
+ absl::HighPrecision(d));
207
+ EXPECT_EQ(result, "A hundred K and a half squared is 10000100000.25");
208
+
195
209
  result =
196
210
  absl::StrCat("A hundred K and a half squared is ", absl::SixDigits(d));
197
211
  EXPECT_EQ(result, "A hundred K and a half squared is 1.00001e+10");
@@ -408,6 +422,20 @@ TEST(StrAppend, Basics) {
408
422
  EXPECT_EQ(result.substr(old_size),
409
423
  "To output a char by ASCII/numeric value, use +: 33");
410
424
 
425
+ float f = 100000.5;
426
+ old_size = result.size();
427
+ absl::StrAppend(&result, "A hundred K and a half is ",
428
+ absl::HighPrecision(f));
429
+ EXPECT_EQ(result.substr(old_size), "A hundred K and a half is 100000.5");
430
+
431
+ double d = f;
432
+ d *= d;
433
+ old_size = result.size();
434
+ absl::StrAppend(&result, "A hundred K and a half squared is ",
435
+ absl::HighPrecision(d));
436
+ EXPECT_EQ(result.substr(old_size),
437
+ "A hundred K and a half squared is 10000100000.25");
438
+
411
439
  // Test 9 arguments, the old maximum
412
440
  old_size = result.size();
413
441
  absl::StrAppend(&result, 1, 22, 333, 4444, 55555, 666666, 7777777, 88888888,
@@ -501,12 +501,12 @@ TEST(StrJoin, Tuple) {
501
501
  absl::StrJoin(std::make_tuple(&x, &y, &z), "-",
502
502
  absl::DereferenceFormatter(TestFormatter())));
503
503
  EXPECT_EQ("0x0000000a-hell-3.",
504
- absl::StrJoin(std::make_tuple(absl::make_unique<int>(x),
505
- absl::make_unique<std::string>(y),
506
- absl::make_unique<double>(z)),
504
+ absl::StrJoin(std::make_tuple(std::make_unique<int>(x),
505
+ std::make_unique<std::string>(y),
506
+ std::make_unique<double>(z)),
507
507
  "-", absl::DereferenceFormatter(TestFormatter())));
508
508
  EXPECT_EQ("0x0000000a-hell-3.",
509
- absl::StrJoin(std::make_tuple(absl::make_unique<int>(x), &y, &z),
509
+ absl::StrJoin(std::make_tuple(std::make_unique<int>(x), &y, &z),
510
510
  "-", absl::DereferenceFormatter(TestFormatter())));
511
511
  }
512
512