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
@@ -93,7 +93,7 @@ class BadStatusOrAccess : public std::exception {
93
93
  //
94
94
  // The pointer of this string is guaranteed to be valid until any non-const
95
95
  // function is invoked on the exception object.
96
- absl::Nonnull<const char*> what() const noexcept override;
96
+ const char* absl_nonnull what() const noexcept override;
97
97
 
98
98
  // BadStatusOrAccess::status()
99
99
  //
@@ -189,14 +189,22 @@ class ABSL_MUST_USE_RESULT StatusOr;
189
189
  // return Foo(arg);
190
190
  // }
191
191
  template <typename T>
192
- class StatusOr : private internal_statusor::StatusOrData<T>,
192
+ class StatusOr : private internal_statusor::OperatorBase<T>,
193
+ private internal_statusor::StatusOrData<T>,
193
194
  private internal_statusor::CopyCtorBase<T>,
194
195
  private internal_statusor::MoveCtorBase<T>,
195
196
  private internal_statusor::CopyAssignBase<T>,
196
197
  private internal_statusor::MoveAssignBase<T> {
198
+ #ifndef SWIG
199
+ static_assert(!std::is_rvalue_reference_v<T>,
200
+ "rvalue references are not yet supported.");
201
+ #endif // SWIG
202
+
197
203
  template <typename U>
198
204
  friend class StatusOr;
199
205
 
206
+ friend internal_statusor::OperatorBase<T>;
207
+
200
208
  typedef internal_statusor::StatusOrData<T> Base;
201
209
 
202
210
  public:
@@ -397,7 +405,7 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
397
405
  typename std::enable_if<
398
406
  internal_statusor::IsAssignmentValid<T, U, true>::value,
399
407
  int>::type = 0>
400
- StatusOr& operator=(U&& v ABSL_ATTRIBUTE_LIFETIME_BOUND) {
408
+ StatusOr& operator=(U&& v ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)) {
401
409
  this->Assign(std::forward<U>(v));
402
410
  return *this;
403
411
  }
@@ -464,7 +472,7 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
464
472
  // Returns a reference to the current `absl::Status` contained within the
465
473
  // `absl::StatusOr<T>`. If `absl::StatusOr<T>` contains a `T`, then this
466
474
  // function returns `absl::OkStatus()`.
467
- const Status& status() const&;
475
+ ABSL_MUST_USE_RESULT const Status& status() const&;
468
476
  Status status() &&;
469
477
 
470
478
  // StatusOr<T>::value()
@@ -493,10 +501,7 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
493
501
  //
494
502
  // The `std::move` on statusor instead of on the whole expression enables
495
503
  // warnings about possible uses of the statusor object after the move.
496
- const T& value() const& ABSL_ATTRIBUTE_LIFETIME_BOUND;
497
- T& value() & ABSL_ATTRIBUTE_LIFETIME_BOUND;
498
- const T&& value() const&& ABSL_ATTRIBUTE_LIFETIME_BOUND;
499
- T&& value() && ABSL_ATTRIBUTE_LIFETIME_BOUND;
504
+ using StatusOr::OperatorBase::value;
500
505
 
501
506
  // StatusOr<T>:: operator*()
502
507
  //
@@ -508,10 +513,7 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
508
513
  // `absl::StatusOr<T>`. Alternatively, see the `value()` member function for a
509
514
  // similar API that guarantees crashing or throwing an exception if there is
510
515
  // no current value.
511
- const T& operator*() const& ABSL_ATTRIBUTE_LIFETIME_BOUND;
512
- T& operator*() & ABSL_ATTRIBUTE_LIFETIME_BOUND;
513
- const T&& operator*() const&& ABSL_ATTRIBUTE_LIFETIME_BOUND;
514
- T&& operator*() && ABSL_ATTRIBUTE_LIFETIME_BOUND;
516
+ using StatusOr::OperatorBase::operator*;
515
517
 
516
518
  // StatusOr<T>::operator->()
517
519
  //
@@ -520,8 +522,7 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
520
522
  // REQUIRES: `this->ok() == true`, otherwise the behavior is undefined.
521
523
  //
522
524
  // Use `this->ok()` to verify that there is a current value.
523
- const T* operator->() const ABSL_ATTRIBUTE_LIFETIME_BOUND;
524
- T* operator->() ABSL_ATTRIBUTE_LIFETIME_BOUND;
525
+ using StatusOr::OperatorBase::operator->;
525
526
 
526
527
  // StatusOr<T>::value_or()
527
528
  //
@@ -536,10 +537,34 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
536
537
  //
537
538
  // Unlike with `value`, calling `std::move()` on the result of `value_or` will
538
539
  // still trigger a copy.
539
- template <typename U>
540
- T value_or(U&& default_value) const&;
541
- template <typename U>
542
- T value_or(U&& default_value) &&;
540
+ template <
541
+ typename U,
542
+ std::enable_if_t<internal_statusor::IsValueOrValid<T, U&&, false>::value,
543
+ int> = 0>
544
+ T value_or(U&& default_value) const& {
545
+ return this->ValueOrImpl(std::forward<U>(default_value));
546
+ }
547
+ template <
548
+ typename U,
549
+ std::enable_if_t<internal_statusor::IsValueOrValid<T, U&&, false>::value,
550
+ int> = 0>
551
+ T value_or(U&& default_value) && {
552
+ return std::move(*this).ValueOrImpl(std::forward<U>(default_value));
553
+ }
554
+ template <
555
+ typename U,
556
+ std::enable_if_t<internal_statusor::IsValueOrValid<T, U&&, true>::value,
557
+ int> = 0>
558
+ T value_or(U&& default_value ABSL_ATTRIBUTE_LIFETIME_BOUND) const& {
559
+ return this->ValueOrImpl(std::forward<U>(default_value));
560
+ }
561
+ template <
562
+ typename U,
563
+ std::enable_if_t<internal_statusor::IsValueOrValid<T, U&&, true>::value,
564
+ int> = 0>
565
+ T value_or(U&& default_value ABSL_ATTRIBUTE_LIFETIME_BOUND) && {
566
+ return std::move(*this).ValueOrImpl(std::forward<U>(default_value));
567
+ }
543
568
 
544
569
  // StatusOr<T>::IgnoreError()
545
570
  //
@@ -607,7 +632,9 @@ class StatusOr : private internal_statusor::StatusOrData<T>,
607
632
  // operator==()
608
633
  //
609
634
  // This operator checks the equality of two `absl::StatusOr<T>` objects.
610
- template <typename T>
635
+ template <typename T,
636
+ std::enable_if_t<internal_statusor::IsEqualityComparable<T>::value,
637
+ int> = 0>
611
638
  bool operator==(const StatusOr<T>& lhs, const StatusOr<T>& rhs) {
612
639
  if (lhs.ok() && rhs.ok()) return *lhs == *rhs;
613
640
  return lhs.status() == rhs.status();
@@ -616,7 +643,9 @@ bool operator==(const StatusOr<T>& lhs, const StatusOr<T>& rhs) {
616
643
  // operator!=()
617
644
  //
618
645
  // This operator checks the inequality of two `absl::StatusOr<T>` objects.
619
- template <typename T>
646
+ template <typename T,
647
+ std::enable_if_t<internal_statusor::IsEqualityComparable<T>::value,
648
+ int> = 0>
620
649
  bool operator!=(const StatusOr<T>& lhs, const StatusOr<T>& rhs) {
621
650
  return !(lhs == rhs);
622
651
  }
@@ -703,88 +732,6 @@ Status StatusOr<T>::status() && {
703
732
  return ok() ? OkStatus() : std::move(this->status_);
704
733
  }
705
734
 
706
- template <typename T>
707
- const T& StatusOr<T>::value() const& {
708
- if (!this->ok()) internal_statusor::ThrowBadStatusOrAccess(this->status_);
709
- return this->data_;
710
- }
711
-
712
- template <typename T>
713
- T& StatusOr<T>::value() & {
714
- if (!this->ok()) internal_statusor::ThrowBadStatusOrAccess(this->status_);
715
- return this->data_;
716
- }
717
-
718
- template <typename T>
719
- const T&& StatusOr<T>::value() const&& {
720
- if (!this->ok()) {
721
- internal_statusor::ThrowBadStatusOrAccess(std::move(this->status_));
722
- }
723
- return std::move(this->data_);
724
- }
725
-
726
- template <typename T>
727
- T&& StatusOr<T>::value() && {
728
- if (!this->ok()) {
729
- internal_statusor::ThrowBadStatusOrAccess(std::move(this->status_));
730
- }
731
- return std::move(this->data_);
732
- }
733
-
734
- template <typename T>
735
- const T& StatusOr<T>::operator*() const& {
736
- this->EnsureOk();
737
- return this->data_;
738
- }
739
-
740
- template <typename T>
741
- T& StatusOr<T>::operator*() & {
742
- this->EnsureOk();
743
- return this->data_;
744
- }
745
-
746
- template <typename T>
747
- const T&& StatusOr<T>::operator*() const&& {
748
- this->EnsureOk();
749
- return std::move(this->data_);
750
- }
751
-
752
- template <typename T>
753
- T&& StatusOr<T>::operator*() && {
754
- this->EnsureOk();
755
- return std::move(this->data_);
756
- }
757
-
758
- template <typename T>
759
- absl::Nonnull<const T*> StatusOr<T>::operator->() const {
760
- this->EnsureOk();
761
- return &this->data_;
762
- }
763
-
764
- template <typename T>
765
- absl::Nonnull<T*> StatusOr<T>::operator->() {
766
- this->EnsureOk();
767
- return &this->data_;
768
- }
769
-
770
- template <typename T>
771
- template <typename U>
772
- T StatusOr<T>::value_or(U&& default_value) const& {
773
- if (ok()) {
774
- return this->data_;
775
- }
776
- return std::forward<U>(default_value);
777
- }
778
-
779
- template <typename T>
780
- template <typename U>
781
- T StatusOr<T>::value_or(U&& default_value) && {
782
- if (ok()) {
783
- return std::move(this->data_);
784
- }
785
- return std::forward<U>(default_value);
786
- }
787
-
788
735
  template <typename T>
789
736
  void StatusOr<T>::IgnoreError() const {
790
737
  // no-op
@@ -0,0 +1,480 @@
1
+ // Copyright 2025 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <string>
16
+
17
+ #include "absl/status/status.h"
18
+ #include "absl/status/statusor.h"
19
+ #include "benchmark/benchmark.h"
20
+
21
+ namespace {
22
+
23
+ void BM_StatusOrInt_CtorStatus(benchmark::State& state) {
24
+ for (auto _ : state) {
25
+ absl::StatusOr<int> status(absl::CancelledError());
26
+ benchmark::DoNotOptimize(status);
27
+ }
28
+ }
29
+ BENCHMARK(BM_StatusOrInt_CtorStatus);
30
+
31
+ void BM_StatusOrInt_CtorStatusWithMessage(benchmark::State& state) {
32
+ for (auto _ : state) {
33
+ absl::StatusOr<int> status(
34
+ absl::UnknownError("This string is 28 characters"));
35
+ benchmark::DoNotOptimize(status);
36
+ }
37
+ }
38
+ BENCHMARK(BM_StatusOrInt_CtorStatusWithMessage);
39
+
40
+ void BM_StatusOrInt_CopyCtor_Error(benchmark::State& state) {
41
+ for (auto _ : state) {
42
+ absl::StatusOr<int> original(
43
+ absl::UnknownError("This string is 28 characters"));
44
+ benchmark::DoNotOptimize(original);
45
+ absl::StatusOr<int> status(original);
46
+ benchmark::DoNotOptimize(status);
47
+ }
48
+ }
49
+ BENCHMARK(BM_StatusOrInt_CopyCtor_Error);
50
+
51
+ void BM_StatusOrInt_CopyCtor_Ok(benchmark::State& state) {
52
+ for (auto _ : state) {
53
+ absl::StatusOr<int> original(42);
54
+ benchmark::DoNotOptimize(original);
55
+ absl::StatusOr<int> status(original);
56
+ benchmark::DoNotOptimize(status);
57
+ }
58
+ }
59
+ BENCHMARK(BM_StatusOrInt_CopyCtor_Ok);
60
+
61
+ void BM_StatusOrInt_MoveCtor_Error(benchmark::State& state) {
62
+ for (auto _ : state) {
63
+ absl::StatusOr<int> original(
64
+ absl::UnknownError("This string is 28 characters"));
65
+ benchmark::DoNotOptimize(original);
66
+ absl::StatusOr<int> status(std::move(original));
67
+ benchmark::DoNotOptimize(status);
68
+ }
69
+ }
70
+ BENCHMARK(BM_StatusOrInt_MoveCtor_Error);
71
+
72
+ void BM_StatusOrInt_MoveCtor_Ok(benchmark::State& state) {
73
+ for (auto _ : state) {
74
+ absl::StatusOr<int> original(42);
75
+ benchmark::DoNotOptimize(original);
76
+ absl::StatusOr<int> status(std::move(original));
77
+ benchmark::DoNotOptimize(status);
78
+ }
79
+ }
80
+ BENCHMARK(BM_StatusOrInt_MoveCtor_Ok);
81
+
82
+ void BM_StatusOrInt_CopyAssign_Error(benchmark::State& state) {
83
+ for (auto _ : state) {
84
+ absl::StatusOr<int> original(
85
+ absl::UnknownError("This string is 28 characters"));
86
+ benchmark::DoNotOptimize(original);
87
+ absl::StatusOr<int> status(42);
88
+ benchmark::DoNotOptimize(status);
89
+ benchmark::DoNotOptimize(status = original);
90
+ benchmark::DoNotOptimize(status);
91
+ }
92
+ }
93
+ BENCHMARK(BM_StatusOrInt_CopyAssign_Error);
94
+
95
+ void BM_StatusOrInt_CopyAssign_Ok(benchmark::State& state) {
96
+ for (auto _ : state) {
97
+ absl::StatusOr<int> original(42);
98
+ benchmark::DoNotOptimize(original);
99
+ absl::StatusOr<int> status(42);
100
+ benchmark::DoNotOptimize(status);
101
+ benchmark::DoNotOptimize(status = original);
102
+ benchmark::DoNotOptimize(status);
103
+ }
104
+ }
105
+ BENCHMARK(BM_StatusOrInt_CopyAssign_Ok);
106
+
107
+ void BM_StatusOrInt_MoveAssign_Error(benchmark::State& state) {
108
+ for (auto _ : state) {
109
+ absl::StatusOr<int> original(
110
+ absl::UnknownError("This string is 28 characters"));
111
+ benchmark::DoNotOptimize(original);
112
+ absl::StatusOr<int> status(42);
113
+ benchmark::DoNotOptimize(status);
114
+ benchmark::DoNotOptimize(status = std::move(original));
115
+ benchmark::DoNotOptimize(status);
116
+ }
117
+ }
118
+ BENCHMARK(BM_StatusOrInt_MoveAssign_Error);
119
+
120
+ void BM_StatusOrInt_MoveAssign_Ok(benchmark::State& state) {
121
+ for (auto _ : state) {
122
+ absl::StatusOr<int> original(42);
123
+ benchmark::DoNotOptimize(original);
124
+ absl::StatusOr<int> status(42);
125
+ benchmark::DoNotOptimize(status);
126
+ benchmark::DoNotOptimize(status = std::move(original));
127
+ benchmark::DoNotOptimize(status);
128
+ }
129
+ }
130
+ BENCHMARK(BM_StatusOrInt_MoveAssign_Ok);
131
+
132
+ void BM_StatusOrInt_OkMethod_Error(benchmark::State& state) {
133
+ absl::StatusOr<int> status(
134
+ absl::UnknownError("This string is 28 characters"));
135
+ for (auto _ : state) {
136
+ benchmark::DoNotOptimize(status);
137
+ benchmark::DoNotOptimize(status.ok());
138
+ }
139
+ }
140
+ BENCHMARK(BM_StatusOrInt_OkMethod_Error);
141
+
142
+ void BM_StatusOrInt_OkMethod_Ok(benchmark::State& state) {
143
+ absl::StatusOr<int> status(42);
144
+ for (auto _ : state) {
145
+ benchmark::DoNotOptimize(status);
146
+ benchmark::DoNotOptimize(status.ok());
147
+ }
148
+ }
149
+ BENCHMARK(BM_StatusOrInt_OkMethod_Ok);
150
+
151
+ void BM_StatusOrInt_StatusMethod_Error(benchmark::State& state) {
152
+ for (auto _ : state) {
153
+ absl::StatusOr<int> status(
154
+ absl::UnknownError("This string is 28 characters"));
155
+ benchmark::DoNotOptimize(status);
156
+ benchmark::DoNotOptimize(status.status().ok());
157
+ }
158
+ }
159
+ BENCHMARK(BM_StatusOrInt_StatusMethod_Error);
160
+
161
+ void BM_StatusOrInt_StatusMethod_Ok(benchmark::State& state) {
162
+ for (auto _ : state) {
163
+ absl::StatusOr<int> status(42);
164
+ benchmark::DoNotOptimize(status);
165
+ benchmark::DoNotOptimize(std::move(status).status().ok());
166
+ }
167
+ }
168
+ BENCHMARK(BM_StatusOrInt_StatusMethod_Ok);
169
+
170
+ void BM_StatusOrInt_StatusMethodRvalue_Error(benchmark::State& state) {
171
+ for (auto _ : state) {
172
+ absl::StatusOr<int> status(
173
+ absl::UnknownError("This string is 28 characters"));
174
+ benchmark::DoNotOptimize(status);
175
+ benchmark::DoNotOptimize(std::move(status).status().ok());
176
+ }
177
+ }
178
+ BENCHMARK(BM_StatusOrInt_StatusMethodRvalue_Error);
179
+
180
+ void BM_StatusOrInt_StatusMethodRvalue_Ok(benchmark::State& state) {
181
+ for (auto _ : state) {
182
+ absl::StatusOr<int> status(42);
183
+ benchmark::DoNotOptimize(status);
184
+ benchmark::DoNotOptimize(std::move(status).status());
185
+ }
186
+ }
187
+ BENCHMARK(BM_StatusOrInt_StatusMethodRvalue_Ok);
188
+
189
+ void BM_StatusOrString_CtorStatus(benchmark::State& state) {
190
+ for (auto _ : state) {
191
+ absl::StatusOr<std::string> status(absl::CancelledError());
192
+ benchmark::DoNotOptimize(status);
193
+ }
194
+ }
195
+ BENCHMARK(BM_StatusOrString_CtorStatus);
196
+
197
+ void BM_StatusOrString_CtorStatusWithMessage(benchmark::State& state) {
198
+ for (auto _ : state) {
199
+ absl::StatusOr<std::string> status(
200
+ absl::UnknownError("This string is 28 characters"));
201
+ benchmark::DoNotOptimize(status);
202
+ }
203
+ }
204
+ BENCHMARK(BM_StatusOrString_CtorStatusWithMessage);
205
+
206
+ void BM_StatusOrString_CopyCtor_Error(benchmark::State& state) {
207
+ for (auto _ : state) {
208
+ absl::StatusOr<std::string> original(
209
+ absl::UnknownError("This string is 28 characters"));
210
+ benchmark::DoNotOptimize(original);
211
+ absl::StatusOr<std::string> status(original);
212
+ benchmark::DoNotOptimize(status);
213
+ }
214
+ }
215
+ BENCHMARK(BM_StatusOrString_CopyCtor_Error);
216
+
217
+ void BM_StatusOrString_CopyCtor_Ok(benchmark::State& state) {
218
+ for (auto _ : state) {
219
+ absl::StatusOr<std::string> original("This string is 28 characters");
220
+ benchmark::DoNotOptimize(original);
221
+ absl::StatusOr<std::string> status(original);
222
+ benchmark::DoNotOptimize(status);
223
+ }
224
+ }
225
+ BENCHMARK(BM_StatusOrString_CopyCtor_Ok);
226
+
227
+ void BM_StatusOrString_MoveCtor_Error(benchmark::State& state) {
228
+ for (auto _ : state) {
229
+ absl::StatusOr<std::string> original(
230
+ absl::UnknownError("This string is 28 characters"));
231
+ benchmark::DoNotOptimize(original);
232
+ absl::StatusOr<std::string> status(std::move(original));
233
+ benchmark::DoNotOptimize(status);
234
+ }
235
+ }
236
+ BENCHMARK(BM_StatusOrString_MoveCtor_Error);
237
+
238
+ void BM_StatusOrString_MoveCtor_Ok(benchmark::State& state) {
239
+ for (auto _ : state) {
240
+ absl::StatusOr<std::string> original("This string is 28 characters");
241
+ benchmark::DoNotOptimize(original);
242
+ absl::StatusOr<std::string> status(std::move(original));
243
+ benchmark::DoNotOptimize(status);
244
+ }
245
+ }
246
+ BENCHMARK(BM_StatusOrString_MoveCtor_Ok);
247
+
248
+ void BM_StatusOrString_CopyAssign_Error(benchmark::State& state) {
249
+ for (auto _ : state) {
250
+ absl::StatusOr<std::string> original(
251
+ absl::UnknownError("This string is 28 characters"));
252
+ benchmark::DoNotOptimize(original);
253
+ absl::StatusOr<std::string> status("This string is 28 characters");
254
+ benchmark::DoNotOptimize(status);
255
+ benchmark::DoNotOptimize(status = original);
256
+ benchmark::DoNotOptimize(status);
257
+ }
258
+ }
259
+ BENCHMARK(BM_StatusOrString_CopyAssign_Error);
260
+
261
+ void BM_StatusOrString_CopyAssign_Ok(benchmark::State& state) {
262
+ for (auto _ : state) {
263
+ absl::StatusOr<std::string> original("This string is 28 characters");
264
+ benchmark::DoNotOptimize(original);
265
+ absl::StatusOr<std::string> status("This string is 28 characters");
266
+ benchmark::DoNotOptimize(status);
267
+ benchmark::DoNotOptimize(status = original);
268
+ benchmark::DoNotOptimize(status);
269
+ }
270
+ }
271
+ BENCHMARK(BM_StatusOrString_CopyAssign_Ok);
272
+
273
+ void BM_StatusOrString_MoveAssign_Error(benchmark::State& state) {
274
+ for (auto _ : state) {
275
+ absl::StatusOr<std::string> original(
276
+ absl::UnknownError("This string is 28 characters"));
277
+ benchmark::DoNotOptimize(original);
278
+ absl::StatusOr<std::string> status("This string is 28 characters");
279
+ benchmark::DoNotOptimize(status);
280
+ benchmark::DoNotOptimize(status = std::move(original));
281
+ benchmark::DoNotOptimize(status);
282
+ }
283
+ }
284
+ BENCHMARK(BM_StatusOrString_MoveAssign_Error);
285
+
286
+ void BM_StatusOrString_MoveAssign_Ok(benchmark::State& state) {
287
+ for (auto _ : state) {
288
+ absl::StatusOr<std::string> original("This string is 28 characters");
289
+ benchmark::DoNotOptimize(original);
290
+ absl::StatusOr<std::string> status("This string is 28 characters");
291
+ benchmark::DoNotOptimize(status);
292
+ benchmark::DoNotOptimize(status = std::move(original));
293
+ benchmark::DoNotOptimize(status);
294
+ }
295
+ }
296
+ BENCHMARK(BM_StatusOrString_MoveAssign_Ok);
297
+
298
+ void BM_StatusOrString_OkMethod_Error(benchmark::State& state) {
299
+ for (auto _ : state) {
300
+ absl::StatusOr<std::string> status(
301
+ absl::UnknownError("This string is 28 characters"));
302
+ benchmark::DoNotOptimize(status);
303
+ benchmark::DoNotOptimize(status.ok());
304
+ }
305
+ }
306
+ BENCHMARK(BM_StatusOrString_OkMethod_Error);
307
+
308
+ void BM_StatusOrString_OkMethod_Ok(benchmark::State& state) {
309
+ for (auto _ : state) {
310
+ absl::StatusOr<std::string> status("This string is 28 characters");
311
+ benchmark::DoNotOptimize(status);
312
+ benchmark::DoNotOptimize(status.ok());
313
+ }
314
+ }
315
+ BENCHMARK(BM_StatusOrString_OkMethod_Ok);
316
+
317
+ void BM_StatusOrString_StatusMethod_Error(benchmark::State& state) {
318
+ for (auto _ : state) {
319
+ absl::StatusOr<std::string> status(
320
+ absl::UnknownError("This string is 28 characters"));
321
+ benchmark::DoNotOptimize(status);
322
+ benchmark::DoNotOptimize(status.status().ok());
323
+ }
324
+ }
325
+ BENCHMARK(BM_StatusOrString_StatusMethod_Error);
326
+
327
+ void BM_StatusOrString_StatusMethod_Ok(benchmark::State& state) {
328
+ for (auto _ : state) {
329
+ absl::StatusOr<std::string> status("This string is 28 characters");
330
+ benchmark::DoNotOptimize(status);
331
+ benchmark::DoNotOptimize(status.status().ok());
332
+ }
333
+ }
334
+ BENCHMARK(BM_StatusOrString_StatusMethod_Ok);
335
+
336
+ void BM_StatusOrString_StatusMethodRvalue_Error(benchmark::State& state) {
337
+ for (auto _ : state) {
338
+ absl::StatusOr<std::string> status(
339
+ absl::UnknownError("This string is 28 characters"));
340
+ benchmark::DoNotOptimize(status);
341
+ benchmark::DoNotOptimize(std::move(status).status());
342
+ }
343
+ }
344
+ BENCHMARK(BM_StatusOrString_StatusMethodRvalue_Error);
345
+
346
+ void BM_StatusOrString_StatusMethodRvalue_Ok(benchmark::State& state) {
347
+ for (auto _ : state) {
348
+ absl::StatusOr<std::string> status("This string is 28 characters");
349
+ benchmark::DoNotOptimize(status);
350
+ benchmark::DoNotOptimize(std::move(status).status());
351
+ }
352
+ }
353
+ BENCHMARK(BM_StatusOrString_StatusMethodRvalue_Ok);
354
+
355
+ // Benchmarks comparing a few alternative ways of structuring an interface
356
+ // for returning an int64 on success or an error. See (a), (b), (c), (d)
357
+ // below for the variants.
358
+ bool bm_cond = true;
359
+
360
+ bool SimpleIntInterface(int64_t* v) ABSL_ATTRIBUTE_NOINLINE;
361
+ bool SimpleIntInterfaceWithErrorMessage(int64_t* v, std::string* msg)
362
+ ABSL_ATTRIBUTE_NOINLINE;
363
+ absl::Status SimpleIntInterfaceWithErrorStatus(int64_t* v)
364
+ ABSL_ATTRIBUTE_NOINLINE;
365
+ absl::StatusOr<int64_t> SimpleIntStatusOrInterface() ABSL_ATTRIBUTE_NOINLINE;
366
+
367
+ // (a): Just a boolean return value with an out int64* parameter
368
+ bool SimpleIntInterface(int64_t* v) {
369
+ benchmark::DoNotOptimize(bm_cond);
370
+ if (bm_cond) {
371
+ *v = 42;
372
+ return true;
373
+ } else {
374
+ return false;
375
+ }
376
+ }
377
+
378
+ // (b): A boolean return value and a string error message filled in on failure
379
+ // and an out int64* parameter filled on success
380
+ bool SimpleIntInterfaceWithErrorMessage(int64_t* v, std::string* msg) {
381
+ benchmark::DoNotOptimize(bm_cond);
382
+ if (bm_cond) {
383
+ *v = 42;
384
+ return true;
385
+ } else {
386
+ *msg = "This is an error message";
387
+ return false;
388
+ }
389
+ }
390
+
391
+ // (c): A Status return value with an out int64* parameter on success
392
+ absl::Status SimpleIntInterfaceWithErrorStatus(int64_t* v) {
393
+ benchmark::DoNotOptimize(bm_cond);
394
+ if (bm_cond) {
395
+ *v = 42;
396
+ return absl::OkStatus();
397
+ } else {
398
+ return absl::UnknownError("This is an error message");
399
+ }
400
+ }
401
+
402
+ // (d): A StatusOr<int64> return value
403
+ absl::StatusOr<int64_t> SimpleIntStatusOrInterface() {
404
+ benchmark::DoNotOptimize(bm_cond);
405
+ if (bm_cond) {
406
+ return 42;
407
+ } else {
408
+ return absl::StatusOr<int64_t>(
409
+ absl::UnknownError("This is an error message"));
410
+ }
411
+ }
412
+
413
+ void SetCondition(benchmark::State& state) {
414
+ bm_cond = (state.range(0) == 0);
415
+ state.SetLabel(bm_cond ? "Success" : "Failure");
416
+ }
417
+
418
+ void BM_SimpleIntInterface(benchmark::State& state) {
419
+ SetCondition(state);
420
+ int64_t sum = 0;
421
+ for (auto s : state) {
422
+ int64_t v;
423
+ if (SimpleIntInterface(&v)) {
424
+ sum += v;
425
+ }
426
+ benchmark::DoNotOptimize(sum);
427
+ }
428
+ }
429
+
430
+ void BM_SimpleIntInterfaceMsg(benchmark::State& state) {
431
+ SetCondition(state);
432
+ int64_t sum = 0;
433
+ std::string msg;
434
+ for (auto s : state) {
435
+ int64_t v;
436
+ if (SimpleIntInterfaceWithErrorMessage(&v, &msg)) {
437
+ sum += v;
438
+ }
439
+ benchmark::DoNotOptimize(sum);
440
+ benchmark::DoNotOptimize(msg);
441
+ }
442
+ }
443
+
444
+ void BM_SimpleIntInterfaceStatus(benchmark::State& state) {
445
+ SetCondition(state);
446
+ int64_t sum = 0;
447
+ for (auto s : state) {
448
+ int64_t v;
449
+ auto result = SimpleIntInterfaceWithErrorStatus(&v);
450
+ if (result.ok()) {
451
+ sum += v;
452
+ }
453
+ benchmark::DoNotOptimize(sum);
454
+ }
455
+ }
456
+
457
+ void BM_SimpleIntStatusOrInterface(benchmark::State& state) {
458
+ SetCondition(state);
459
+ int64_t sum = 0;
460
+ for (auto s : state) {
461
+ auto v_s = SimpleIntStatusOrInterface();
462
+ if (v_s.ok()) {
463
+ sum += *v_s;
464
+ }
465
+ benchmark::DoNotOptimize(sum);
466
+ }
467
+ }
468
+
469
+ // Ordered like this so all the success path benchmarks (Arg(0)) show up,
470
+ // then all the failure benchmarks (Arg(1))
471
+ BENCHMARK(BM_SimpleIntInterface)->Arg(0);
472
+ BENCHMARK(BM_SimpleIntInterfaceMsg)->Arg(0);
473
+ BENCHMARK(BM_SimpleIntInterfaceStatus)->Arg(0);
474
+ BENCHMARK(BM_SimpleIntStatusOrInterface)->Arg(0);
475
+ BENCHMARK(BM_SimpleIntInterface)->Arg(1);
476
+ BENCHMARK(BM_SimpleIntInterfaceMsg)->Arg(1);
477
+ BENCHMARK(BM_SimpleIntInterfaceStatus)->Arg(1);
478
+ BENCHMARK(BM_SimpleIntStatusOrInterface)->Arg(1);
479
+
480
+ } // namespace