re2 1.22.2 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +60 -4
  2. package/binding.gyp +5 -1
  3. package/lib/addon.cc +4 -0
  4. package/lib/new.cc +1 -246
  5. package/lib/pattern.cc +252 -0
  6. package/lib/pattern.h +10 -0
  7. package/lib/set.cc +777 -0
  8. package/lib/wrapped_re2_set.h +42 -0
  9. package/package.json +21 -9
  10. package/re2.d.ts +46 -9
  11. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
  12. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
  13. package/vendor/abseil-cpp/CMake/README.md +2 -2
  14. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  15. package/vendor/abseil-cpp/MODULE.bazel +6 -9
  16. package/vendor/abseil-cpp/README.md +6 -8
  17. package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
  18. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
  19. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
  20. package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
  21. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
  22. package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
  23. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
  24. package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
  25. package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
  26. package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
  27. package/vendor/abseil-cpp/absl/base/config.h +22 -129
  28. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
  29. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  30. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
  31. package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  32. package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  33. package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
  34. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  35. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
  36. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
  37. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
  38. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
  39. package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
  40. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
  41. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
  42. package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
  43. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
  44. package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
  45. package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
  46. package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  47. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
  48. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  49. package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
  50. package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
  51. package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
  52. package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
  53. package/vendor/abseil-cpp/absl/base/options.h +3 -80
  54. package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
  55. package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
  56. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
  57. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
  58. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
  59. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  60. package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
  61. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  62. package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
  63. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
  64. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
  65. package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
  68. package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
  69. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
  70. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
  71. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
  72. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
  73. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
  74. package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
  75. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
  76. package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
  77. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  78. package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
  79. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  80. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
  81. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
  82. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
  83. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
  84. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
  87. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
  88. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
  89. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
  90. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
  91. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
  92. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
  93. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
  94. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
  95. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
  96. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  97. package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
  101. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
  102. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
  103. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
  104. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
  105. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
  106. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
  107. package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
  108. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
  109. package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
  110. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
  111. package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
  112. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
  113. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
  114. package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
  115. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
  116. package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
  117. package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
  118. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
  119. package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
  120. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
  121. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
  122. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  123. package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
  124. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
  125. package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
  126. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
  127. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
  128. package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  129. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  130. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  131. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  132. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  133. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
  134. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  135. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  136. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
  137. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  138. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  139. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  140. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  141. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  142. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  143. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
  144. package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
  145. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
  146. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  147. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
  148. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
  149. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  150. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  151. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
  152. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
  153. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  154. package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
  155. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  156. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
  157. package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
  158. package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
  159. package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
  160. package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
  161. package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
  162. package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
  163. package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
  164. package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
  165. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
  166. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
  167. package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
  168. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
  169. package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
  170. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
  171. package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
  172. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
  173. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  174. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  175. package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
  176. package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
  177. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
  178. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
  179. package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
  180. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
  181. package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
  182. package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
  183. package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
  184. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
  185. package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
  186. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
  187. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
  188. package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
  189. package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
  190. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
  191. package/vendor/abseil-cpp/absl/log/check.h +2 -1
  192. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
  193. package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
  194. package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
  195. package/vendor/abseil-cpp/absl/log/globals.h +4 -5
  196. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
  197. package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  198. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
  199. package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
  200. package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  201. package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
  202. package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
  203. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  204. package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
  205. package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
  206. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  207. package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
  208. package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
  209. package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
  210. package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
  211. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
  212. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  213. package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
  214. package/vendor/abseil-cpp/absl/log/log.h +48 -35
  215. package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
  216. package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
  217. package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
  218. package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
  219. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
  220. package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  221. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
  222. package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
  223. package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
  224. package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
  225. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  226. package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
  227. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
  228. package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
  229. package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
  230. package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
  231. package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
  232. package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
  233. package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
  234. package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
  235. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
  236. package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
  237. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
  238. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
  239. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
  240. package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
  241. package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  242. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
  243. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
  244. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
  245. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
  246. package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
  247. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
  248. package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
  249. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  250. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
  251. package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
  252. package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  253. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
  254. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  255. package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
  256. package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
  257. package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
  258. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
  259. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  260. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
  261. package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
  262. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  263. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  264. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  265. package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
  266. package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
  267. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
  268. package/vendor/abseil-cpp/absl/random/random.h +88 -53
  269. package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  270. package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
  271. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  272. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  273. package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
  274. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
  275. package/vendor/abseil-cpp/absl/status/status.cc +4 -8
  276. package/vendor/abseil-cpp/absl/status/status.h +8 -8
  277. package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
  278. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
  279. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  280. package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
  281. package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
  282. package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
  283. package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
  284. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
  285. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
  286. package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
  287. package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
  288. package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
  289. package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
  290. package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
  291. package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
  292. package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
  293. package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
  294. package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
  295. package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  296. package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  297. package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
  298. package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
  299. package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
  300. package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
  301. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
  302. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
  303. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  304. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
  305. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
  306. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  307. package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
  308. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
  309. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
  310. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
  311. package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
  312. package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
  313. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  314. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  315. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
  316. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  317. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
  318. package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  319. package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  320. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  321. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
  322. package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  323. package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  324. package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  325. package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
  326. package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
  327. package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
  328. package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
  329. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
  330. package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
  331. package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
  332. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
  333. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
  334. package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
  335. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
  336. package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
  337. package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
  338. package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
  339. package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
  340. package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
  341. package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
  342. package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
  343. package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
  344. package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
  345. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
  346. package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
  347. package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
  348. package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
  349. package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
  350. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
  351. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
  352. package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
  353. package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
  354. package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
  355. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  356. package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  357. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
  358. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
  359. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
  360. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  361. package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  362. package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  363. package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  364. package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
  365. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  366. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
  367. package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  368. package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
  369. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
  370. package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
  371. package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
  372. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
  373. package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
  374. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  375. package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
  376. package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
  377. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
  378. package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
  379. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
  380. package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
  381. package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
  382. package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
  383. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
  384. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
  385. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  386. package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
  387. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
  388. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
  389. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
  390. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
  391. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  392. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
  393. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  394. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
  395. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
  396. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
  397. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
  398. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
  399. package/vendor/abseil-cpp/absl/time/time.h +24 -18
  400. package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
  401. package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
  402. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
  403. package/vendor/abseil-cpp/absl/types/any.h +9 -484
  404. package/vendor/abseil-cpp/absl/types/optional.h +7 -747
  405. package/vendor/abseil-cpp/absl/types/span.h +46 -19
  406. package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
  407. package/vendor/abseil-cpp/absl/types/variant.h +5 -784
  408. package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
  409. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
  410. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
  411. package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
  412. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
  413. package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
  414. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
  415. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
  416. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
  417. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
  418. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
  419. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  420. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
  421. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
  422. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
  423. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
  424. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
  425. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
  426. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
  427. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
  428. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
  429. package/vendor/re2/.bazelrc +4 -4
  430. package/vendor/re2/.bcr/metadata.template.json +16 -0
  431. package/vendor/re2/.bcr/presubmit.yml +57 -0
  432. package/vendor/re2/.bcr/source.template.json +5 -0
  433. package/vendor/re2/.github/bazel.sh +1 -7
  434. package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
  435. package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
  436. package/vendor/re2/.github/workflows/ci.yml +5 -6
  437. package/vendor/re2/.github/workflows/pages.yml +3 -3
  438. package/vendor/re2/.github/workflows/python.yml +29 -24
  439. package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
  440. package/vendor/re2/.github/workflows/release.yml +15 -4
  441. package/vendor/re2/BUILD.bazel +25 -0
  442. package/vendor/re2/CMakeLists.txt +100 -85
  443. package/vendor/re2/CONTRIBUTING.md +0 -1
  444. package/vendor/re2/MODULE.bazel +10 -10
  445. package/vendor/re2/Makefile +1 -1
  446. package/vendor/re2/README.md +259 -0
  447. package/vendor/re2/python/BUILD.bazel +8 -0
  448. package/vendor/re2/python/re2.py +1 -1
  449. package/vendor/re2/python/re2_test.py +6 -0
  450. package/vendor/re2/python/setup.py +3 -3
  451. package/vendor/re2/re2/bitmap256.cc +3 -4
  452. package/vendor/re2/re2/bitstate.cc +15 -10
  453. package/vendor/re2/re2/dfa.cc +1 -2
  454. package/vendor/re2/re2/parse.cc +3 -4
  455. package/vendor/re2/re2/prog.cc +1 -2
  456. package/vendor/re2/re2/prog.h +1 -0
  457. package/vendor/re2/re2/re2.cc +5 -0
  458. package/vendor/re2/re2/re2.h +9 -9
  459. package/vendor/re2/re2/set.cc +6 -0
  460. package/vendor/re2/re2/set.h +5 -0
  461. package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
  462. package/vendor/re2/re2/testing/re2_test.cc +8 -0
  463. package/vendor/re2/re2/testing/set_test.cc +5 -0
  464. package/vendor/re2/re2/walker-inl.h +1 -1
  465. package/vendor/abseil-cpp/WORKSPACE +0 -76
  466. package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
  467. package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
  468. package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  469. package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
  470. package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
  471. package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
  472. package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
  473. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
  474. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
  475. package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  476. package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
  477. package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
  478. package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
  479. package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
  480. package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
  481. package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  482. package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  483. package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  484. package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  485. package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
  486. package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
  487. package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
  488. package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
  489. package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
  490. package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
  491. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
  492. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
  493. package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
  494. package/vendor/re2/.github/workflows/pr.yml +0 -34
  495. package/vendor/re2/README +0 -47
@@ -34,13 +34,13 @@
34
34
  #include <random>
35
35
  #include <set>
36
36
  #include <string>
37
+ #include <type_traits>
37
38
  #include <vector>
38
39
 
39
40
  #include "gmock/gmock.h"
40
41
  #include "gtest/gtest.h"
41
42
  #include "absl/log/log.h"
42
43
  #include "absl/numeric/int128.h"
43
- #include "absl/random/distributions.h"
44
44
  #include "absl/random/random.h"
45
45
  #include "absl/strings/internal/numbers_test_common.h"
46
46
  #include "absl/strings/internal/ostringstream.h"
@@ -53,10 +53,14 @@ namespace {
53
53
  using absl::SimpleAtoi;
54
54
  using absl::SimpleHexAtoi;
55
55
  using absl::numbers_internal::kSixDigitsToBufferSize;
56
+ using absl::numbers_internal::safe_strto16_base;
56
57
  using absl::numbers_internal::safe_strto32_base;
57
58
  using absl::numbers_internal::safe_strto64_base;
59
+ using absl::numbers_internal::safe_strto8_base;
60
+ using absl::numbers_internal::safe_strtou16_base;
58
61
  using absl::numbers_internal::safe_strtou32_base;
59
62
  using absl::numbers_internal::safe_strtou64_base;
63
+ using absl::numbers_internal::safe_strtou8_base;
60
64
  using absl::numbers_internal::SixDigitsToBuffer;
61
65
  using absl::strings_internal::Itoa;
62
66
  using absl::strings_internal::strtouint32_test_cases;
@@ -256,9 +260,7 @@ TEST(Numbers, TestFastPrints) {
256
260
 
257
261
  template <typename int_type, typename in_val_type>
258
262
  void VerifySimpleAtoiGood(in_val_type in_value, int_type exp_value) {
259
- std::string s;
260
- // (u)int128 can be streamed but not StrCat'd.
261
- absl::strings_internal::OStringStream(&s) << in_value;
263
+ std::string s = absl::StrCat(in_value);
262
264
  int_type x = static_cast<int_type>(~exp_value);
263
265
  EXPECT_TRUE(SimpleAtoi(s, &x))
264
266
  << "in_value=" << in_value << " s=" << s << " x=" << x;
@@ -270,15 +272,71 @@ void VerifySimpleAtoiGood(in_val_type in_value, int_type exp_value) {
270
272
 
271
273
  template <typename int_type, typename in_val_type>
272
274
  void VerifySimpleAtoiBad(in_val_type in_value) {
273
- std::string s;
274
- // (u)int128 can be streamed but not StrCat'd.
275
- absl::strings_internal::OStringStream(&s) << in_value;
275
+ std::string s = absl::StrCat(in_value);
276
276
  int_type x;
277
277
  EXPECT_FALSE(SimpleAtoi(s, &x));
278
278
  EXPECT_FALSE(SimpleAtoi(s.c_str(), &x));
279
279
  }
280
280
 
281
281
  TEST(NumbersTest, Atoi) {
282
+ // SimpleAtoi(absl::string_view, int8_t)
283
+ VerifySimpleAtoiGood<int8_t>(0, 0);
284
+ VerifySimpleAtoiGood<int8_t>(42, 42);
285
+ VerifySimpleAtoiGood<int8_t>(-42, -42);
286
+
287
+ VerifySimpleAtoiGood<int8_t>(std::numeric_limits<int8_t>::min(),
288
+ std::numeric_limits<int8_t>::min());
289
+ VerifySimpleAtoiGood<int8_t>(std::numeric_limits<int8_t>::max(),
290
+ std::numeric_limits<int8_t>::max());
291
+
292
+ VerifySimpleAtoiBad<int8_t>(std::numeric_limits<uint8_t>::max());
293
+ VerifySimpleAtoiBad<int8_t>(std::numeric_limits<int16_t>::min());
294
+ VerifySimpleAtoiBad<int8_t>(std::numeric_limits<int16_t>::max());
295
+
296
+ // SimpleAtoi(absl::string_view, uint8_t)
297
+ VerifySimpleAtoiGood<uint8_t>(0, 0);
298
+ VerifySimpleAtoiGood<uint8_t>(42, 42);
299
+ VerifySimpleAtoiBad<uint8_t>(-42);
300
+
301
+ VerifySimpleAtoiBad<uint8_t>(std::numeric_limits<int8_t>::min());
302
+ VerifySimpleAtoiGood<uint8_t>(std::numeric_limits<int8_t>::max(),
303
+ std::numeric_limits<int8_t>::max());
304
+ VerifySimpleAtoiGood<uint8_t>(std::numeric_limits<uint8_t>::max(),
305
+ std::numeric_limits<uint8_t>::max());
306
+
307
+ VerifySimpleAtoiBad<uint8_t>(std::numeric_limits<int16_t>::min());
308
+ VerifySimpleAtoiBad<uint8_t>(std::numeric_limits<int16_t>::max());
309
+ VerifySimpleAtoiBad<uint8_t>(std::numeric_limits<uint16_t>::max());
310
+
311
+ // SimpleAtoi(absl::string_view, uint16_t)
312
+ VerifySimpleAtoiGood<int16_t>(0, 0);
313
+ VerifySimpleAtoiGood<int16_t>(42, 42);
314
+ VerifySimpleAtoiGood<int16_t>(-42, -42);
315
+
316
+ VerifySimpleAtoiGood<int16_t>(std::numeric_limits<int16_t>::min(),
317
+ std::numeric_limits<int16_t>::min());
318
+ VerifySimpleAtoiGood<int16_t>(std::numeric_limits<int16_t>::max(),
319
+ std::numeric_limits<int16_t>::max());
320
+
321
+ VerifySimpleAtoiBad<int16_t>(std::numeric_limits<uint16_t>::max());
322
+ VerifySimpleAtoiBad<int16_t>(std::numeric_limits<int32_t>::min());
323
+ VerifySimpleAtoiBad<int16_t>(std::numeric_limits<int32_t>::max());
324
+
325
+ // SimpleAtoi(absl::string_view, uint16_t)
326
+ VerifySimpleAtoiGood<uint16_t>(0, 0);
327
+ VerifySimpleAtoiGood<uint16_t>(42, 42);
328
+ VerifySimpleAtoiBad<uint16_t>(-42);
329
+
330
+ VerifySimpleAtoiBad<uint16_t>(std::numeric_limits<int16_t>::min());
331
+ VerifySimpleAtoiGood<uint16_t>(std::numeric_limits<int16_t>::max(),
332
+ std::numeric_limits<int16_t>::max());
333
+ VerifySimpleAtoiGood<uint16_t>(std::numeric_limits<uint16_t>::max(),
334
+ std::numeric_limits<uint16_t>::max());
335
+
336
+ VerifySimpleAtoiBad<uint16_t>(std::numeric_limits<int16_t>::min());
337
+ VerifySimpleAtoiBad<uint16_t>(std::numeric_limits<int32_t>::max());
338
+ VerifySimpleAtoiBad<uint16_t>(std::numeric_limits<uint32_t>::max());
339
+
282
340
  // SimpleAtoi(absl::string_view, int32_t)
283
341
  VerifySimpleAtoiGood<int32_t>(0, 0);
284
342
  VerifySimpleAtoiGood<int32_t>(42, 42);
@@ -381,6 +439,7 @@ TEST(NumbersTest, Atoi) {
381
439
  VerifySimpleAtoiBad<absl::int128>(std::numeric_limits<absl::uint128>::max());
382
440
 
383
441
  // Some other types
442
+ VerifySimpleAtoiGood<short>(-42, -42); // NOLINT: runtime-int
384
443
  VerifySimpleAtoiGood<int>(-42, -42);
385
444
  VerifySimpleAtoiGood<int32_t>(-42, -42);
386
445
  VerifySimpleAtoiGood<uint32_t>(42, 42);
@@ -677,10 +736,14 @@ TEST(NumbersTest, Atoenum) {
677
736
  template <typename int_type, typename in_val_type>
678
737
  void VerifySimpleHexAtoiGood(in_val_type in_value, int_type exp_value) {
679
738
  std::string s;
680
- // uint128 can be streamed but not StrCat'd
681
739
  absl::strings_internal::OStringStream strm(&s);
682
740
  if (in_value >= 0) {
683
- strm << std::hex << in_value;
741
+ if constexpr (std::is_arithmetic<in_val_type>::value) {
742
+ absl::StrAppend(&s, absl::Hex(in_value));
743
+ } else {
744
+ // absl::Hex doesn't work with absl::(u)int128.
745
+ strm << std::hex << in_value;
746
+ }
684
747
  } else {
685
748
  // Inefficient for small integers, but works with all integral types.
686
749
  strm << "-" << std::hex << -absl::uint128(in_value);
@@ -698,10 +761,14 @@ void VerifySimpleHexAtoiGood(in_val_type in_value, int_type exp_value) {
698
761
  template <typename int_type, typename in_val_type>
699
762
  void VerifySimpleHexAtoiBad(in_val_type in_value) {
700
763
  std::string s;
701
- // uint128 can be streamed but not StrCat'd
702
764
  absl::strings_internal::OStringStream strm(&s);
703
765
  if (in_value >= 0) {
704
- strm << std::hex << in_value;
766
+ if constexpr (std::is_arithmetic<in_val_type>::value) {
767
+ absl::StrAppend(&s, absl::Hex(in_value));
768
+ } else {
769
+ // absl::Hex doesn't work with absl::(u)int128.
770
+ strm << std::hex << in_value;
771
+ }
705
772
  } else {
706
773
  // Inefficient for small integers, but works with all integral types.
707
774
  strm << "-" << std::hex << -absl::uint128(in_value);
@@ -713,6 +780,54 @@ void VerifySimpleHexAtoiBad(in_val_type in_value) {
713
780
  }
714
781
 
715
782
  TEST(NumbersTest, HexAtoi) {
783
+ // SimpleHexAtoi(absl::string_view, int8_t)
784
+ VerifySimpleHexAtoiGood<int8_t>(0, 0);
785
+ VerifySimpleHexAtoiGood<int8_t>(0x42, 0x42);
786
+ VerifySimpleHexAtoiGood<int8_t>(-0x42, -0x42);
787
+
788
+ VerifySimpleHexAtoiGood<int8_t>(std::numeric_limits<int8_t>::min(),
789
+ std::numeric_limits<int8_t>::min());
790
+ VerifySimpleHexAtoiGood<int8_t>(std::numeric_limits<int8_t>::max(),
791
+ std::numeric_limits<int8_t>::max());
792
+
793
+ // SimpleHexAtoi(absl::string_view, uint8_t)
794
+ VerifySimpleHexAtoiGood<uint8_t>(0, 0);
795
+ VerifySimpleHexAtoiGood<uint8_t>(0x42, 0x42);
796
+ VerifySimpleHexAtoiBad<uint8_t>(-0x42);
797
+
798
+ VerifySimpleHexAtoiBad<uint8_t>(std::numeric_limits<int8_t>::min());
799
+ VerifySimpleHexAtoiGood<uint8_t>(std::numeric_limits<int8_t>::max(),
800
+ std::numeric_limits<int8_t>::max());
801
+ VerifySimpleHexAtoiGood<uint8_t>(std::numeric_limits<uint8_t>::max(),
802
+ std::numeric_limits<uint8_t>::max());
803
+ VerifySimpleHexAtoiBad<uint8_t>(std::numeric_limits<int16_t>::min());
804
+ VerifySimpleHexAtoiBad<uint8_t>(std::numeric_limits<int16_t>::max());
805
+ VerifySimpleHexAtoiBad<uint8_t>(std::numeric_limits<uint16_t>::max());
806
+
807
+ // SimpleHexAtoi(absl::string_view, int16_t)
808
+ VerifySimpleHexAtoiGood<int16_t>(0, 0);
809
+ VerifySimpleHexAtoiGood<int16_t>(0x42, 0x42);
810
+ VerifySimpleHexAtoiGood<int16_t>(-0x42, -0x42);
811
+
812
+ VerifySimpleHexAtoiGood<int16_t>(std::numeric_limits<int16_t>::min(),
813
+ std::numeric_limits<int16_t>::min());
814
+ VerifySimpleHexAtoiGood<int16_t>(std::numeric_limits<int16_t>::max(),
815
+ std::numeric_limits<int16_t>::max());
816
+
817
+ // SimpleHexAtoi(absl::string_view, uint16_t)
818
+ VerifySimpleHexAtoiGood<uint16_t>(0, 0);
819
+ VerifySimpleHexAtoiGood<uint16_t>(0x42, 0x42);
820
+ VerifySimpleHexAtoiBad<uint16_t>(-0x42);
821
+
822
+ VerifySimpleHexAtoiBad<uint16_t>(std::numeric_limits<int16_t>::min());
823
+ VerifySimpleHexAtoiGood<uint16_t>(std::numeric_limits<int16_t>::max(),
824
+ std::numeric_limits<int16_t>::max());
825
+ VerifySimpleHexAtoiGood<uint16_t>(std::numeric_limits<uint16_t>::max(),
826
+ std::numeric_limits<uint16_t>::max());
827
+ VerifySimpleHexAtoiBad<uint16_t>(std::numeric_limits<int32_t>::min());
828
+ VerifySimpleHexAtoiBad<uint16_t>(std::numeric_limits<int32_t>::max());
829
+ VerifySimpleHexAtoiBad<uint16_t>(std::numeric_limits<uint32_t>::max());
830
+
716
831
  // SimpleHexAtoi(absl::string_view, int32_t)
717
832
  VerifySimpleHexAtoiGood<int32_t>(0, 0);
718
833
  VerifySimpleHexAtoiGood<int32_t>(0x42, 0x42);
@@ -790,6 +905,7 @@ TEST(NumbersTest, HexAtoi) {
790
905
  std::numeric_limits<absl::uint128>::max());
791
906
 
792
907
  // Some other types
908
+ VerifySimpleHexAtoiGood<short>(-0x42, -0x42); // NOLINT: runtime-int
793
909
  VerifySimpleHexAtoiGood<int>(-0x42, -0x42);
794
910
  VerifySimpleHexAtoiGood<int32_t>(-0x42, -0x42);
795
911
  VerifySimpleHexAtoiGood<uint32_t>(0x42, 0x42);
@@ -816,6 +932,154 @@ TEST(NumbersTest, HexAtoi) {
816
932
  EXPECT_EQ(0x34234324, value);
817
933
  }
818
934
 
935
+ TEST(stringtest, safe_strto8_base) {
936
+ int8_t value;
937
+ EXPECT_TRUE(safe_strto8_base("0x34", &value, 16));
938
+ EXPECT_EQ(0x34, value);
939
+
940
+ EXPECT_TRUE(safe_strto8_base("0X34", &value, 16));
941
+ EXPECT_EQ(0x34, value);
942
+
943
+ EXPECT_TRUE(safe_strto8_base("34", &value, 16));
944
+ EXPECT_EQ(0x34, value);
945
+
946
+ EXPECT_TRUE(safe_strto8_base("0", &value, 16));
947
+ EXPECT_EQ(0, value);
948
+
949
+ EXPECT_TRUE(safe_strto8_base(" \t\n -0x34", &value, 16));
950
+ EXPECT_EQ(-0x34, value);
951
+
952
+ EXPECT_TRUE(safe_strto8_base(" \t\n -34", &value, 16));
953
+ EXPECT_EQ(-0x34, value);
954
+
955
+ EXPECT_TRUE(safe_strto8_base("76", &value, 8));
956
+ EXPECT_EQ(076, value);
957
+
958
+ EXPECT_TRUE(safe_strto8_base("-0123", &value, 8));
959
+ EXPECT_EQ(-0123, value);
960
+
961
+ EXPECT_FALSE(safe_strto8_base("183", &value, 8));
962
+
963
+ // Autodetect base.
964
+ EXPECT_TRUE(safe_strto8_base("0", &value, 0));
965
+ EXPECT_EQ(0, value);
966
+
967
+ EXPECT_TRUE(safe_strto8_base("077", &value, 0));
968
+ EXPECT_EQ(077, value); // Octal interpretation
969
+
970
+ // Leading zero indicates octal, but then followed by invalid digit.
971
+ EXPECT_FALSE(safe_strto8_base("088", &value, 0));
972
+
973
+ // Leading 0x indicated hex, but then followed by invalid digit.
974
+ EXPECT_FALSE(safe_strto8_base("0xG", &value, 0));
975
+
976
+ // Base-10 version.
977
+ EXPECT_TRUE(safe_strto8_base("124", &value, 10));
978
+ EXPECT_EQ(124, value);
979
+
980
+ EXPECT_TRUE(safe_strto8_base("0", &value, 10));
981
+ EXPECT_EQ(0, value);
982
+
983
+ EXPECT_TRUE(safe_strto8_base(" \t\n -124", &value, 10));
984
+ EXPECT_EQ(-124, value);
985
+
986
+ EXPECT_TRUE(safe_strto8_base("124 \n\t ", &value, 10));
987
+ EXPECT_EQ(124, value);
988
+
989
+ // Invalid ints.
990
+ EXPECT_FALSE(safe_strto8_base("", &value, 10));
991
+ EXPECT_FALSE(safe_strto8_base(" ", &value, 10));
992
+ EXPECT_FALSE(safe_strto8_base("abc", &value, 10));
993
+ EXPECT_FALSE(safe_strto8_base("34a", &value, 10));
994
+ EXPECT_FALSE(safe_strto8_base("34.3", &value, 10));
995
+
996
+ // Out of bounds.
997
+ EXPECT_FALSE(safe_strto8_base("128", &value, 10));
998
+ EXPECT_FALSE(safe_strto8_base("-129", &value, 10));
999
+
1000
+ // String version.
1001
+ EXPECT_TRUE(safe_strto8_base(std::string("0x12"), &value, 16));
1002
+ EXPECT_EQ(0x12, value);
1003
+
1004
+ // Base-10 string version.
1005
+ EXPECT_TRUE(safe_strto8_base("123", &value, 10));
1006
+ EXPECT_EQ(123, value);
1007
+ }
1008
+
1009
+ TEST(stringtest, safe_strto16_base) {
1010
+ int16_t value;
1011
+ EXPECT_TRUE(safe_strto16_base("0x3423", &value, 16));
1012
+ EXPECT_EQ(0x3423, value);
1013
+
1014
+ EXPECT_TRUE(safe_strto16_base("0X3423", &value, 16));
1015
+ EXPECT_EQ(0x3423, value);
1016
+
1017
+ EXPECT_TRUE(safe_strto16_base("3423", &value, 16));
1018
+ EXPECT_EQ(0x3423, value);
1019
+
1020
+ EXPECT_TRUE(safe_strto16_base("0", &value, 16));
1021
+ EXPECT_EQ(0, value);
1022
+
1023
+ EXPECT_TRUE(safe_strto16_base(" \t\n -0x3423", &value, 16));
1024
+ EXPECT_EQ(-0x3423, value);
1025
+
1026
+ EXPECT_TRUE(safe_strto16_base(" \t\n -3423", &value, 16));
1027
+ EXPECT_EQ(-0x3423, value);
1028
+
1029
+ EXPECT_TRUE(safe_strto16_base("34567", &value, 8));
1030
+ EXPECT_EQ(034567, value);
1031
+
1032
+ EXPECT_TRUE(safe_strto16_base("-01234", &value, 8));
1033
+ EXPECT_EQ(-01234, value);
1034
+
1035
+ EXPECT_FALSE(safe_strto16_base("1834", &value, 8));
1036
+
1037
+ // Autodetect base.
1038
+ EXPECT_TRUE(safe_strto16_base("0", &value, 0));
1039
+ EXPECT_EQ(0, value);
1040
+
1041
+ EXPECT_TRUE(safe_strto16_base("077", &value, 0));
1042
+ EXPECT_EQ(077, value); // Octal interpretation
1043
+
1044
+ // Leading zero indicates octal, but then followed by invalid digit.
1045
+ EXPECT_FALSE(safe_strto16_base("088", &value, 0));
1046
+
1047
+ // Leading 0x indicated hex, but then followed by invalid digit.
1048
+ EXPECT_FALSE(safe_strto16_base("0xG", &value, 0));
1049
+
1050
+ // Base-10 version.
1051
+ EXPECT_TRUE(safe_strto16_base("3423", &value, 10));
1052
+ EXPECT_EQ(3423, value);
1053
+
1054
+ EXPECT_TRUE(safe_strto16_base("0", &value, 10));
1055
+ EXPECT_EQ(0, value);
1056
+
1057
+ EXPECT_TRUE(safe_strto16_base(" \t\n -3423", &value, 10));
1058
+ EXPECT_EQ(-3423, value);
1059
+
1060
+ EXPECT_TRUE(safe_strto16_base("3423 \n\t ", &value, 10));
1061
+ EXPECT_EQ(3423, value);
1062
+
1063
+ // Invalid ints.
1064
+ EXPECT_FALSE(safe_strto16_base("", &value, 10));
1065
+ EXPECT_FALSE(safe_strto16_base(" ", &value, 10));
1066
+ EXPECT_FALSE(safe_strto16_base("abc", &value, 10));
1067
+ EXPECT_FALSE(safe_strto16_base("324a", &value, 10));
1068
+ EXPECT_FALSE(safe_strto16_base("4234.3", &value, 10));
1069
+
1070
+ // Out of bounds.
1071
+ EXPECT_FALSE(safe_strto16_base("32768", &value, 10));
1072
+ EXPECT_FALSE(safe_strto16_base("-32769", &value, 10));
1073
+
1074
+ // String version.
1075
+ EXPECT_TRUE(safe_strto16_base(std::string("0x1234"), &value, 16));
1076
+ EXPECT_EQ(0x1234, value);
1077
+
1078
+ // Base-10 string version.
1079
+ EXPECT_TRUE(safe_strto16_base("1234", &value, 10));
1080
+ EXPECT_EQ(1234, value);
1081
+ }
1082
+
819
1083
  TEST(stringtest, safe_strto32_base) {
820
1084
  int32_t value;
821
1085
  EXPECT_TRUE(safe_strto32_base("0x34234324", &value, 16));
@@ -890,76 +1154,6 @@ TEST(stringtest, safe_strto32_base) {
890
1154
  EXPECT_EQ(1234, value);
891
1155
  }
892
1156
 
893
- TEST(stringtest, safe_strto32_range) {
894
- // These tests verify underflow/overflow behaviour.
895
- int32_t value;
896
- EXPECT_FALSE(safe_strto32_base("2147483648", &value, 10));
897
- EXPECT_EQ(std::numeric_limits<int32_t>::max(), value);
898
-
899
- EXPECT_TRUE(safe_strto32_base("-2147483648", &value, 10));
900
- EXPECT_EQ(std::numeric_limits<int32_t>::min(), value);
901
-
902
- EXPECT_FALSE(safe_strto32_base("-2147483649", &value, 10));
903
- EXPECT_EQ(std::numeric_limits<int32_t>::min(), value);
904
- }
905
-
906
- TEST(stringtest, safe_strto64_range) {
907
- // These tests verify underflow/overflow behaviour.
908
- int64_t value;
909
- EXPECT_FALSE(safe_strto64_base("9223372036854775808", &value, 10));
910
- EXPECT_EQ(std::numeric_limits<int64_t>::max(), value);
911
-
912
- EXPECT_TRUE(safe_strto64_base("-9223372036854775808", &value, 10));
913
- EXPECT_EQ(std::numeric_limits<int64_t>::min(), value);
914
-
915
- EXPECT_FALSE(safe_strto64_base("-9223372036854775809", &value, 10));
916
- EXPECT_EQ(std::numeric_limits<int64_t>::min(), value);
917
- }
918
-
919
- TEST(stringtest, safe_strto32_leading_substring) {
920
- // These tests verify this comment in numbers.h:
921
- // On error, returns false, and sets *value to: [...]
922
- // conversion of leading substring if available ("123@@@" -> 123)
923
- // 0 if no leading substring available
924
- int32_t value;
925
- EXPECT_FALSE(safe_strto32_base("04069@@@", &value, 10));
926
- EXPECT_EQ(4069, value);
927
-
928
- EXPECT_FALSE(safe_strto32_base("04069@@@", &value, 8));
929
- EXPECT_EQ(0406, value);
930
-
931
- EXPECT_FALSE(safe_strto32_base("04069balloons", &value, 10));
932
- EXPECT_EQ(4069, value);
933
-
934
- EXPECT_FALSE(safe_strto32_base("04069balloons", &value, 16));
935
- EXPECT_EQ(0x4069ba, value);
936
-
937
- EXPECT_FALSE(safe_strto32_base("@@@", &value, 10));
938
- EXPECT_EQ(0, value); // there was no leading substring
939
- }
940
-
941
- TEST(stringtest, safe_strto64_leading_substring) {
942
- // These tests verify this comment in numbers.h:
943
- // On error, returns false, and sets *value to: [...]
944
- // conversion of leading substring if available ("123@@@" -> 123)
945
- // 0 if no leading substring available
946
- int64_t value;
947
- EXPECT_FALSE(safe_strto64_base("04069@@@", &value, 10));
948
- EXPECT_EQ(4069, value);
949
-
950
- EXPECT_FALSE(safe_strto64_base("04069@@@", &value, 8));
951
- EXPECT_EQ(0406, value);
952
-
953
- EXPECT_FALSE(safe_strto64_base("04069balloons", &value, 10));
954
- EXPECT_EQ(4069, value);
955
-
956
- EXPECT_FALSE(safe_strto64_base("04069balloons", &value, 16));
957
- EXPECT_EQ(0x4069ba, value);
958
-
959
- EXPECT_FALSE(safe_strto64_base("@@@", &value, 10));
960
- EXPECT_EQ(0, value); // there was no leading substring
961
- }
962
-
963
1157
  TEST(stringtest, safe_strto64_base) {
964
1158
  int64_t value;
965
1159
  EXPECT_TRUE(safe_strto64_base("0x3423432448783446", &value, 16));
@@ -1031,18 +1225,155 @@ TEST(stringtest, safe_strto64_base) {
1031
1225
  EXPECT_EQ(1234, value);
1032
1226
  }
1033
1227
 
1228
+ TEST(stringtest, safe_strto8_range) {
1229
+ // These tests verify underflow/overflow behaviour.
1230
+ int8_t value;
1231
+ EXPECT_FALSE(safe_strto8_base("128", &value, 10));
1232
+ EXPECT_EQ(std::numeric_limits<int8_t>::max(), value);
1233
+
1234
+ EXPECT_TRUE(safe_strto8_base("-128", &value, 10));
1235
+ EXPECT_EQ(std::numeric_limits<int8_t>::min(), value);
1236
+
1237
+ EXPECT_FALSE(safe_strto8_base("-129", &value, 10));
1238
+ EXPECT_EQ(std::numeric_limits<int8_t>::min(), value);
1239
+ }
1240
+
1241
+ TEST(stringtest, safe_strto16_range) {
1242
+ // These tests verify underflow/overflow behaviour.
1243
+ int16_t value;
1244
+ EXPECT_FALSE(safe_strto16_base("32768", &value, 10));
1245
+ EXPECT_EQ(std::numeric_limits<int16_t>::max(), value);
1246
+
1247
+ EXPECT_TRUE(safe_strto16_base("-32768", &value, 10));
1248
+ EXPECT_EQ(std::numeric_limits<int16_t>::min(), value);
1249
+
1250
+ EXPECT_FALSE(safe_strto16_base("-32769", &value, 10));
1251
+ EXPECT_EQ(std::numeric_limits<int16_t>::min(), value);
1252
+ }
1253
+
1254
+ TEST(stringtest, safe_strto32_range) {
1255
+ // These tests verify underflow/overflow behaviour.
1256
+ int32_t value;
1257
+ EXPECT_FALSE(safe_strto32_base("2147483648", &value, 10));
1258
+ EXPECT_EQ(std::numeric_limits<int32_t>::max(), value);
1259
+
1260
+ EXPECT_TRUE(safe_strto32_base("-2147483648", &value, 10));
1261
+ EXPECT_EQ(std::numeric_limits<int32_t>::min(), value);
1262
+
1263
+ EXPECT_FALSE(safe_strto32_base("-2147483649", &value, 10));
1264
+ EXPECT_EQ(std::numeric_limits<int32_t>::min(), value);
1265
+ }
1266
+
1267
+ TEST(stringtest, safe_strto64_range) {
1268
+ // These tests verify underflow/overflow behaviour.
1269
+ int64_t value;
1270
+ EXPECT_FALSE(safe_strto64_base("9223372036854775808", &value, 10));
1271
+ EXPECT_EQ(std::numeric_limits<int64_t>::max(), value);
1272
+
1273
+ EXPECT_TRUE(safe_strto64_base("-9223372036854775808", &value, 10));
1274
+ EXPECT_EQ(std::numeric_limits<int64_t>::min(), value);
1275
+
1276
+ EXPECT_FALSE(safe_strto64_base("-9223372036854775809", &value, 10));
1277
+ EXPECT_EQ(std::numeric_limits<int64_t>::min(), value);
1278
+ }
1279
+
1280
+ TEST(stringtest, safe_strto8_leading_substring) {
1281
+ // These tests verify this comment in numbers.h:
1282
+ // On error, returns false, and sets *value to: [...]
1283
+ // conversion of leading substring if available ("123@@@" -> 123)
1284
+ // 0 if no leading substring available
1285
+ int8_t value;
1286
+ EXPECT_FALSE(safe_strto8_base("069@@@", &value, 10));
1287
+ EXPECT_EQ(69, value);
1288
+
1289
+ EXPECT_FALSE(safe_strto8_base("01769@@@", &value, 8));
1290
+ EXPECT_EQ(0176, value);
1291
+
1292
+ EXPECT_FALSE(safe_strto8_base("069balloons", &value, 10));
1293
+ EXPECT_EQ(69, value);
1294
+
1295
+ EXPECT_FALSE(safe_strto8_base("07bland", &value, 16));
1296
+ EXPECT_EQ(0x7b, value);
1297
+
1298
+ EXPECT_FALSE(safe_strto8_base("@@@", &value, 10));
1299
+ EXPECT_EQ(0, value); // there was no leading substring
1300
+ }
1301
+
1302
+ TEST(stringtest, safe_strto16_leading_substring) {
1303
+ // These tests verify this comment in numbers.h:
1304
+ // On error, returns false, and sets *value to: [...]
1305
+ // conversion of leading substring if available ("123@@@" -> 123)
1306
+ // 0 if no leading substring available
1307
+ int16_t value;
1308
+ EXPECT_FALSE(safe_strto16_base("04069@@@", &value, 10));
1309
+ EXPECT_EQ(4069, value);
1310
+
1311
+ EXPECT_FALSE(safe_strto16_base("04069@@@", &value, 8));
1312
+ EXPECT_EQ(0406, value);
1313
+
1314
+ EXPECT_FALSE(safe_strto16_base("04069balloons", &value, 10));
1315
+ EXPECT_EQ(4069, value);
1316
+
1317
+ EXPECT_FALSE(safe_strto16_base("069balloons", &value, 16));
1318
+ EXPECT_EQ(0x69ba, value);
1319
+
1320
+ EXPECT_FALSE(safe_strto16_base("@@@", &value, 10));
1321
+ EXPECT_EQ(0, value); // there was no leading substring
1322
+ }
1323
+
1324
+ TEST(stringtest, safe_strto32_leading_substring) {
1325
+ // These tests verify this comment in numbers.h:
1326
+ // On error, returns false, and sets *value to: [...]
1327
+ // conversion of leading substring if available ("123@@@" -> 123)
1328
+ // 0 if no leading substring available
1329
+ int32_t value;
1330
+ EXPECT_FALSE(safe_strto32_base("04069@@@", &value, 10));
1331
+ EXPECT_EQ(4069, value);
1332
+
1333
+ EXPECT_FALSE(safe_strto32_base("04069@@@", &value, 8));
1334
+ EXPECT_EQ(0406, value);
1335
+
1336
+ EXPECT_FALSE(safe_strto32_base("04069balloons", &value, 10));
1337
+ EXPECT_EQ(4069, value);
1338
+
1339
+ EXPECT_FALSE(safe_strto32_base("04069balloons", &value, 16));
1340
+ EXPECT_EQ(0x4069ba, value);
1341
+
1342
+ EXPECT_FALSE(safe_strto32_base("@@@", &value, 10));
1343
+ EXPECT_EQ(0, value); // there was no leading substring
1344
+ }
1345
+
1346
+ TEST(stringtest, safe_strto64_leading_substring) {
1347
+ // These tests verify this comment in numbers.h:
1348
+ // On error, returns false, and sets *value to: [...]
1349
+ // conversion of leading substring if available ("123@@@" -> 123)
1350
+ // 0 if no leading substring available
1351
+ int64_t value;
1352
+ EXPECT_FALSE(safe_strto64_base("04069@@@", &value, 10));
1353
+ EXPECT_EQ(4069, value);
1354
+
1355
+ EXPECT_FALSE(safe_strto64_base("04069@@@", &value, 8));
1356
+ EXPECT_EQ(0406, value);
1357
+
1358
+ EXPECT_FALSE(safe_strto64_base("04069balloons", &value, 10));
1359
+ EXPECT_EQ(4069, value);
1360
+
1361
+ EXPECT_FALSE(safe_strto64_base("04069balloons", &value, 16));
1362
+ EXPECT_EQ(0x4069ba, value);
1363
+
1364
+ EXPECT_FALSE(safe_strto64_base("@@@", &value, 10));
1365
+ EXPECT_EQ(0, value); // there was no leading substring
1366
+ }
1367
+
1034
1368
  const size_t kNumRandomTests = 10000;
1035
1369
 
1036
- template <typename IntType>
1037
- void test_random_integer_parse_base(bool (*parse_func)(absl::string_view,
1038
- IntType* value,
1039
- int base)) {
1040
- using RandomEngine = std::minstd_rand0;
1041
- std::random_device rd;
1042
- RandomEngine rng(rd());
1370
+ template <typename IntType,
1371
+ bool parse_func(absl::string_view, IntType* value, int base)>
1372
+ void test_random_integer_parse_base() {
1373
+ absl::InsecureBitGen rng;
1043
1374
  std::uniform_int_distribution<IntType> random_int(
1044
1375
  std::numeric_limits<IntType>::min());
1045
- std::uniform_int_distribution<int> random_base(2, 35);
1376
+ std::uniform_int_distribution<int> random_base(2, 36);
1046
1377
  for (size_t i = 0; i < kNumRandomTests; i++) {
1047
1378
  IntType value = random_int(rng);
1048
1379
  int base = random_base(rng);
@@ -1070,33 +1401,36 @@ void test_random_integer_parse_base(bool (*parse_func)(absl::string_view,
1070
1401
  }
1071
1402
  }
1072
1403
 
1404
+ TEST(stringtest, safe_strto16_random) {
1405
+ test_random_integer_parse_base<int16_t, safe_strto16_base>();
1406
+ }
1073
1407
  TEST(stringtest, safe_strto32_random) {
1074
- test_random_integer_parse_base<int32_t>(&safe_strto32_base);
1408
+ test_random_integer_parse_base<int32_t, safe_strto32_base>();
1075
1409
  }
1076
1410
  TEST(stringtest, safe_strto64_random) {
1077
- test_random_integer_parse_base<int64_t>(&safe_strto64_base);
1411
+ test_random_integer_parse_base<int64_t, safe_strto64_base>();
1412
+ }
1413
+ TEST(stringtest, safe_strtou16_random) {
1414
+ test_random_integer_parse_base<uint16_t, safe_strtou16_base>();
1078
1415
  }
1079
1416
  TEST(stringtest, safe_strtou32_random) {
1080
- test_random_integer_parse_base<uint32_t>(&safe_strtou32_base);
1417
+ test_random_integer_parse_base<uint32_t, safe_strtou32_base>();
1081
1418
  }
1082
1419
  TEST(stringtest, safe_strtou64_random) {
1083
- test_random_integer_parse_base<uint64_t>(&safe_strtou64_base);
1420
+ test_random_integer_parse_base<uint64_t, safe_strtou64_base>();
1084
1421
  }
1085
1422
  TEST(stringtest, safe_strtou128_random) {
1086
- // random number generators don't work for uint128, and
1087
- // uint128 can be streamed but not StrCat'd, so this code must be custom
1423
+ // random number generators don't work for uint128 so this code must be custom
1088
1424
  // implemented for uint128, but is generally the same as what's above.
1089
1425
  // test_random_integer_parse_base<absl::uint128>(
1090
1426
  // &absl::numbers_internal::safe_strtou128_base);
1091
- using RandomEngine = std::minstd_rand0;
1092
1427
  using IntType = absl::uint128;
1093
1428
  constexpr auto parse_func = &absl::numbers_internal::safe_strtou128_base;
1094
1429
 
1095
- std::random_device rd;
1096
- RandomEngine rng(rd());
1430
+ absl::InsecureBitGen rng;
1097
1431
  std::uniform_int_distribution<uint64_t> random_uint64(
1098
1432
  std::numeric_limits<uint64_t>::min());
1099
- std::uniform_int_distribution<int> random_base(2, 35);
1433
+ std::uniform_int_distribution<int> random_base(2, 36);
1100
1434
 
1101
1435
  for (size_t i = 0; i < kNumRandomTests; i++) {
1102
1436
  IntType value = random_uint64(rng);
@@ -1111,34 +1445,28 @@ TEST(stringtest, safe_strtou128_random) {
1111
1445
  EXPECT_EQ(parsed_value, value);
1112
1446
 
1113
1447
  // Test overflow
1114
- std::string s;
1115
- absl::strings_internal::OStringStream(&s)
1116
- << std::numeric_limits<IntType>::max() << value;
1117
- EXPECT_FALSE(parse_func(s, &parsed_value, base));
1448
+ EXPECT_FALSE(
1449
+ parse_func(absl::StrCat(std::numeric_limits<IntType>::max(), value),
1450
+ &parsed_value, base));
1118
1451
 
1119
1452
  // Test underflow
1120
- s.clear();
1121
- absl::strings_internal::OStringStream(&s) << "-" << value;
1122
- EXPECT_FALSE(parse_func(s, &parsed_value, base));
1453
+ EXPECT_FALSE(parse_func(absl::StrCat("-", value), &parsed_value, base));
1123
1454
  }
1124
1455
  }
1125
1456
  TEST(stringtest, safe_strto128_random) {
1126
- // random number generators don't work for int128, and
1127
- // int128 can be streamed but not StrCat'd, so this code must be custom
1457
+ // random number generators don't work for int128 so this code must be custom
1128
1458
  // implemented for int128, but is generally the same as what's above.
1129
1459
  // test_random_integer_parse_base<absl::int128>(
1130
1460
  // &absl::numbers_internal::safe_strto128_base);
1131
- using RandomEngine = std::minstd_rand0;
1132
1461
  using IntType = absl::int128;
1133
1462
  constexpr auto parse_func = &absl::numbers_internal::safe_strto128_base;
1134
1463
 
1135
- std::random_device rd;
1136
- RandomEngine rng(rd());
1464
+ absl::InsecureBitGen rng;
1137
1465
  std::uniform_int_distribution<int64_t> random_int64(
1138
1466
  std::numeric_limits<int64_t>::min());
1139
1467
  std::uniform_int_distribution<uint64_t> random_uint64(
1140
1468
  std::numeric_limits<uint64_t>::min());
1141
- std::uniform_int_distribution<int> random_base(2, 35);
1469
+ std::uniform_int_distribution<int> random_base(2, 36);
1142
1470
 
1143
1471
  for (size_t i = 0; i < kNumRandomTests; ++i) {
1144
1472
  int64_t high = random_int64(rng);
@@ -1155,16 +1483,70 @@ TEST(stringtest, safe_strto128_random) {
1155
1483
  EXPECT_EQ(parsed_value, value);
1156
1484
 
1157
1485
  // Test overflow
1158
- std::string s;
1159
- absl::strings_internal::OStringStream(&s)
1160
- << std::numeric_limits<IntType>::max() << value;
1161
- EXPECT_FALSE(parse_func(s, &parsed_value, base));
1486
+ EXPECT_FALSE(
1487
+ parse_func(absl::StrCat(std::numeric_limits<IntType>::max(), value),
1488
+ &parsed_value, base));
1162
1489
 
1163
1490
  // Test underflow
1164
- s.clear();
1165
- absl::strings_internal::OStringStream(&s)
1166
- << std::numeric_limits<IntType>::min() << value;
1167
- EXPECT_FALSE(parse_func(s, &parsed_value, base));
1491
+ EXPECT_FALSE(
1492
+ parse_func(absl::StrCat(std::numeric_limits<IntType>::min(), value),
1493
+ &parsed_value, base));
1494
+ }
1495
+ }
1496
+
1497
+ TEST(stringtest, safe_strtou8_exhaustive) {
1498
+ // Testing the entire space for uint8_t since it is small.
1499
+ using IntType = uint8_t;
1500
+ constexpr auto parse_func = &absl::numbers_internal::safe_strtou8_base;
1501
+
1502
+ for (int i = std::numeric_limits<IntType>::min();
1503
+ i <= std::numeric_limits<IntType>::max(); i++) {
1504
+ IntType value = static_cast<IntType>(i);
1505
+ for (int base = 2; base <= 36; base++) {
1506
+ std::string str_value;
1507
+ EXPECT_TRUE(Itoa<IntType>(value, base, &str_value));
1508
+ IntType parsed_value;
1509
+
1510
+ // Test successful parse
1511
+ EXPECT_TRUE(parse_func(str_value, &parsed_value, base));
1512
+ EXPECT_EQ(parsed_value, value);
1513
+
1514
+ // Test overflow
1515
+ EXPECT_FALSE(
1516
+ parse_func(absl::StrCat(std::numeric_limits<IntType>::max(), value),
1517
+ &parsed_value, base));
1518
+ // Test underflow
1519
+ EXPECT_FALSE(parse_func(absl::StrCat("-", value), &parsed_value, base));
1520
+ }
1521
+ }
1522
+ }
1523
+
1524
+ TEST(stringtest, safe_strto8_exhaustive) {
1525
+ // Testing the entire space for int8_t since it is small.
1526
+ using IntType = int8_t;
1527
+ constexpr auto parse_func = &absl::numbers_internal::safe_strto8_base;
1528
+
1529
+ for (int i = std::numeric_limits<IntType>::min();
1530
+ i <= std::numeric_limits<IntType>::max(); i++) {
1531
+ IntType value = static_cast<IntType>(i);
1532
+ for (int base = 2; base <= 36; base++) {
1533
+ std::string str_value;
1534
+ EXPECT_TRUE(Itoa<IntType>(value, base, &str_value));
1535
+ IntType parsed_value;
1536
+
1537
+ // Test successful parse
1538
+ EXPECT_TRUE(parse_func(str_value, &parsed_value, base));
1539
+ EXPECT_EQ(parsed_value, value);
1540
+
1541
+ // Test overflow
1542
+ EXPECT_FALSE(
1543
+ parse_func(absl::StrCat(std::numeric_limits<IntType>::max(), value),
1544
+ &parsed_value, base));
1545
+ // Test underflow
1546
+ EXPECT_FALSE(
1547
+ parse_func(absl::StrCat(std::numeric_limits<IntType>::min(), value),
1548
+ &parsed_value, base));
1549
+ }
1168
1550
  }
1169
1551
  }
1170
1552
 
@@ -1434,6 +1816,134 @@ TEST_F(SimpleDtoaTest, ExhaustiveDoubleToSixDigits) {
1434
1816
  }
1435
1817
  }
1436
1818
 
1819
+ TEST(StrToInt8, Partial) {
1820
+ struct Int8TestLine {
1821
+ std::string input;
1822
+ bool status;
1823
+ int8_t value;
1824
+ };
1825
+ const int8_t int8_min = std::numeric_limits<int8_t>::min();
1826
+ const int8_t int8_max = std::numeric_limits<int8_t>::max();
1827
+ Int8TestLine int8_test_line[] = {
1828
+ {"", false, 0},
1829
+ {" ", false, 0},
1830
+ {"-", false, 0},
1831
+ {"123@@@", false, 123},
1832
+ {absl::StrCat(int8_min, int8_max), false, int8_min},
1833
+ {absl::StrCat(int8_max, int8_max), false, int8_max},
1834
+ };
1835
+
1836
+ for (const Int8TestLine& test_line : int8_test_line) {
1837
+ int8_t value = -2;
1838
+ bool status = safe_strto8_base(test_line.input, &value, 10);
1839
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1840
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1841
+ value = -2;
1842
+ status = safe_strto8_base(test_line.input, &value, 10);
1843
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1844
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1845
+ value = -2;
1846
+ status = safe_strto8_base(absl::string_view(test_line.input), &value, 10);
1847
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1848
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1849
+ }
1850
+ }
1851
+
1852
+ TEST(StrToUint8, Partial) {
1853
+ struct Uint8TestLine {
1854
+ std::string input;
1855
+ bool status;
1856
+ uint8_t value;
1857
+ };
1858
+ const uint8_t uint8_max = std::numeric_limits<uint8_t>::max();
1859
+ Uint8TestLine uint8_test_line[] = {
1860
+ {"", false, 0},
1861
+ {" ", false, 0},
1862
+ {"-", false, 0},
1863
+ {"123@@@", false, 123},
1864
+ {absl::StrCat(uint8_max, uint8_max), false, uint8_max},
1865
+ };
1866
+
1867
+ for (const Uint8TestLine& test_line : uint8_test_line) {
1868
+ uint8_t value = 2;
1869
+ bool status = safe_strtou8_base(test_line.input, &value, 10);
1870
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1871
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1872
+ value = 2;
1873
+ status = safe_strtou8_base(test_line.input, &value, 10);
1874
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1875
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1876
+ value = 2;
1877
+ status = safe_strtou8_base(absl::string_view(test_line.input), &value, 10);
1878
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1879
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1880
+ }
1881
+ }
1882
+
1883
+ TEST(StrToInt16, Partial) {
1884
+ struct Int16TestLine {
1885
+ std::string input;
1886
+ bool status;
1887
+ int16_t value;
1888
+ };
1889
+ const int16_t int16_min = std::numeric_limits<int16_t>::min();
1890
+ const int16_t int16_max = std::numeric_limits<int16_t>::max();
1891
+ Int16TestLine int16_test_line[] = {
1892
+ {"", false, 0},
1893
+ {" ", false, 0},
1894
+ {"-", false, 0},
1895
+ {"123@@@", false, 123},
1896
+ {absl::StrCat(int16_min, int16_max), false, int16_min},
1897
+ {absl::StrCat(int16_max, int16_max), false, int16_max},
1898
+ };
1899
+
1900
+ for (const Int16TestLine& test_line : int16_test_line) {
1901
+ int16_t value = -2;
1902
+ bool status = safe_strto16_base(test_line.input, &value, 10);
1903
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1904
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1905
+ value = -2;
1906
+ status = safe_strto16_base(test_line.input, &value, 10);
1907
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1908
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1909
+ value = -2;
1910
+ status = safe_strto16_base(absl::string_view(test_line.input), &value, 10);
1911
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1912
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1913
+ }
1914
+ }
1915
+
1916
+ TEST(StrToUint16, Partial) {
1917
+ struct Uint16TestLine {
1918
+ std::string input;
1919
+ bool status;
1920
+ uint16_t value;
1921
+ };
1922
+ const uint16_t uint16_max = std::numeric_limits<uint16_t>::max();
1923
+ Uint16TestLine uint16_test_line[] = {
1924
+ {"", false, 0},
1925
+ {" ", false, 0},
1926
+ {"-", false, 0},
1927
+ {"123@@@", false, 123},
1928
+ {absl::StrCat(uint16_max, uint16_max), false, uint16_max},
1929
+ };
1930
+
1931
+ for (const Uint16TestLine& test_line : uint16_test_line) {
1932
+ uint16_t value = 2;
1933
+ bool status = safe_strtou16_base(test_line.input, &value, 10);
1934
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1935
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1936
+ value = 2;
1937
+ status = safe_strtou16_base(test_line.input, &value, 10);
1938
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1939
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1940
+ value = 2;
1941
+ status = safe_strtou16_base(absl::string_view(test_line.input), &value, 10);
1942
+ EXPECT_EQ(test_line.status, status) << test_line.input;
1943
+ EXPECT_EQ(test_line.value, value) << test_line.input;
1944
+ }
1945
+ }
1946
+
1437
1947
  TEST(StrToInt32, Partial) {
1438
1948
  struct Int32TestLine {
1439
1949
  std::string input;
@@ -1731,6 +2241,10 @@ void ExpectWritesNull() {
1731
2241
  }
1732
2242
 
1733
2243
  TEST(FastIntToBuffer, WritesNull) {
2244
+ ExpectWritesNull<int8_t>();
2245
+ ExpectWritesNull<uint8_t>();
2246
+ ExpectWritesNull<int16_t>();
2247
+ ExpectWritesNull<uint16_t>();
1734
2248
  ExpectWritesNull<int32_t>();
1735
2249
  ExpectWritesNull<uint32_t>();
1736
2250
  ExpectWritesNull<int64_t>();