re2 1.23.0 → 1.23.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/README.md +2 -0
  2. package/binding.gyp +3 -2
  3. package/package.json +5 -5
  4. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +25 -4
  5. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +6 -1
  6. package/vendor/abseil-cpp/CMakeLists.txt +2 -2
  7. package/vendor/abseil-cpp/MODULE.bazel +2 -2
  8. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +0 -1
  9. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +0 -2
  10. package/vendor/abseil-cpp/absl/algorithm/container.h +191 -140
  11. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +818 -0
  12. package/vendor/abseil-cpp/absl/base/BUILD.bazel +44 -5
  13. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +42 -3
  14. package/vendor/abseil-cpp/absl/base/attributes.h +5 -1
  15. package/vendor/abseil-cpp/absl/base/call_once_test.cc +10 -10
  16. package/vendor/abseil-cpp/absl/base/casts.cc +61 -0
  17. package/vendor/abseil-cpp/absl/base/casts.h +128 -2
  18. package/vendor/abseil-cpp/absl/base/casts_test.cc +151 -0
  19. package/vendor/abseil-cpp/absl/base/config.h +13 -37
  20. package/vendor/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
  21. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +4 -0
  22. package/vendor/abseil-cpp/absl/base/internal/nullability_traits.h +71 -0
  23. package/vendor/abseil-cpp/absl/base/internal/nullability_traits_test.cc +98 -0
  24. package/vendor/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
  25. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +13 -7
  26. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +16 -11
  27. package/vendor/abseil-cpp/absl/base/internal/strerror_test.cc +2 -1
  28. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +0 -9
  29. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +0 -6
  30. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -1
  31. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
  32. package/vendor/abseil-cpp/absl/base/macros.h +40 -17
  33. package/vendor/abseil-cpp/absl/base/nullability.h +1 -1
  34. package/vendor/abseil-cpp/absl/base/optimization.h +1 -3
  35. package/vendor/abseil-cpp/absl/base/options.h +1 -27
  36. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +5 -8
  37. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +4 -0
  38. package/vendor/abseil-cpp/absl/container/BUILD.bazel +195 -2
  39. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +136 -2
  40. package/vendor/abseil-cpp/absl/container/btree_map.h +56 -6
  41. package/vendor/abseil-cpp/absl/container/btree_set.h +52 -6
  42. package/vendor/abseil-cpp/absl/container/btree_test.cc +107 -1
  43. package/vendor/abseil-cpp/absl/container/chunked_queue.h +755 -0
  44. package/vendor/abseil-cpp/absl/container/chunked_queue_benchmark.cc +386 -0
  45. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +768 -0
  46. package/vendor/abseil-cpp/absl/container/fixed_array.h +4 -6
  47. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +16 -6
  48. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +1 -2
  49. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +16 -6
  50. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +0 -2
  51. package/vendor/abseil-cpp/absl/container/inlined_vector.h +12 -4
  52. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +21 -0
  53. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +14 -5
  54. package/vendor/abseil-cpp/absl/container/internal/chunked_queue.h +173 -0
  55. package/vendor/abseil-cpp/absl/container/internal/common.h +51 -0
  56. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +7 -1
  57. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +11 -0
  58. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +0 -2
  59. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +1 -2
  60. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +0 -14
  61. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +11 -8
  62. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +3 -4
  63. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +23 -6
  64. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +31 -15
  65. package/vendor/abseil-cpp/absl/container/internal/heterogeneous_lookup_testing.h +80 -0
  66. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +4 -12
  67. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -10
  68. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +149 -23
  69. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +120 -126
  70. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +4 -0
  71. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +8 -0
  72. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +14 -59
  73. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +111 -22
  74. package/vendor/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +53 -112
  75. package/vendor/abseil-cpp/absl/container/internal/unordered_map_lookup_test.h +10 -15
  76. package/vendor/abseil-cpp/absl/container/internal/unordered_map_members_test.h +3 -3
  77. package/vendor/abseil-cpp/absl/container/internal/unordered_map_modifiers_test.h +45 -61
  78. package/vendor/abseil-cpp/absl/container/internal/unordered_set_constructor_test.h +53 -112
  79. package/vendor/abseil-cpp/absl/container/internal/unordered_set_lookup_test.h +6 -9
  80. package/vendor/abseil-cpp/absl/container/internal/unordered_set_members_test.h +3 -3
  81. package/vendor/abseil-cpp/absl/container/internal/unordered_set_modifiers_test.h +25 -31
  82. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +666 -0
  83. package/vendor/abseil-cpp/absl/container/linked_hash_map_benchmark.cc +140 -0
  84. package/vendor/abseil-cpp/absl/container/linked_hash_map_test.cc +987 -0
  85. package/vendor/abseil-cpp/absl/container/linked_hash_set.h +527 -0
  86. package/vendor/abseil-cpp/absl/container/linked_hash_set_benchmark.cc +84 -0
  87. package/vendor/abseil-cpp/absl/container/linked_hash_set_test.cc +947 -0
  88. package/vendor/abseil-cpp/absl/container/node_hash_map.h +17 -6
  89. package/vendor/abseil-cpp/absl/container/node_hash_set.h +16 -5
  90. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +1 -2
  91. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +79 -0
  92. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +79 -0
  93. package/vendor/abseil-cpp/absl/copts/copts.py +17 -4
  94. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +67 -13
  95. package/vendor/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
  96. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +31 -0
  97. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +34 -0
  98. package/vendor/abseil-cpp/absl/debugging/failure_signal_handler.cc +2 -2
  99. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +118 -0
  100. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +71 -0
  101. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +97 -0
  102. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
  103. package/vendor/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
  104. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +4 -0
  105. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -0
  106. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +1 -1
  107. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +0 -7
  108. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
  109. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +2 -1
  110. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  111. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +2 -2
  112. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +35 -67
  113. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +3 -0
  114. package/vendor/abseil-cpp/absl/debugging/stacktrace_benchmark.cc +24 -1
  115. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +39 -15
  116. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
  117. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +25 -40
  118. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
  119. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +1 -0
  120. package/vendor/abseil-cpp/absl/flags/declare.h +9 -0
  121. package/vendor/abseil-cpp/absl/flags/flag.h +2 -1
  122. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
  123. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +3 -2
  124. package/vendor/abseil-cpp/absl/flags/marshalling.cc +1 -16
  125. package/vendor/abseil-cpp/absl/flags/parse.cc +4 -2
  126. package/vendor/abseil-cpp/absl/flags/parse_test.cc +1 -1
  127. package/vendor/abseil-cpp/absl/flags/reflection.cc +4 -3
  128. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +4 -0
  129. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +4 -0
  130. package/vendor/abseil-cpp/absl/functional/any_invocable.h +3 -1
  131. package/vendor/abseil-cpp/absl/functional/function_ref.h +125 -20
  132. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +122 -9
  133. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +13 -2
  134. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +42 -4
  135. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +11 -0
  136. package/vendor/abseil-cpp/absl/hash/hash_test.cc +5 -2
  137. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +184 -53
  138. package/vendor/abseil-cpp/absl/hash/internal/hash.h +116 -10
  139. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +43 -4
  140. package/vendor/abseil-cpp/absl/log/BUILD.bazel +2 -0
  141. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +35 -1
  142. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +59 -4
  143. package/vendor/abseil-cpp/absl/log/die_if_null.cc +3 -1
  144. package/vendor/abseil-cpp/absl/log/die_if_null.h +24 -3
  145. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +31 -1
  146. package/vendor/abseil-cpp/absl/log/internal/check_impl.h +2 -1
  147. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +3 -1
  148. package/vendor/abseil-cpp/absl/log/internal/check_op.h +44 -18
  149. package/vendor/abseil-cpp/absl/log/internal/conditions.h +38 -35
  150. package/vendor/abseil-cpp/absl/log/internal/container.h +312 -0
  151. package/vendor/abseil-cpp/absl/log/internal/container_test.cc +254 -0
  152. package/vendor/abseil-cpp/absl/log/internal/log_impl.h +108 -110
  153. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -2
  154. package/vendor/abseil-cpp/absl/log/internal/log_message.h +5 -1
  155. package/vendor/abseil-cpp/absl/log/internal/strip.h +30 -31
  156. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +19 -19
  157. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
  158. package/vendor/abseil-cpp/absl/log/log.h +2 -2
  159. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +51 -0
  160. package/vendor/abseil-cpp/absl/meta/CMakeLists.txt +46 -0
  161. package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing.h +73 -0
  162. package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing_test.cc +40 -0
  163. package/vendor/abseil-cpp/absl/meta/internal/requires.h +67 -0
  164. package/vendor/abseil-cpp/absl/meta/internal/requires_test.cc +66 -0
  165. package/vendor/abseil-cpp/absl/meta/type_traits.h +42 -1
  166. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +14 -0
  167. package/vendor/abseil-cpp/absl/numeric/int128.h +41 -21
  168. package/vendor/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
  169. package/vendor/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
  170. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +52 -5
  171. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +1 -0
  172. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +1 -0
  173. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +18 -7
  174. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +1 -0
  175. package/vendor/abseil-cpp/absl/random/internal/fastmath_test.cc +3 -5
  176. package/vendor/abseil-cpp/absl/random/internal/platform.h +0 -13
  177. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +0 -1
  178. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +1 -27
  179. package/vendor/abseil-cpp/absl/status/BUILD.bazel +17 -0
  180. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +16 -0
  181. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +4 -2
  182. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +2 -2
  183. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +2 -1
  184. package/vendor/abseil-cpp/absl/status/status.cc +4 -0
  185. package/vendor/abseil-cpp/absl/status/status.h +5 -0
  186. package/vendor/abseil-cpp/absl/status/status_matchers.h +48 -0
  187. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +27 -0
  188. package/vendor/abseil-cpp/absl/status/status_test.cc +1 -0
  189. package/vendor/abseil-cpp/absl/status/statusor.h +1 -1
  190. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +101 -21
  191. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +99 -5
  192. package/vendor/abseil-cpp/absl/strings/ascii.h +9 -4
  193. package/vendor/abseil-cpp/absl/strings/cord.cc +15 -10
  194. package/vendor/abseil-cpp/absl/strings/cord.h +1 -1
  195. package/vendor/abseil-cpp/absl/strings/escaping.cc +126 -94
  196. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
  197. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite_test.cc +95 -0
  198. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +2 -0
  199. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc +8 -8
  200. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +24 -18
  201. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +10 -16
  202. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +9 -7
  203. package/vendor/abseil-cpp/absl/strings/internal/generic_printer.cc +107 -0
  204. package/vendor/abseil-cpp/absl/strings/internal/generic_printer.h +115 -0
  205. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +423 -0
  206. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +685 -0
  207. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +0 -12
  208. package/vendor/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
  209. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +21 -7
  210. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +495 -8
  211. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -15
  212. package/vendor/abseil-cpp/absl/strings/numbers.cc +71 -8
  213. package/vendor/abseil-cpp/absl/strings/numbers.h +25 -12
  214. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +70 -0
  215. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +194 -0
  216. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite_test.cc +154 -0
  217. package/vendor/abseil-cpp/absl/strings/str_cat.cc +96 -91
  218. package/vendor/abseil-cpp/absl/strings/str_cat.h +17 -12
  219. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +4 -4
  220. package/vendor/abseil-cpp/absl/strings/str_split.h +1 -1
  221. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +1 -1
  222. package/vendor/abseil-cpp/absl/strings/string_view.h +8 -718
  223. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +1 -1265
  224. package/vendor/abseil-cpp/absl/strings/substitute.cc +24 -24
  225. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +2 -3
  226. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +1 -0
  227. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
  228. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +15 -5
  229. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +2 -1
  230. package/vendor/abseil-cpp/absl/synchronization/mutex.h +47 -23
  231. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  232. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +2 -0
  233. package/vendor/abseil-cpp/absl/time/civil_time_benchmark.cc +1 -2
  234. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +58 -103
  235. package/vendor/abseil-cpp/absl/time/clock.cc +18 -16
  236. package/vendor/abseil-cpp/absl/time/clock_test.cc +2 -2
  237. package/vendor/abseil-cpp/absl/time/duration_benchmark.cc +144 -0
  238. package/vendor/abseil-cpp/absl/time/duration_test.cc +26 -29
  239. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +7 -1
  240. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +4 -2
  241. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
  242. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +186 -0
  243. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
  244. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  245. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +0 -0
  246. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +0 -0
  247. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +0 -0
  248. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +0 -0
  249. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab +9 -9
  250. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +12 -12
  251. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +47 -47
  252. package/vendor/abseil-cpp/absl/time/time.cc +4 -4
  253. package/vendor/abseil-cpp/absl/time/time.h +10 -10
  254. package/vendor/abseil-cpp/absl/time/time_test.cc +1 -0
  255. package/vendor/abseil-cpp/absl/types/compare.h +62 -61
  256. package/vendor/abseil-cpp/absl/types/compare_test.cc +3 -3
  257. package/vendor/abseil-cpp/absl/types/internal/span.h +1 -0
  258. package/vendor/abseil-cpp/absl/types/optional.h +2 -2
  259. package/vendor/abseil-cpp/absl/types/span.h +10 -2
  260. package/vendor/abseil-cpp/absl/utility/utility.h +13 -0
  261. package/vendor/abseil-cpp/ci/absl_alternate_options.h +0 -1
  262. package/vendor/abseil-cpp/ci/cmake_common.sh +1 -1
  263. package/vendor/abseil-cpp/ci/cmake_install_test.sh +6 -0
  264. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +1 -0
  265. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +2 -0
  266. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +1 -0
  267. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +1 -0
  268. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +1 -0
  269. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +1 -0
  270. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +1 -0
  271. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +6 -0
  272. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +6 -0
  273. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +3 -2
  274. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +5 -0
  275. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -0
  276. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -0
  277. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +6 -1
  278. package/vendor/abseil-cpp/absl/base/internal/identity.h +0 -39
  279. package/vendor/abseil-cpp/absl/strings/string_view.cc +0 -257
  280. package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +0 -380
@@ -28,11 +28,9 @@
28
28
  // We disable format checker under vscode intellisense compilation.
29
29
  // See https://github.com/microsoft/vscode-cpptools/issues/3683 for
30
30
  // more details.
31
- #if ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__native_client__) && \
32
- !defined(__INTELLISENSE__)
31
+ #if ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__INTELLISENSE__)
33
32
  #define ABSL_INTERNAL_ENABLE_FORMAT_CHECKER 1
34
- #endif // ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__native_client__) &&
35
- // !defined(__INTELLISENSE__)
33
+ #endif // ABSL_HAVE_ATTRIBUTE(enable_if) && !defined(__INTELLISENSE__)
36
34
  #endif // ABSL_INTERNAL_ENABLE_FORMAT_CHECKER
37
35
 
38
36
  namespace absl {
@@ -284,6 +284,11 @@ const NativePrintfTraits &VerifyNativeImplementation() {
284
284
  return native_traits;
285
285
  }
286
286
 
287
+ bool IsNativeHexFloatConversion(char f) { return f == 'a' || f == 'A'; }
288
+ bool IsNativeFloatConversion(char f) {
289
+ return f == 'f' || f == 'F' || f == 'e' || f == 'E' || f == 'a' || f == 'A';
290
+ }
291
+
287
292
  class FormatConvertTest : public ::testing::Test { };
288
293
 
289
294
  template <typename T>
@@ -799,20 +804,19 @@ void TestWithMultipleFormatsHelper(Floating tested_float) {
799
804
  'e', 'E'}) {
800
805
  std::string fmt_str = std::string(fmt) + f;
801
806
 
802
- if (fmt == absl::string_view("%.5000") && f != 'f' && f != 'F' &&
803
- f != 'a' && f != 'A') {
807
+ if (fmt == absl::string_view("%.5000") && !IsNativeFloatConversion(f)) {
804
808
  // This particular test takes way too long with snprintf.
805
809
  // Disable for the case we are not implementing natively.
806
810
  continue;
807
811
  }
808
812
 
809
- if ((f == 'a' || f == 'A') &&
813
+ if (IsNativeHexFloatConversion(f) &&
810
814
  !native_traits.hex_float_has_glibc_rounding) {
811
815
  continue;
812
816
  }
813
817
 
814
818
  if (!native_traits.hex_float_prefers_denormal_repr &&
815
- (f == 'a' || f == 'A') &&
819
+ IsNativeHexFloatConversion(f) &&
816
820
  std::fpclassify(tested_float) == FP_SUBNORMAL) {
817
821
  continue;
818
822
  }
@@ -1059,6 +1063,17 @@ TEST_F(FormatConvertTest, DoubleRound) {
1059
1063
  "0.000000000000000000000000000000000002"
1060
1064
  "25694915357879201529997415146671170141"
1061
1065
  "1837869002408041296803276054561138153076171875");
1066
+
1067
+ // Scientific exponent cases
1068
+ // Round to even with all zeros after round digit
1069
+ EXPECT_EQ(format("%0.13e", 1671075773261250), "1.6710757732612e+15");
1070
+
1071
+ // Rounding where precision is in first digit run
1072
+ EXPECT_EQ(format("%0.1e", -1.93437090148818698e-297), "-1.9e-297");
1073
+ EXPECT_EQ(format("%0.1e", -9.92255780642280927e-298), "-9.9e-298");
1074
+
1075
+ // Rounding large negative exponent first digit
1076
+ EXPECT_EQ(format("%0.1e", -8.956e-294), "-9.0e-294");
1062
1077
  }
1063
1078
 
1064
1079
  TEST_F(FormatConvertTest, DoubleRoundA) {
@@ -1317,14 +1332,13 @@ TEST_F(FormatConvertTest, LongDouble) {
1317
1332
  'e', 'E'}) {
1318
1333
  std::string fmt_str = std::string(fmt) + 'L' + f;
1319
1334
 
1320
- if (fmt == absl::string_view("%.5000") && f != 'f' && f != 'F' &&
1321
- f != 'a' && f != 'A') {
1335
+ if (fmt == absl::string_view("%.5000") && !IsNativeFloatConversion(f)) {
1322
1336
  // This particular test takes way too long with snprintf.
1323
1337
  // Disable for the case we are not implementing natively.
1324
1338
  continue;
1325
1339
  }
1326
1340
 
1327
- if (f == 'a' || f == 'A') {
1341
+ if (IsNativeHexFloatConversion(f)) {
1328
1342
  if (!native_traits.hex_float_has_glibc_rounding ||
1329
1343
  !native_traits.hex_float_optimizes_leading_digit_bit_count) {
1330
1344
  continue;
@@ -20,7 +20,10 @@
20
20
  #include <array>
21
21
  #include <cassert>
22
22
  #include <cmath>
23
+ #include <cstdint>
24
+ #include <cstring>
23
25
  #include <limits>
26
+ #include <optional>
24
27
  #include <string>
25
28
 
26
29
  #include "absl/base/attributes.h"
@@ -31,7 +34,9 @@
31
34
  #include "absl/numeric/bits.h"
32
35
  #include "absl/numeric/int128.h"
33
36
  #include "absl/numeric/internal/representation.h"
37
+ #include "absl/strings/internal/str_format/extension.h"
34
38
  #include "absl/strings/numbers.h"
39
+ #include "absl/strings/string_view.h"
35
40
  #include "absl/types/optional.h"
36
41
  #include "absl/types/span.h"
37
42
 
@@ -451,6 +456,71 @@ char* PrintFractionalDigitsFast(uint128 v,
451
456
  return p;
452
457
  }
453
458
 
459
+ struct FractionalDigitPrinterResult {
460
+ char* end;
461
+ size_t skipped_zeros;
462
+ bool nonzero_remainder;
463
+ };
464
+
465
+ FractionalDigitPrinterResult PrintFractionalDigitsScientific(
466
+ uint64_t v, char* start, int exp, size_t precision, bool skip_zeros) {
467
+ char* p = start;
468
+ v <<= (64 - exp);
469
+
470
+ size_t skipped_zeros = 0;
471
+ while (v != 0 && precision > 0) {
472
+ char carry = MultiplyBy10WithCarry(&v, 0);
473
+ if (skip_zeros) {
474
+ if (carry == 0) {
475
+ ++skipped_zeros;
476
+ continue;
477
+ }
478
+ skip_zeros = false;
479
+ }
480
+ *p++ = carry + '0';
481
+ --precision;
482
+ }
483
+ return {p, skipped_zeros, v != 0};
484
+ }
485
+
486
+ FractionalDigitPrinterResult PrintFractionalDigitsScientific(
487
+ uint128 v, char* start, int exp, size_t precision, bool skip_zeros) {
488
+ char* p = start;
489
+ v <<= (128 - exp);
490
+ auto high = static_cast<uint64_t>(v >> 64);
491
+ auto low = static_cast<uint64_t>(v);
492
+
493
+ size_t skipped_zeros = 0;
494
+ while (precision > 0 && low != 0) {
495
+ char carry = MultiplyBy10WithCarry(&low, 0);
496
+ carry = MultiplyBy10WithCarry(&high, carry);
497
+ if (skip_zeros) {
498
+ if (carry == 0) {
499
+ ++skipped_zeros;
500
+ continue;
501
+ }
502
+ skip_zeros = false;
503
+ }
504
+ *p++ = carry + '0';
505
+ --precision;
506
+ }
507
+
508
+ while (precision > 0 && high != 0) {
509
+ char carry = MultiplyBy10WithCarry(&high, 0);
510
+ if (skip_zeros) {
511
+ if (carry == 0) {
512
+ ++skipped_zeros;
513
+ continue;
514
+ }
515
+ skip_zeros = false;
516
+ }
517
+ *p++ = carry + '0';
518
+ --precision;
519
+ }
520
+
521
+ return {p, skipped_zeros, high != 0 || low != 0};
522
+ }
523
+
454
524
  struct FormatState {
455
525
  char sign_char;
456
526
  size_t precision;
@@ -1333,6 +1403,427 @@ void WriteBufferToSink(char sign_char, absl::string_view str,
1333
1403
  sink->Append(right_spaces, ' ');
1334
1404
  }
1335
1405
 
1406
+ template <typename Int>
1407
+ void FormatE(Int mantissa, int exp, bool uppercase, const FormatState& state) {
1408
+ if (exp > 0) {
1409
+ const int total_bits =
1410
+ static_cast<int>(sizeof(Int) * 8) - LeadingZeros(mantissa) + exp;
1411
+ if (total_bits > 128) {
1412
+ FormatEPositiveExpSlow(mantissa, exp, uppercase, state);
1413
+ return;
1414
+ }
1415
+ } else {
1416
+ if (ABSL_PREDICT_FALSE(exp < -128)) {
1417
+ FormatENegativeExpSlow(mantissa, exp, uppercase, state);
1418
+ return;
1419
+ }
1420
+ }
1421
+ FormatEFast(mantissa, exp, uppercase, state);
1422
+ }
1423
+
1424
+ // Guaranteed to fit into 128 bits at this point
1425
+ template <typename Int>
1426
+ void FormatEFast(Int v, int exp, bool uppercase, const FormatState& state) {
1427
+ if (!v) {
1428
+ absl::string_view mantissa_str = state.ShouldPrintDot() ? "0." : "0";
1429
+ FinalPrint(state, mantissa_str, 0, state.precision,
1430
+ uppercase ? "E+00" : "e+00");
1431
+ return;
1432
+ }
1433
+ constexpr int kInputBits = sizeof(Int) * 8;
1434
+ constexpr int kMaxFractionalDigits = 128;
1435
+ constexpr int kBufferSize = 2 + // '.' + rounding
1436
+ kMaxFixedPrecision + // Integral
1437
+ kMaxFractionalDigits; // Fractional
1438
+ const int total_bits = kInputBits - LeadingZeros(v) + exp;
1439
+ char buffer[kBufferSize];
1440
+ char* integral_start = buffer + 2;
1441
+ char* integral_end = buffer + 2 + kMaxFixedPrecision;
1442
+ char* final_start;
1443
+ char* final_end;
1444
+ bool zero_integral = false;
1445
+ int scientific_exp = 0;
1446
+ size_t digits_printed = 0;
1447
+ size_t trailing_zeros = 0;
1448
+ bool has_more_non_zero = false;
1449
+
1450
+ auto check_integral_zeros =
1451
+ [](char* const begin, char* const end,
1452
+ const size_t precision, size_t digits_processed) -> bool {
1453
+ // When considering rounding to even, we care about the digits after the
1454
+ // round digit which means the total digits to move from the start is
1455
+ // precision + 2 since the first digit we print before the decimal point
1456
+ // is not a part of precision.
1457
+ size_t digit_upper_bound = precision + 2;
1458
+ if (digits_processed > digit_upper_bound) {
1459
+ return std::any_of(begin + digit_upper_bound, end,
1460
+ [](char c) { return c != '0'; });
1461
+ }
1462
+ return false;
1463
+ };
1464
+
1465
+ if (exp >= 0) {
1466
+ integral_end = total_bits <= 64 ? numbers_internal::FastIntToBuffer(
1467
+ static_cast<uint64_t>(v) << exp, integral_start)
1468
+ : numbers_internal::FastIntToBuffer(
1469
+ static_cast<uint128>(v) << exp, integral_start);
1470
+ *integral_end = '0';
1471
+ final_start = integral_start;
1472
+ // Integral is guaranteed to be non-zero at this point.
1473
+ scientific_exp = static_cast<int>(integral_end - integral_start) - 1;
1474
+ digits_printed = static_cast<size_t>(integral_end - integral_start);
1475
+ final_end = integral_end;
1476
+ has_more_non_zero = check_integral_zeros(integral_start, integral_end,
1477
+ state.precision, digits_printed);
1478
+ } else {
1479
+ exp = -exp;
1480
+ if (exp < kInputBits) {
1481
+ integral_end =
1482
+ numbers_internal::FastIntToBuffer(v >> exp, integral_start);
1483
+ }
1484
+ *integral_end = '0';
1485
+ // We didn't move integral_start and it gets set to 0 in
1486
+ zero_integral = exp >= kInputBits || v >> exp == 0;
1487
+ if (!zero_integral) {
1488
+ digits_printed = static_cast<size_t>(integral_end - integral_start);
1489
+ has_more_non_zero = check_integral_zeros(integral_start, integral_end,
1490
+ state.precision, digits_printed);
1491
+ final_end = integral_end;
1492
+ }
1493
+ // Print fractional digits
1494
+ char* fractional_start = integral_end;
1495
+
1496
+ size_t digits_to_print = (state.precision + 1) >= digits_printed
1497
+ ? state.precision + 1 - digits_printed
1498
+ : 0;
1499
+ bool print_extra = digits_printed <= state.precision + 1;
1500
+ auto [fractional_end, skipped_zeros, has_nonzero_rem] =
1501
+ exp <= 64 ? PrintFractionalDigitsScientific(
1502
+ v, fractional_start, exp, digits_to_print + print_extra,
1503
+ zero_integral)
1504
+ : PrintFractionalDigitsScientific(
1505
+ static_cast<uint128>(v), fractional_start, exp,
1506
+ digits_to_print + print_extra, zero_integral);
1507
+ final_end = fractional_end;
1508
+ *fractional_end = '0';
1509
+ has_more_non_zero |= has_nonzero_rem;
1510
+ digits_printed += static_cast<size_t>(fractional_end - fractional_start);
1511
+ if (zero_integral) {
1512
+ scientific_exp = -1 * static_cast<int>(skipped_zeros + 1);
1513
+ } else {
1514
+ scientific_exp = static_cast<int>(integral_end - integral_start) - 1;
1515
+ }
1516
+ // Don't do any rounding here, we will do it ourselves.
1517
+ final_start = zero_integral ? fractional_start : integral_start;
1518
+ }
1519
+
1520
+ // For rounding
1521
+ if (digits_printed >= state.precision + 1) {
1522
+ final_start[-1] = '0';
1523
+ char* round_digit_ptr = final_start + 1 + state.precision;
1524
+ if (*round_digit_ptr > '5') {
1525
+ RoundUp(round_digit_ptr - 1);
1526
+ } else if (*round_digit_ptr == '5') {
1527
+ if (has_more_non_zero) {
1528
+ RoundUp(round_digit_ptr - 1);
1529
+ } else {
1530
+ RoundToEven(round_digit_ptr - 1);
1531
+ }
1532
+ }
1533
+ final_end = round_digit_ptr;
1534
+ if (final_start[-1] == '1') {
1535
+ --final_start;
1536
+ ++scientific_exp;
1537
+ --final_end;
1538
+ }
1539
+ } else {
1540
+ // Need to pad with zeros.
1541
+ trailing_zeros = state.precision - (digits_printed - 1);
1542
+ }
1543
+
1544
+ if (state.precision > 0 || state.ShouldPrintDot()) {
1545
+ final_start[-1] = *final_start;
1546
+ *final_start = '.';
1547
+ --final_start;
1548
+ }
1549
+
1550
+ // We need to add 2 to the buffer size for the +/- sign and the e
1551
+ constexpr size_t kExpBufferSize = numbers_internal::kFastToBufferSize + 2;
1552
+ char exp_buffer[kExpBufferSize];
1553
+ char* exp_ptr_start = exp_buffer;
1554
+ char* exp_ptr = exp_ptr_start;
1555
+ *exp_ptr++ = uppercase ? 'E' : 'e';
1556
+ if (scientific_exp >= 0) {
1557
+ *exp_ptr++ = '+';
1558
+ } else {
1559
+ *exp_ptr++ = '-';
1560
+ scientific_exp = -scientific_exp;
1561
+ }
1562
+
1563
+ if (scientific_exp < 10) {
1564
+ *exp_ptr++ = '0';
1565
+ }
1566
+ exp_ptr = numbers_internal::FastIntToBuffer(scientific_exp, exp_ptr);
1567
+ FinalPrint(state,
1568
+ absl::string_view(final_start,
1569
+ static_cast<size_t>(final_end - final_start)),
1570
+ 0, trailing_zeros,
1571
+ absl::string_view(exp_ptr_start,
1572
+ static_cast<size_t>(exp_ptr - exp_ptr_start)));
1573
+ }
1574
+
1575
+ void FormatENegativeExpSlow(uint128 mantissa, int exp, bool uppercase,
1576
+ const FormatState& state) {
1577
+ assert(exp < 0);
1578
+
1579
+ FractionalDigitGenerator::RunConversion(
1580
+ mantissa, -exp,
1581
+ [&](FractionalDigitGenerator digit_gen) {
1582
+ int first_digit = 0;
1583
+ size_t nines = 0;
1584
+ int num_leading_zeros = 0;
1585
+ while (digit_gen.HasMoreDigits()) {
1586
+ auto digits = digit_gen.GetDigits();
1587
+ if (digits.digit_before_nine != 0) {
1588
+ first_digit = digits.digit_before_nine;
1589
+ nines = digits.num_nines;
1590
+ break;
1591
+ } else if (digits.num_nines > 0) {
1592
+ // This also means the first digit is 0
1593
+ first_digit = 9;
1594
+ nines = digits.num_nines - 1;
1595
+ num_leading_zeros++;
1596
+ break;
1597
+ }
1598
+ num_leading_zeros++;
1599
+ }
1600
+
1601
+ bool change_to_zeros = false;
1602
+ if (nines >= state.precision || state.precision == 0) {
1603
+ bool round_up = false;
1604
+ if (nines == state.precision) {
1605
+ round_up = digit_gen.IsGreaterThanHalf();
1606
+ } else {
1607
+ round_up = nines > 0 || digit_gen.IsGreaterThanHalf();
1608
+ }
1609
+ if (round_up) {
1610
+ first_digit = (first_digit == 9 ? 1 : first_digit + 1);
1611
+ num_leading_zeros -= (first_digit == 1);
1612
+ change_to_zeros = true;
1613
+ }
1614
+ }
1615
+ int scientific_exp = -(num_leading_zeros + 1);
1616
+ assert(scientific_exp < 0);
1617
+ char exp_buffer[numbers_internal::kFastToBufferSize];
1618
+ char* exp_start = exp_buffer;
1619
+ *exp_start++ = '-';
1620
+ if (scientific_exp > -10) {
1621
+ *exp_start++ = '0';
1622
+ }
1623
+ scientific_exp *= -1;
1624
+ char* exp_end =
1625
+ numbers_internal::FastIntToBuffer(scientific_exp, exp_start);
1626
+ const size_t total_digits =
1627
+ 1 // First digit
1628
+ + (state.ShouldPrintDot() ? 1 : 0) // Decimal point
1629
+ + state.precision // Digits after decimal
1630
+ + 1 // 'e' or 'E'
1631
+ + static_cast<size_t>(exp_end - exp_buffer); // Exponent digits
1632
+
1633
+ const auto padding = ExtraWidthToPadding(
1634
+ total_digits + (state.sign_char != '\0' ? 1 : 0), state);
1635
+ state.sink->Append(padding.left_spaces, ' ');
1636
+
1637
+ if (state.sign_char != '\0') {
1638
+ state.sink->Append(1, state.sign_char);
1639
+ }
1640
+
1641
+ state.sink->Append(1, static_cast<char>(first_digit + '0'));
1642
+ if (state.ShouldPrintDot()) {
1643
+ state.sink->Append(1, '.');
1644
+ }
1645
+ size_t digits_to_go = state.precision;
1646
+ size_t nines_to_print = std::min(nines, digits_to_go);
1647
+ state.sink->Append(nines_to_print, change_to_zeros ? '0' : '9');
1648
+ digits_to_go -= nines_to_print;
1649
+ while (digits_to_go > 0 && digit_gen.HasMoreDigits()) {
1650
+ auto digits = digit_gen.GetDigits();
1651
+
1652
+ if (digits.num_nines + 1 < digits_to_go) {
1653
+ state.sink->Append(1, digits.digit_before_nine + '0');
1654
+ state.sink->Append(digits.num_nines, '9');
1655
+ digits_to_go -= digits.num_nines + 1;
1656
+ } else {
1657
+ bool round_up = false;
1658
+ if (digits.num_nines + 1 > digits_to_go) {
1659
+ round_up = true;
1660
+ } else if (digit_gen.IsGreaterThanHalf()) {
1661
+ round_up = true;
1662
+ } else if (digit_gen.IsExactlyHalf()) {
1663
+ round_up =
1664
+ digits.num_nines != 0 || digits.digit_before_nine % 2 == 1;
1665
+ }
1666
+ if (round_up) {
1667
+ state.sink->Append(1, digits.digit_before_nine + '1');
1668
+ --digits_to_go;
1669
+ } else {
1670
+ state.sink->Append(1, digits.digit_before_nine + '0');
1671
+ state.sink->Append(digits_to_go - 1, '9');
1672
+ digits_to_go = 0;
1673
+ }
1674
+ break;
1675
+ }
1676
+ }
1677
+ state.sink->Append(digits_to_go, '0');
1678
+ state.sink->Append(1, uppercase ? 'E' : 'e');
1679
+ state.sink->Append(absl::string_view(
1680
+ exp_buffer, static_cast<size_t>(exp_end - exp_buffer)));
1681
+ state.sink->Append(padding.right_spaces, ' ');
1682
+ });
1683
+ }
1684
+
1685
+ std::optional<int> GetOneDigit(BinaryToDecimal& btd,
1686
+ absl::string_view& digits_view) {
1687
+ if (digits_view.empty()) {
1688
+ if (!btd.AdvanceDigits()) return std::nullopt;
1689
+ digits_view = btd.CurrentDigits();
1690
+ }
1691
+ char d = digits_view.front();
1692
+ digits_view.remove_prefix(1);
1693
+ return d - '0';
1694
+ }
1695
+
1696
+ struct DigitRun {
1697
+ std::optional<int> digit;
1698
+ size_t nines;
1699
+ };
1700
+
1701
+ DigitRun GetDigits(BinaryToDecimal& btd, absl::string_view& digits_view) {
1702
+ auto peek_digit = [&]() -> std::optional<int> {
1703
+ if (digits_view.empty()) {
1704
+ if (!btd.AdvanceDigits()) return std::nullopt;
1705
+ digits_view = btd.CurrentDigits();
1706
+ }
1707
+ return digits_view.front() - '0';
1708
+ };
1709
+
1710
+ auto digit_before_nines = GetOneDigit(btd, digits_view);
1711
+ if (!digit_before_nines.has_value()) return {std::nullopt, 0};
1712
+
1713
+ auto next_digit = peek_digit();
1714
+ size_t num_nines = 0;
1715
+ while (next_digit == 9) {
1716
+ // consume the 9
1717
+ GetOneDigit(btd, digits_view);
1718
+ ++num_nines;
1719
+ next_digit = peek_digit();
1720
+ }
1721
+ return digit_before_nines == 9
1722
+ ? DigitRun{std::nullopt, num_nines + 1}
1723
+ : DigitRun{digit_before_nines, num_nines};
1724
+ }
1725
+
1726
+ void FormatEPositiveExpSlow(uint128 mantissa, int exp, bool uppercase,
1727
+ const FormatState& state) {
1728
+ BinaryToDecimal::RunConversion(
1729
+ mantissa, exp, [&](BinaryToDecimal btd) {
1730
+ int scientific_exp = static_cast<int>(btd.TotalDigits() - 1);
1731
+ absl::string_view digits_view = btd.CurrentDigits();
1732
+
1733
+ size_t digits_to_go = state.precision + 1;
1734
+ auto [first_digit_opt, nines] = GetDigits(btd, digits_view);
1735
+ if (!first_digit_opt.has_value() && nines == 0) {
1736
+ return;
1737
+ }
1738
+
1739
+ int first_digit = first_digit_opt.value_or(9);
1740
+ if (!first_digit_opt) {
1741
+ --nines;
1742
+ }
1743
+
1744
+ // At this point we are guaranteed to have some sort of first digit
1745
+ bool change_to_zeros = false;
1746
+ if (nines + 1 >= digits_to_go) {
1747
+ // Everything we need to print is in the first DigitRun
1748
+ auto next_digit_opt = GetDigits(btd, digits_view).digit;
1749
+ if (nines == state.precision) {
1750
+ change_to_zeros = next_digit_opt.value_or(0) > 4;
1751
+ } else {
1752
+ change_to_zeros = true;
1753
+ }
1754
+ if (change_to_zeros) {
1755
+ if (first_digit != 9) {
1756
+ first_digit = first_digit + 1;
1757
+ } else {
1758
+ first_digit = 1;
1759
+ ++scientific_exp;
1760
+ }
1761
+ }
1762
+ }
1763
+
1764
+ char exp_buffer[numbers_internal::kFastToBufferSize];
1765
+ char* exp_buffer_end =
1766
+ numbers_internal::FastIntToBuffer(scientific_exp, exp_buffer);
1767
+ const size_t total_digits_out =
1768
+ 1 + state.ShouldPrintDot() + state.precision + 2 +
1769
+ (static_cast<size_t>(exp_buffer_end - exp_buffer));
1770
+
1771
+ const auto padding = ExtraWidthToPadding(
1772
+ total_digits_out + (state.sign_char != '\0' ? 1 : 0), state);
1773
+
1774
+ state.sink->Append(padding.left_spaces, ' ');
1775
+ if (state.sign_char != '\0') {
1776
+ state.sink->Append(1, state.sign_char);
1777
+ }
1778
+ state.sink->Append(1, static_cast<char>(first_digit + '0'));
1779
+ --digits_to_go;
1780
+ if (state.precision > 0 || state.ShouldPrintDot()) {
1781
+ state.sink->Append(1, '.');
1782
+ }
1783
+ state.sink->Append(std::min(digits_to_go, nines),
1784
+ change_to_zeros ? '0' : '9');
1785
+ digits_to_go -= std::min(digits_to_go, nines);
1786
+ while (digits_to_go > 0) {
1787
+ auto [digit_opt, curr_nines] = GetDigits(btd, digits_view);
1788
+ if (!digit_opt.has_value()) break;
1789
+ int digit = *digit_opt;
1790
+ if (curr_nines + 1 < digits_to_go) {
1791
+ state.sink->Append(1, static_cast<char>(digit + '0'));
1792
+ state.sink->Append(curr_nines, '9');
1793
+ digits_to_go -= curr_nines + 1;
1794
+ } else {
1795
+ bool need_round_up = false;
1796
+ auto next_digit_opt = GetDigits(btd, digits_view).digit;
1797
+ if (digits_to_go == 1) {
1798
+ need_round_up = curr_nines > 0 || next_digit_opt > 4;
1799
+ } else if (digits_to_go == curr_nines + 1) {
1800
+ // Only round if next digit is > 4
1801
+ need_round_up = next_digit_opt.value_or(0) > 4;
1802
+ } else {
1803
+ // we know we need to round since nine is after precision ends
1804
+ need_round_up = true;
1805
+ }
1806
+ state.sink->Append(1,
1807
+ static_cast<char>(digit + need_round_up + '0'));
1808
+ state.sink->Append(digits_to_go - 1, need_round_up ? '0' : '9');
1809
+ digits_to_go = 0;
1810
+ }
1811
+ }
1812
+
1813
+ if (digits_to_go > 0) {
1814
+ state.sink->Append(digits_to_go, '0');
1815
+ }
1816
+ state.sink->Append(1, uppercase ? 'E' : 'e');
1817
+ state.sink->Append(1, scientific_exp >= 0 ? '+' : '-');
1818
+ if (scientific_exp < 10) {
1819
+ state.sink->Append(1, '0');
1820
+ }
1821
+ state.sink->Append(absl::string_view(
1822
+ exp_buffer, static_cast<size_t>(exp_buffer_end - exp_buffer)));
1823
+ state.sink->Append(padding.right_spaces, ' ');
1824
+ });
1825
+ }
1826
+
1336
1827
  template <typename Float>
1337
1828
  bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv,
1338
1829
  FormatSinkImpl *sink) {
@@ -1371,14 +1862,10 @@ bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv,
1371
1862
  return true;
1372
1863
  } else if (c == FormatConversionCharInternal::e ||
1373
1864
  c == FormatConversionCharInternal::E) {
1374
- if (!FloatToBuffer<FormatStyle::Precision>(decomposed, precision, &buffer,
1375
- &exp)) {
1376
- return FallbackToSnprintf(v, conv, sink);
1377
- }
1378
- if (!conv.has_alt_flag() && buffer.back() == '.') buffer.pop_back();
1379
- PrintExponent(
1380
- exp, FormatConversionCharIsUpper(conv.conversion_char()) ? 'E' : 'e',
1381
- &buffer);
1865
+ FormatE(decomposed.mantissa, decomposed.exponent,
1866
+ FormatConversionCharIsUpper(conv.conversion_char()),
1867
+ {sign_char, precision, conv, sink});
1868
+ return true;
1382
1869
  } else if (c == FormatConversionCharInternal::g ||
1383
1870
  c == FormatConversionCharInternal::G) {
1384
1871
  precision = std::max(precision, size_t{1}) - 1;
@@ -47,6 +47,7 @@
47
47
  #include "absl/base/internal/raw_logging.h"
48
48
  #include "absl/strings/internal/ostringstream.h"
49
49
  #include "absl/strings/internal/resize_uninitialized.h"
50
+ #include "absl/strings/resize_and_overwrite.h"
50
51
  #include "absl/strings/str_cat.h"
51
52
  #include "absl/strings/string_view.h"
52
53
 
@@ -249,23 +250,25 @@ std::string JoinAlgorithm(Iterator start, Iterator end, absl::string_view s,
249
250
  constexpr uint64_t kMaxSize =
250
251
  uint64_t{(std::numeric_limits<size_t>::max)()};
251
252
  ABSL_INTERNAL_CHECK(result_size <= kMaxSize, "size_t overflow");
252
- STLStringResizeUninitialized(&result, static_cast<size_t>(result_size));
253
-
254
- // Joins strings
255
- char* result_buf = &*result.begin();
256
-
257
- memcpy(result_buf, start_value.data(), start_value.size());
258
- result_buf += start_value.size();
259
- for (Iterator it = start; ++it != end;) {
260
- memcpy(result_buf, s.data(), s.size());
261
- result_buf += s.size();
262
- auto&& value = *it;
263
- memcpy(result_buf, value.data(), value.size());
264
- result_buf += value.size();
265
- }
253
+
254
+ StringResizeAndOverwrite(
255
+ result, static_cast<size_t>(result_size),
256
+ [&start, &end, &start_value, s](char* result_buf,
257
+ size_t result_buf_size) {
258
+ // Joins strings
259
+ memcpy(result_buf, start_value.data(), start_value.size());
260
+ result_buf += start_value.size();
261
+ for (Iterator it = start; ++it != end;) {
262
+ memcpy(result_buf, s.data(), s.size());
263
+ result_buf += s.size();
264
+ auto&& value = *it;
265
+ memcpy(result_buf, value.data(), value.size());
266
+ result_buf += value.size();
267
+ }
268
+ return result_buf_size;
269
+ });
266
270
  }
267
271
  }
268
-
269
272
  return result;
270
273
  }
271
274