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
@@ -1,532 +0,0 @@
1
- // Copyright 2017 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 "absl/types/variant.h"
16
-
17
- #include "absl/base/config.h"
18
-
19
- // This test is a no-op when absl::variant is an alias for std::variant and when
20
- // exceptions are not enabled.
21
- #if !defined(ABSL_USES_STD_VARIANT) && defined(ABSL_HAVE_EXCEPTIONS)
22
-
23
- #include <iostream>
24
- #include <memory>
25
- #include <utility>
26
- #include <vector>
27
-
28
- #include "gmock/gmock.h"
29
- #include "gtest/gtest.h"
30
- #include "absl/base/internal/exception_safety_testing.h"
31
- #include "absl/memory/memory.h"
32
-
33
- // See comment in absl/base/config.h
34
- #if !defined(ABSL_INTERNAL_MSVC_2017_DBG_MODE)
35
-
36
- namespace absl {
37
- ABSL_NAMESPACE_BEGIN
38
- namespace {
39
-
40
- using ::testing::MakeExceptionSafetyTester;
41
- using ::testing::strong_guarantee;
42
- using ::testing::TestNothrowOp;
43
- using ::testing::TestThrowingCtor;
44
-
45
- using Thrower = testing::ThrowingValue<>;
46
- using CopyNothrow = testing::ThrowingValue<testing::TypeSpec::kNoThrowCopy>;
47
- using MoveNothrow = testing::ThrowingValue<testing::TypeSpec::kNoThrowMove>;
48
- using ThrowingAlloc = testing::ThrowingAllocator<Thrower>;
49
- using ThrowerVec = std::vector<Thrower, ThrowingAlloc>;
50
- using ThrowingVariant =
51
- absl::variant<Thrower, CopyNothrow, MoveNothrow, ThrowerVec>;
52
-
53
- struct ConversionException {};
54
-
55
- template <class T>
56
- struct ExceptionOnConversion {
57
- operator T() const { // NOLINT
58
- throw ConversionException();
59
- }
60
- };
61
-
62
- // Forces a variant into the valueless by exception state.
63
- void ToValuelessByException(ThrowingVariant& v) { // NOLINT
64
- try {
65
- v.emplace<Thrower>();
66
- v.emplace<Thrower>(ExceptionOnConversion<Thrower>());
67
- } catch (const ConversionException&) {
68
- // This space intentionally left blank.
69
- }
70
- }
71
-
72
- // Check that variant is still in a usable state after an exception is thrown.
73
- testing::AssertionResult VariantInvariants(ThrowingVariant* v) {
74
- using testing::AssertionFailure;
75
- using testing::AssertionSuccess;
76
-
77
- // Try using the active alternative
78
- if (absl::holds_alternative<Thrower>(*v)) {
79
- auto& t = absl::get<Thrower>(*v);
80
- t = Thrower{-100};
81
- if (t.Get() != -100) {
82
- return AssertionFailure() << "Thrower should be assigned -100";
83
- }
84
- } else if (absl::holds_alternative<ThrowerVec>(*v)) {
85
- auto& tv = absl::get<ThrowerVec>(*v);
86
- tv.clear();
87
- tv.emplace_back(-100);
88
- if (tv.size() != 1 || tv[0].Get() != -100) {
89
- return AssertionFailure() << "ThrowerVec should be {Thrower{-100}}";
90
- }
91
- } else if (absl::holds_alternative<CopyNothrow>(*v)) {
92
- auto& t = absl::get<CopyNothrow>(*v);
93
- t = CopyNothrow{-100};
94
- if (t.Get() != -100) {
95
- return AssertionFailure() << "CopyNothrow should be assigned -100";
96
- }
97
- } else if (absl::holds_alternative<MoveNothrow>(*v)) {
98
- auto& t = absl::get<MoveNothrow>(*v);
99
- t = MoveNothrow{-100};
100
- if (t.Get() != -100) {
101
- return AssertionFailure() << "MoveNothrow should be assigned -100";
102
- }
103
- }
104
-
105
- // Try making variant valueless_by_exception
106
- if (!v->valueless_by_exception()) ToValuelessByException(*v);
107
- if (!v->valueless_by_exception()) {
108
- return AssertionFailure() << "Variant should be valueless_by_exception";
109
- }
110
- try {
111
- auto unused = absl::get<Thrower>(*v);
112
- static_cast<void>(unused);
113
- return AssertionFailure() << "Variant should not contain Thrower";
114
- } catch (const absl::bad_variant_access&) {
115
- } catch (...) {
116
- return AssertionFailure() << "Unexpected exception throw from absl::get";
117
- }
118
-
119
- // Try using the variant
120
- v->emplace<Thrower>(100);
121
- if (!absl::holds_alternative<Thrower>(*v) ||
122
- absl::get<Thrower>(*v) != Thrower(100)) {
123
- return AssertionFailure() << "Variant should contain Thrower(100)";
124
- }
125
- v->emplace<ThrowerVec>({Thrower(100)});
126
- if (!absl::holds_alternative<ThrowerVec>(*v) ||
127
- absl::get<ThrowerVec>(*v)[0] != Thrower(100)) {
128
- return AssertionFailure()
129
- << "Variant should contain ThrowerVec{Thrower(100)}";
130
- }
131
- return AssertionSuccess();
132
- }
133
-
134
- template <typename... Args>
135
- Thrower ExpectedThrower(Args&&... args) {
136
- return Thrower(42, args...);
137
- }
138
-
139
- ThrowerVec ExpectedThrowerVec() { return {Thrower(100), Thrower(200)}; }
140
- ThrowingVariant ValuelessByException() {
141
- ThrowingVariant v;
142
- ToValuelessByException(v);
143
- return v;
144
- }
145
- ThrowingVariant WithThrower() { return Thrower(39); }
146
- ThrowingVariant WithThrowerVec() {
147
- return ThrowerVec{Thrower(1), Thrower(2), Thrower(3)};
148
- }
149
- ThrowingVariant WithCopyNoThrow() { return CopyNothrow(39); }
150
- ThrowingVariant WithMoveNoThrow() { return MoveNothrow(39); }
151
-
152
- TEST(VariantExceptionSafetyTest, DefaultConstructor) {
153
- TestThrowingCtor<ThrowingVariant>();
154
- }
155
-
156
- TEST(VariantExceptionSafetyTest, CopyConstructor) {
157
- {
158
- ThrowingVariant v(ExpectedThrower());
159
- TestThrowingCtor<ThrowingVariant>(v);
160
- }
161
- {
162
- ThrowingVariant v(ExpectedThrowerVec());
163
- TestThrowingCtor<ThrowingVariant>(v);
164
- }
165
- {
166
- ThrowingVariant v(ValuelessByException());
167
- TestThrowingCtor<ThrowingVariant>(v);
168
- }
169
- }
170
-
171
- TEST(VariantExceptionSafetyTest, MoveConstructor) {
172
- {
173
- ThrowingVariant v(ExpectedThrower());
174
- TestThrowingCtor<ThrowingVariant>(std::move(v));
175
- }
176
- {
177
- ThrowingVariant v(ExpectedThrowerVec());
178
- TestThrowingCtor<ThrowingVariant>(std::move(v));
179
- }
180
- {
181
- ThrowingVariant v(ValuelessByException());
182
- TestThrowingCtor<ThrowingVariant>(std::move(v));
183
- }
184
- }
185
-
186
- TEST(VariantExceptionSafetyTest, ValueConstructor) {
187
- TestThrowingCtor<ThrowingVariant>(ExpectedThrower());
188
- TestThrowingCtor<ThrowingVariant>(ExpectedThrowerVec());
189
- }
190
-
191
- TEST(VariantExceptionSafetyTest, InPlaceTypeConstructor) {
192
- TestThrowingCtor<ThrowingVariant>(absl::in_place_type_t<Thrower>{},
193
- ExpectedThrower());
194
- TestThrowingCtor<ThrowingVariant>(absl::in_place_type_t<ThrowerVec>{},
195
- ExpectedThrowerVec());
196
- }
197
-
198
- TEST(VariantExceptionSafetyTest, InPlaceIndexConstructor) {
199
- TestThrowingCtor<ThrowingVariant>(absl::in_place_index_t<0>{},
200
- ExpectedThrower());
201
- TestThrowingCtor<ThrowingVariant>(absl::in_place_index_t<3>{},
202
- ExpectedThrowerVec());
203
- }
204
-
205
- TEST(VariantExceptionSafetyTest, CopyAssign) {
206
- // variant& operator=(const variant& rhs);
207
- // Let j be rhs.index()
208
- {
209
- // - neither *this nor rhs holds a value
210
- const ThrowingVariant rhs = ValuelessByException();
211
- ThrowingVariant lhs = ValuelessByException();
212
- EXPECT_TRUE(TestNothrowOp([&]() { lhs = rhs; }));
213
- }
214
- {
215
- // - *this holds a value but rhs does not
216
- const ThrowingVariant rhs = ValuelessByException();
217
- ThrowingVariant lhs = WithThrower();
218
- EXPECT_TRUE(TestNothrowOp([&]() { lhs = rhs; }));
219
- }
220
- // - index() == j
221
- {
222
- const ThrowingVariant rhs(ExpectedThrower());
223
- auto tester =
224
- MakeExceptionSafetyTester()
225
- .WithInitialValue(WithThrower())
226
- .WithOperation([&rhs](ThrowingVariant* lhs) { *lhs = rhs; });
227
- EXPECT_TRUE(tester.WithContracts(VariantInvariants).Test());
228
- EXPECT_FALSE(tester.WithContracts(strong_guarantee).Test());
229
- }
230
- {
231
- const ThrowingVariant rhs(ExpectedThrowerVec());
232
- auto tester =
233
- MakeExceptionSafetyTester()
234
- .WithInitialValue(WithThrowerVec())
235
- .WithOperation([&rhs](ThrowingVariant* lhs) { *lhs = rhs; });
236
- EXPECT_TRUE(tester.WithContracts(VariantInvariants).Test());
237
- EXPECT_FALSE(tester.WithContracts(strong_guarantee).Test());
238
- }
239
- // libstdc++ std::variant has bugs on copy assignment regarding exception
240
- // safety.
241
- #if !(defined(ABSL_USES_STD_VARIANT) && defined(__GLIBCXX__))
242
- // index() != j
243
- // if is_nothrow_copy_constructible_v<Tj> or
244
- // !is_nothrow_move_constructible<Tj> is true, equivalent to
245
- // emplace<j>(get<j>(rhs))
246
- {
247
- // is_nothrow_copy_constructible_v<Tj> == true
248
- // should not throw because emplace() invokes Tj's copy ctor
249
- // which should not throw.
250
- const ThrowingVariant rhs(CopyNothrow{});
251
- ThrowingVariant lhs = WithThrower();
252
- EXPECT_TRUE(TestNothrowOp([&]() { lhs = rhs; }));
253
- }
254
- {
255
- // is_nothrow_copy_constructible<Tj> == false &&
256
- // is_nothrow_move_constructible<Tj> == false
257
- // should provide basic guarantee because emplace() invokes Tj's copy ctor
258
- // which may throw.
259
- const ThrowingVariant rhs(ExpectedThrower());
260
- auto tester =
261
- MakeExceptionSafetyTester()
262
- .WithInitialValue(WithCopyNoThrow())
263
- .WithOperation([&rhs](ThrowingVariant* lhs) { *lhs = rhs; });
264
- EXPECT_TRUE(tester
265
- .WithContracts(VariantInvariants,
266
- [](ThrowingVariant* lhs) {
267
- return lhs->valueless_by_exception();
268
- })
269
- .Test());
270
- EXPECT_FALSE(tester.WithContracts(strong_guarantee).Test());
271
- }
272
- #endif // !(defined(ABSL_USES_STD_VARIANT) && defined(__GLIBCXX__))
273
- {
274
- // is_nothrow_copy_constructible_v<Tj> == false &&
275
- // is_nothrow_move_constructible_v<Tj> == true
276
- // should provide strong guarantee because it is equivalent to
277
- // operator=(variant(rhs)) which creates a temporary then invoke the move
278
- // ctor which shouldn't throw.
279
- const ThrowingVariant rhs(MoveNothrow{});
280
- EXPECT_TRUE(MakeExceptionSafetyTester()
281
- .WithInitialValue(WithThrower())
282
- .WithContracts(VariantInvariants, strong_guarantee)
283
- .Test([&rhs](ThrowingVariant* lhs) { *lhs = rhs; }));
284
- }
285
- }
286
-
287
- TEST(VariantExceptionSafetyTest, MoveAssign) {
288
- // variant& operator=(variant&& rhs);
289
- // Let j be rhs.index()
290
- {
291
- // - neither *this nor rhs holds a value
292
- ThrowingVariant rhs = ValuelessByException();
293
- ThrowingVariant lhs = ValuelessByException();
294
- EXPECT_TRUE(TestNothrowOp([&]() { lhs = std::move(rhs); }));
295
- }
296
- {
297
- // - *this holds a value but rhs does not
298
- ThrowingVariant rhs = ValuelessByException();
299
- ThrowingVariant lhs = WithThrower();
300
- EXPECT_TRUE(TestNothrowOp([&]() { lhs = std::move(rhs); }));
301
- }
302
- {
303
- // - index() == j
304
- // assign get<j>(std::move(rhs)) to the value contained in *this.
305
- // If an exception is thrown during call to Tj's move assignment, the state
306
- // of the contained value is as defined by the exception safety guarantee of
307
- // Tj's move assignment; index() will be j.
308
- ThrowingVariant rhs(ExpectedThrower());
309
- size_t j = rhs.index();
310
- // Since Thrower's move assignment has basic guarantee, so should variant's.
311
- auto tester = MakeExceptionSafetyTester()
312
- .WithInitialValue(WithThrower())
313
- .WithOperation([&](ThrowingVariant* lhs) {
314
- auto copy = rhs;
315
- *lhs = std::move(copy);
316
- });
317
- EXPECT_TRUE(tester
318
- .WithContracts(
319
- VariantInvariants,
320
- [&](ThrowingVariant* lhs) { return lhs->index() == j; })
321
- .Test());
322
- EXPECT_FALSE(tester.WithContracts(strong_guarantee).Test());
323
- }
324
- {
325
- // libstdc++ introduced a regression between 2018-09-25 and 2019-01-06.
326
- // The fix is targeted for gcc-9.
327
- // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87431#c7
328
- // https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=267614
329
- #if !(defined(ABSL_USES_STD_VARIANT) && \
330
- defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE == 8)
331
- // - otherwise (index() != j), equivalent to
332
- // emplace<j>(get<j>(std::move(rhs)))
333
- // - If an exception is thrown during the call to Tj's move construction
334
- // (with j being rhs.index()), the variant will hold no value.
335
- ThrowingVariant rhs(CopyNothrow{});
336
- EXPECT_TRUE(MakeExceptionSafetyTester()
337
- .WithInitialValue(WithThrower())
338
- .WithContracts(VariantInvariants,
339
- [](ThrowingVariant* lhs) {
340
- return lhs->valueless_by_exception();
341
- })
342
- .Test([&](ThrowingVariant* lhs) {
343
- auto copy = rhs;
344
- *lhs = std::move(copy);
345
- }));
346
- #endif // !(defined(ABSL_USES_STD_VARIANT) &&
347
- // defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE == 8)
348
- }
349
- }
350
-
351
- TEST(VariantExceptionSafetyTest, ValueAssign) {
352
- // template<class T> variant& operator=(T&& t);
353
- // Let Tj be the type that is selected by overload resolution to be assigned.
354
- {
355
- // If *this holds a Tj, assigns std::forward<T>(t) to the value contained in
356
- // *this. If an exception is thrown during the assignment of
357
- // std::forward<T>(t) to the value contained in *this, the state of the
358
- // contained value and t are as defined by the exception safety guarantee of
359
- // the assignment expression; valueless_by_exception() will be false.
360
- // Since Thrower's copy/move assignment has basic guarantee, so should
361
- // variant's.
362
- Thrower rhs = ExpectedThrower();
363
- // copy assign
364
- auto copy_tester =
365
- MakeExceptionSafetyTester()
366
- .WithInitialValue(WithThrower())
367
- .WithOperation([rhs](ThrowingVariant* lhs) { *lhs = rhs; });
368
- EXPECT_TRUE(copy_tester
369
- .WithContracts(VariantInvariants,
370
- [](ThrowingVariant* lhs) {
371
- return !lhs->valueless_by_exception();
372
- })
373
- .Test());
374
- EXPECT_FALSE(copy_tester.WithContracts(strong_guarantee).Test());
375
- // move assign
376
- auto move_tester = MakeExceptionSafetyTester()
377
- .WithInitialValue(WithThrower())
378
- .WithOperation([&](ThrowingVariant* lhs) {
379
- auto copy = rhs;
380
- *lhs = std::move(copy);
381
- });
382
- EXPECT_TRUE(move_tester
383
- .WithContracts(VariantInvariants,
384
- [](ThrowingVariant* lhs) {
385
- return !lhs->valueless_by_exception();
386
- })
387
- .Test());
388
-
389
- EXPECT_FALSE(move_tester.WithContracts(strong_guarantee).Test());
390
- }
391
- // Otherwise (*this holds something else), if is_nothrow_constructible_v<Tj,
392
- // T> || !is_nothrow_move_constructible_v<Tj> is true, equivalent to
393
- // emplace<j>(std::forward<T>(t)).
394
- // We simplify the test by letting T = `const Tj&` or `Tj&&`, so we can reuse
395
- // the CopyNothrow and MoveNothrow types.
396
-
397
- // if is_nothrow_constructible_v<Tj, T>
398
- // (i.e. is_nothrow_copy/move_constructible_v<Tj>) is true, emplace() just
399
- // invokes the copy/move constructor and it should not throw.
400
- {
401
- const CopyNothrow rhs;
402
- ThrowingVariant lhs = WithThrower();
403
- EXPECT_TRUE(TestNothrowOp([&]() { lhs = rhs; }));
404
- }
405
- {
406
- MoveNothrow rhs;
407
- ThrowingVariant lhs = WithThrower();
408
- EXPECT_TRUE(TestNothrowOp([&]() { lhs = std::move(rhs); }));
409
- }
410
- // if is_nothrow_constructible_v<Tj, T> == false &&
411
- // is_nothrow_move_constructible<Tj> == false
412
- // emplace() invokes the copy/move constructor which may throw so it should
413
- // provide basic guarantee and variant object might not hold a value.
414
- {
415
- Thrower rhs = ExpectedThrower();
416
- // copy
417
- auto copy_tester =
418
- MakeExceptionSafetyTester()
419
- .WithInitialValue(WithCopyNoThrow())
420
- .WithOperation([&rhs](ThrowingVariant* lhs) { *lhs = rhs; });
421
- EXPECT_TRUE(copy_tester
422
- .WithContracts(VariantInvariants,
423
- [](ThrowingVariant* lhs) {
424
- return lhs->valueless_by_exception();
425
- })
426
- .Test());
427
- EXPECT_FALSE(copy_tester.WithContracts(strong_guarantee).Test());
428
- // move
429
- auto move_tester = MakeExceptionSafetyTester()
430
- .WithInitialValue(WithCopyNoThrow())
431
- .WithOperation([](ThrowingVariant* lhs) {
432
- *lhs = ExpectedThrower(testing::nothrow_ctor);
433
- });
434
- EXPECT_TRUE(move_tester
435
- .WithContracts(VariantInvariants,
436
- [](ThrowingVariant* lhs) {
437
- return lhs->valueless_by_exception();
438
- })
439
- .Test());
440
- EXPECT_FALSE(move_tester.WithContracts(strong_guarantee).Test());
441
- }
442
- // Otherwise (if is_nothrow_constructible_v<Tj, T> == false &&
443
- // is_nothrow_move_constructible<Tj> == true),
444
- // equivalent to operator=(variant(std::forward<T>(t)))
445
- // This should have strong guarantee because it creates a temporary variant
446
- // and operator=(variant&&) invokes Tj's move ctor which doesn't throw.
447
- // libstdc++ std::variant has bugs on conversion assignment regarding
448
- // exception safety.
449
- #if !(defined(ABSL_USES_STD_VARIANT) && defined(__GLIBCXX__))
450
- {
451
- MoveNothrow rhs;
452
- EXPECT_TRUE(MakeExceptionSafetyTester()
453
- .WithInitialValue(WithThrower())
454
- .WithContracts(VariantInvariants, strong_guarantee)
455
- .Test([&rhs](ThrowingVariant* lhs) { *lhs = rhs; }));
456
- }
457
- #endif // !(defined(ABSL_USES_STD_VARIANT) && defined(__GLIBCXX__))
458
- }
459
-
460
- TEST(VariantExceptionSafetyTest, Emplace) {
461
- // If an exception during the initialization of the contained value, the
462
- // variant might not hold a value. The standard requires emplace() to provide
463
- // only basic guarantee.
464
- {
465
- Thrower args = ExpectedThrower();
466
- auto tester = MakeExceptionSafetyTester()
467
- .WithInitialValue(WithThrower())
468
- .WithOperation([&args](ThrowingVariant* v) {
469
- v->emplace<Thrower>(args);
470
- });
471
- EXPECT_TRUE(tester
472
- .WithContracts(VariantInvariants,
473
- [](ThrowingVariant* v) {
474
- return v->valueless_by_exception();
475
- })
476
- .Test());
477
- EXPECT_FALSE(tester.WithContracts(strong_guarantee).Test());
478
- }
479
- }
480
-
481
- TEST(VariantExceptionSafetyTest, Swap) {
482
- // if both are valueless_by_exception(), no effect
483
- {
484
- ThrowingVariant rhs = ValuelessByException();
485
- ThrowingVariant lhs = ValuelessByException();
486
- EXPECT_TRUE(TestNothrowOp([&]() { lhs.swap(rhs); }));
487
- }
488
- // if index() == rhs.index(), calls swap(get<i>(*this), get<i>(rhs))
489
- // where i is index().
490
- {
491
- ThrowingVariant rhs = ExpectedThrower();
492
- EXPECT_TRUE(MakeExceptionSafetyTester()
493
- .WithInitialValue(WithThrower())
494
- .WithContracts(VariantInvariants)
495
- .Test([&](ThrowingVariant* lhs) {
496
- auto copy = rhs;
497
- lhs->swap(copy);
498
- }));
499
- }
500
- // Otherwise, exchanges the value of rhs and *this. The exception safety
501
- // involves variant in moved-from state which is not specified in the
502
- // standard, and since swap is 3-step it's impossible for it to provide a
503
- // overall strong guarantee. So, we are only checking basic guarantee here.
504
- {
505
- ThrowingVariant rhs = ExpectedThrower();
506
- EXPECT_TRUE(MakeExceptionSafetyTester()
507
- .WithInitialValue(WithCopyNoThrow())
508
- .WithContracts(VariantInvariants)
509
- .Test([&](ThrowingVariant* lhs) {
510
- auto copy = rhs;
511
- lhs->swap(copy);
512
- }));
513
- }
514
- {
515
- ThrowingVariant rhs = ExpectedThrower();
516
- EXPECT_TRUE(MakeExceptionSafetyTester()
517
- .WithInitialValue(WithCopyNoThrow())
518
- .WithContracts(VariantInvariants)
519
- .Test([&](ThrowingVariant* lhs) {
520
- auto copy = rhs;
521
- copy.swap(*lhs);
522
- }));
523
- }
524
- }
525
-
526
- } // namespace
527
- ABSL_NAMESPACE_END
528
- } // namespace absl
529
-
530
- #endif // !defined(ABSL_INTERNAL_MSVC_2017_DBG_MODE)
531
-
532
- #endif // #if !defined(ABSL_USES_STD_VARIANT) && defined(ABSL_HAVE_EXCEPTIONS)
@@ -1,70 +0,0 @@
1
- // Copyright 2023 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
- // The IfConstexpr and IfConstexprElse utilities in this file are meant to be
16
- // used to emulate `if constexpr` in pre-C++17 mode in library implementation.
17
- // The motivation is to allow for avoiding complex SFINAE.
18
- //
19
- // The functions passed in must depend on the type(s) of the object(s) that
20
- // require SFINAE. For example:
21
- // template<typename T>
22
- // int MaybeFoo(T& t) {
23
- // if constexpr (HasFoo<T>::value) return t.foo();
24
- // return 0;
25
- // }
26
- //
27
- // can be written in pre-C++17 as:
28
- //
29
- // template<typename T>
30
- // int MaybeFoo(T& t) {
31
- // int i = 0;
32
- // absl::utility_internal::IfConstexpr<HasFoo<T>::value>(
33
- // [&](const auto& fooer) { i = fooer.foo(); }, t);
34
- // return i;
35
- // }
36
-
37
- #ifndef ABSL_UTILITY_INTERNAL_IF_CONSTEXPR_H_
38
- #define ABSL_UTILITY_INTERNAL_IF_CONSTEXPR_H_
39
-
40
- #include <tuple>
41
- #include <utility>
42
-
43
- #include "absl/base/config.h"
44
-
45
- namespace absl {
46
- ABSL_NAMESPACE_BEGIN
47
-
48
- namespace utility_internal {
49
-
50
- template <bool condition, typename TrueFunc, typename FalseFunc,
51
- typename... Args>
52
- auto IfConstexprElse(TrueFunc&& true_func, FalseFunc&& false_func,
53
- Args&&... args) {
54
- return std::get<condition>(std::forward_as_tuple(
55
- std::forward<FalseFunc>(false_func), std::forward<TrueFunc>(true_func)))(
56
- std::forward<Args>(args)...);
57
- }
58
-
59
- template <bool condition, typename Func, typename... Args>
60
- void IfConstexpr(Func&& func, Args&&... args) {
61
- IfConstexprElse<condition>(std::forward<Func>(func), [](auto&&...){},
62
- std::forward<Args>(args)...);
63
- }
64
-
65
- } // namespace utility_internal
66
-
67
- ABSL_NAMESPACE_END
68
- } // namespace absl
69
-
70
- #endif // ABSL_UTILITY_INTERNAL_IF_CONSTEXPR_H_
@@ -1,79 +0,0 @@
1
- // Copyright 2023 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 "absl/utility/internal/if_constexpr.h"
16
-
17
- #include <utility>
18
-
19
- #include "gtest/gtest.h"
20
-
21
- namespace {
22
-
23
- struct Empty {};
24
- struct HasFoo {
25
- int foo() const { return 1; }
26
- };
27
-
28
- TEST(IfConstexpr, Basic) {
29
- int i = 0;
30
- absl::utility_internal::IfConstexpr<false>(
31
- [&](const auto& t) { i = t.foo(); }, Empty{});
32
- EXPECT_EQ(i, 0);
33
-
34
- absl::utility_internal::IfConstexpr<false>(
35
- [&](const auto& t) { i = t.foo(); }, HasFoo{});
36
- EXPECT_EQ(i, 0);
37
-
38
- absl::utility_internal::IfConstexpr<true>(
39
- [&](const auto& t) { i = t.foo(); }, HasFoo{});
40
- EXPECT_EQ(i, 1);
41
- }
42
-
43
- TEST(IfConstexprElse, Basic) {
44
- EXPECT_EQ(absl::utility_internal::IfConstexprElse<false>(
45
- [&](const auto& t) { return t.foo(); }, [&](const auto&) { return 2; },
46
- Empty{}), 2);
47
-
48
- EXPECT_EQ(absl::utility_internal::IfConstexprElse<false>(
49
- [&](const auto& t) { return t.foo(); }, [&](const auto&) { return 2; },
50
- HasFoo{}), 2);
51
-
52
- EXPECT_EQ(absl::utility_internal::IfConstexprElse<true>(
53
- [&](const auto& t) { return t.foo(); }, [&](const auto&) { return 2; },
54
- HasFoo{}), 1);
55
- }
56
-
57
- struct HasFooRValue {
58
- int foo() && { return 1; }
59
- };
60
- struct RValueFunc {
61
- void operator()(HasFooRValue&& t) && { *i = std::move(t).foo(); }
62
-
63
- int* i = nullptr;
64
- };
65
-
66
- TEST(IfConstexpr, RValues) {
67
- int i = 0;
68
- RValueFunc func = {&i};
69
- absl::utility_internal::IfConstexpr<false>(
70
- std::move(func), HasFooRValue{});
71
- EXPECT_EQ(i, 0);
72
-
73
- func = RValueFunc{&i};
74
- absl::utility_internal::IfConstexpr<true>(
75
- std::move(func), HasFooRValue{});
76
- EXPECT_EQ(i, 1);
77
- }
78
-
79
- } // namespace