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,1615 +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/optional.h"
16
-
17
- // This test is a no-op when absl::optional is an alias for std::optional.
18
- #if !defined(ABSL_USES_STD_OPTIONAL)
19
-
20
- #include <string>
21
- #include <type_traits>
22
- #include <utility>
23
-
24
- #include "gtest/gtest.h"
25
- #include "absl/base/config.h"
26
- #include "absl/log/log.h"
27
- #include "absl/meta/type_traits.h"
28
- #include "absl/strings/string_view.h"
29
-
30
- #if defined(__cplusplus) && __cplusplus >= 202002L
31
- // In C++20, volatile-qualified return types are deprecated.
32
- #define ABSL_VOLATILE_RETURN_TYPES_DEPRECATED 1
33
- #endif
34
-
35
- // The following types help test an internal compiler error in GCC5 though
36
- // GCC10. The case OptionalTest.InternalCompilerErrorInGcc5ToGcc10 crashes the
37
- // compiler without a workaround. This test case should remain at the beginning
38
- // of the file as the internal compiler error is sensitive to other constructs
39
- // in this file.
40
- template <class T, class...>
41
- using GccIceHelper1 = T;
42
- template <typename T>
43
- struct GccIceHelper2 {};
44
- template <typename T>
45
- class GccIce {
46
- template <typename U,
47
- typename SecondTemplateArgHasToExistForSomeReason = void,
48
- typename DependentType = void,
49
- typename = std::is_assignable<GccIceHelper1<T, DependentType>&, U>>
50
- GccIce& operator=(GccIceHelper2<U> const&) {}
51
- };
52
-
53
- TEST(OptionalTest, InternalCompilerErrorInGcc5ToGcc10) {
54
- GccIce<int> instantiate_ice_with_same_type_as_optional;
55
- static_cast<void>(instantiate_ice_with_same_type_as_optional);
56
- absl::optional<int> val1;
57
- absl::optional<int> val2;
58
- val1 = val2;
59
- }
60
-
61
- struct Hashable {};
62
-
63
- namespace std {
64
- template <>
65
- struct hash<Hashable> {
66
- size_t operator()(const Hashable&) { return 0; }
67
- };
68
- } // namespace std
69
-
70
- struct NonHashable {};
71
-
72
- namespace {
73
-
74
- std::string TypeQuals(std::string&) { return "&"; }
75
- std::string TypeQuals(std::string&&) { return "&&"; }
76
- std::string TypeQuals(const std::string&) { return "c&"; }
77
- std::string TypeQuals(const std::string&&) { return "c&&"; }
78
-
79
- struct StructorListener {
80
- int construct0 = 0;
81
- int construct1 = 0;
82
- int construct2 = 0;
83
- int listinit = 0;
84
- int copy = 0;
85
- int move = 0;
86
- int copy_assign = 0;
87
- int move_assign = 0;
88
- int destruct = 0;
89
- int volatile_copy = 0;
90
- int volatile_move = 0;
91
- int volatile_copy_assign = 0;
92
- int volatile_move_assign = 0;
93
- };
94
-
95
- // Suppress MSVC warnings.
96
- // 4521: multiple copy constructors specified
97
- // 4522: multiple assignment operators specified
98
- // We wrote multiple of them to test that the correct overloads are selected.
99
- #ifdef _MSC_VER
100
- #pragma warning(push)
101
- #pragma warning(disable : 4521)
102
- #pragma warning(disable : 4522)
103
- #endif
104
- struct Listenable {
105
- static StructorListener* listener;
106
-
107
- Listenable() { ++listener->construct0; }
108
- explicit Listenable(int /*unused*/) { ++listener->construct1; }
109
- Listenable(int /*unused*/, int /*unused*/) { ++listener->construct2; }
110
- Listenable(std::initializer_list<int> /*unused*/) { ++listener->listinit; }
111
- Listenable(const Listenable& /*unused*/) { ++listener->copy; }
112
- Listenable(const volatile Listenable& /*unused*/) {
113
- ++listener->volatile_copy;
114
- }
115
- Listenable(volatile Listenable&& /*unused*/) { ++listener->volatile_move; }
116
- Listenable(Listenable&& /*unused*/) { ++listener->move; }
117
- Listenable& operator=(const Listenable& /*unused*/) {
118
- ++listener->copy_assign;
119
- return *this;
120
- }
121
- Listenable& operator=(Listenable&& /*unused*/) {
122
- ++listener->move_assign;
123
- return *this;
124
- }
125
- // use void return type instead of volatile T& to work around GCC warning
126
- // when the assignment's returned reference is ignored.
127
- void operator=(const volatile Listenable& /*unused*/) volatile {
128
- ++listener->volatile_copy_assign;
129
- }
130
- void operator=(volatile Listenable&& /*unused*/) volatile {
131
- ++listener->volatile_move_assign;
132
- }
133
- ~Listenable() { ++listener->destruct; }
134
- };
135
- #ifdef _MSC_VER
136
- #pragma warning(pop)
137
- #endif
138
-
139
- StructorListener* Listenable::listener = nullptr;
140
-
141
- struct ConstexprType {
142
- enum CtorTypes {
143
- kCtorDefault,
144
- kCtorInt,
145
- kCtorInitializerList,
146
- kCtorConstChar
147
- };
148
- constexpr ConstexprType() : x(kCtorDefault) {}
149
- constexpr explicit ConstexprType(int i) : x(kCtorInt) {}
150
- constexpr ConstexprType(std::initializer_list<int> il)
151
- : x(kCtorInitializerList) {}
152
- constexpr ConstexprType(const char*) // NOLINT(runtime/explicit)
153
- : x(kCtorConstChar) {}
154
- int x;
155
- };
156
-
157
- struct Copyable {
158
- Copyable() {}
159
- Copyable(const Copyable&) {}
160
- Copyable& operator=(const Copyable&) { return *this; }
161
- };
162
-
163
- struct MoveableThrow {
164
- MoveableThrow() {}
165
- MoveableThrow(MoveableThrow&&) {}
166
- MoveableThrow& operator=(MoveableThrow&&) { return *this; }
167
- };
168
-
169
- struct MoveableNoThrow {
170
- MoveableNoThrow() {}
171
- MoveableNoThrow(MoveableNoThrow&&) noexcept {}
172
- MoveableNoThrow& operator=(MoveableNoThrow&&) noexcept { return *this; }
173
- };
174
-
175
- struct NonMovable {
176
- NonMovable() {}
177
- NonMovable(const NonMovable&) = delete;
178
- NonMovable& operator=(const NonMovable&) = delete;
179
- NonMovable(NonMovable&&) = delete;
180
- NonMovable& operator=(NonMovable&&) = delete;
181
- };
182
-
183
- struct NoDefault {
184
- NoDefault() = delete;
185
- NoDefault(const NoDefault&) {}
186
- NoDefault& operator=(const NoDefault&) { return *this; }
187
- };
188
-
189
- struct ConvertsFromInPlaceT {
190
- ConvertsFromInPlaceT(absl::in_place_t) {} // NOLINT
191
- };
192
-
193
- TEST(optionalTest, DefaultConstructor) {
194
- absl::optional<int> empty;
195
- EXPECT_FALSE(empty);
196
- constexpr absl::optional<int> cempty;
197
- static_assert(!cempty.has_value(), "");
198
- EXPECT_TRUE(
199
- std::is_nothrow_default_constructible<absl::optional<int>>::value);
200
- }
201
-
202
- TEST(optionalTest, nulloptConstructor) {
203
- absl::optional<int> empty(absl::nullopt);
204
- EXPECT_FALSE(empty);
205
- constexpr absl::optional<int> cempty{absl::nullopt};
206
- static_assert(!cempty.has_value(), "");
207
- EXPECT_TRUE((std::is_nothrow_constructible<absl::optional<int>,
208
- absl::nullopt_t>::value));
209
- }
210
-
211
- TEST(optionalTest, CopyConstructor) {
212
- {
213
- absl::optional<int> empty, opt42 = 42;
214
- absl::optional<int> empty_copy(empty);
215
- EXPECT_FALSE(empty_copy);
216
- absl::optional<int> opt42_copy(opt42);
217
- EXPECT_TRUE(opt42_copy);
218
- EXPECT_EQ(42, *opt42_copy);
219
- }
220
- {
221
- absl::optional<const int> empty, opt42 = 42;
222
- absl::optional<const int> empty_copy(empty);
223
- EXPECT_FALSE(empty_copy);
224
- absl::optional<const int> opt42_copy(opt42);
225
- EXPECT_TRUE(opt42_copy);
226
- EXPECT_EQ(42, *opt42_copy);
227
- }
228
- #if !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
229
- {
230
- absl::optional<volatile int> empty, opt42 = 42;
231
- absl::optional<volatile int> empty_copy(empty);
232
- EXPECT_FALSE(empty_copy);
233
- absl::optional<volatile int> opt42_copy(opt42);
234
- EXPECT_TRUE(opt42_copy);
235
- EXPECT_EQ(42, *opt42_copy);
236
- }
237
- #endif
238
- // test copyablility
239
- EXPECT_TRUE(std::is_copy_constructible<absl::optional<int>>::value);
240
- EXPECT_TRUE(std::is_copy_constructible<absl::optional<Copyable>>::value);
241
- EXPECT_FALSE(
242
- std::is_copy_constructible<absl::optional<MoveableThrow>>::value);
243
- EXPECT_FALSE(
244
- std::is_copy_constructible<absl::optional<MoveableNoThrow>>::value);
245
- EXPECT_FALSE(std::is_copy_constructible<absl::optional<NonMovable>>::value);
246
-
247
- EXPECT_FALSE(
248
- absl::is_trivially_copy_constructible<absl::optional<Copyable>>::value);
249
- EXPECT_TRUE(
250
- absl::is_trivially_copy_constructible<absl::optional<int>>::value);
251
- EXPECT_TRUE(
252
- absl::is_trivially_copy_constructible<absl::optional<const int>>::value);
253
- #if !defined(_MSC_VER) && !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
254
- // See defect report "Trivial copy/move constructor for class with volatile
255
- // member" at
256
- // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2094
257
- // A class with non-static data member of volatile-qualified type should still
258
- // have a trivial copy constructor if the data member is trivial.
259
- // Also a cv-qualified scalar type should be trivially copyable.
260
- EXPECT_TRUE(absl::is_trivially_copy_constructible<
261
- absl::optional<volatile int>>::value);
262
- #endif // !defined(_MSC_VER) && !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
263
-
264
- // constexpr copy constructor for trivially copyable types
265
- {
266
- constexpr absl::optional<int> o1;
267
- constexpr absl::optional<int> o2 = o1;
268
- static_assert(!o2, "");
269
- }
270
- {
271
- constexpr absl::optional<int> o1 = 42;
272
- constexpr absl::optional<int> o2 = o1;
273
- static_assert(o2, "");
274
- static_assert(*o2 == 42, "");
275
- }
276
- {
277
- struct TrivialCopyable {
278
- constexpr TrivialCopyable() : x(0) {}
279
- constexpr explicit TrivialCopyable(int i) : x(i) {}
280
- int x;
281
- };
282
- constexpr absl::optional<TrivialCopyable> o1(42);
283
- constexpr absl::optional<TrivialCopyable> o2 = o1;
284
- static_assert(o2, "");
285
- static_assert((*o2).x == 42, "");
286
- #ifndef ABSL_GLIBCXX_OPTIONAL_TRIVIALITY_BUG
287
- EXPECT_TRUE(absl::is_trivially_copy_constructible<
288
- absl::optional<TrivialCopyable>>::value);
289
- EXPECT_TRUE(absl::is_trivially_copy_constructible<
290
- absl::optional<const TrivialCopyable>>::value);
291
- #endif
292
- #if !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
293
- EXPECT_FALSE(std::is_copy_constructible<
294
- absl::optional<volatile TrivialCopyable>>::value);
295
- #endif // !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
296
- }
297
- }
298
-
299
- TEST(optionalTest, MoveConstructor) {
300
- absl::optional<int> empty, opt42 = 42;
301
- absl::optional<int> empty_move(std::move(empty));
302
- EXPECT_FALSE(empty_move);
303
- absl::optional<int> opt42_move(std::move(opt42));
304
- EXPECT_TRUE(opt42_move);
305
- EXPECT_EQ(42, opt42_move);
306
- // test movability
307
- EXPECT_TRUE(std::is_move_constructible<absl::optional<int>>::value);
308
- EXPECT_TRUE(std::is_move_constructible<absl::optional<Copyable>>::value);
309
- EXPECT_TRUE(std::is_move_constructible<absl::optional<MoveableThrow>>::value);
310
- EXPECT_TRUE(
311
- std::is_move_constructible<absl::optional<MoveableNoThrow>>::value);
312
- EXPECT_FALSE(std::is_move_constructible<absl::optional<NonMovable>>::value);
313
- // test noexcept
314
- EXPECT_TRUE(std::is_nothrow_move_constructible<absl::optional<int>>::value);
315
- EXPECT_EQ(
316
- absl::default_allocator_is_nothrow::value,
317
- std::is_nothrow_move_constructible<absl::optional<MoveableThrow>>::value);
318
- EXPECT_TRUE(std::is_nothrow_move_constructible<
319
- absl::optional<MoveableNoThrow>>::value);
320
- }
321
-
322
- TEST(optionalTest, Destructor) {
323
- struct Trivial {};
324
-
325
- struct NonTrivial {
326
- NonTrivial(const NonTrivial&) {}
327
- NonTrivial& operator=(const NonTrivial&) { return *this; }
328
- ~NonTrivial() {}
329
- };
330
-
331
- EXPECT_TRUE(std::is_trivially_destructible<absl::optional<int>>::value);
332
- EXPECT_TRUE(std::is_trivially_destructible<absl::optional<Trivial>>::value);
333
- EXPECT_FALSE(
334
- std::is_trivially_destructible<absl::optional<NonTrivial>>::value);
335
- }
336
-
337
- TEST(optionalTest, InPlaceConstructor) {
338
- constexpr absl::optional<ConstexprType> opt0{absl::in_place_t()};
339
- static_assert(opt0, "");
340
- static_assert((*opt0).x == ConstexprType::kCtorDefault, "");
341
- constexpr absl::optional<ConstexprType> opt1{absl::in_place_t(), 1};
342
- static_assert(opt1, "");
343
- static_assert((*opt1).x == ConstexprType::kCtorInt, "");
344
- constexpr absl::optional<ConstexprType> opt2{absl::in_place_t(), {1, 2}};
345
- static_assert(opt2, "");
346
- static_assert((*opt2).x == ConstexprType::kCtorInitializerList, "");
347
-
348
- EXPECT_FALSE((std::is_constructible<absl::optional<ConvertsFromInPlaceT>,
349
- absl::in_place_t>::value));
350
- EXPECT_FALSE((std::is_constructible<absl::optional<ConvertsFromInPlaceT>,
351
- const absl::in_place_t&>::value));
352
- EXPECT_TRUE(
353
- (std::is_constructible<absl::optional<ConvertsFromInPlaceT>,
354
- absl::in_place_t, absl::in_place_t>::value));
355
-
356
- EXPECT_FALSE((std::is_constructible<absl::optional<NoDefault>,
357
- absl::in_place_t>::value));
358
- EXPECT_FALSE((std::is_constructible<absl::optional<NoDefault>,
359
- absl::in_place_t&&>::value));
360
- }
361
-
362
- // template<U=T> optional(U&&);
363
- TEST(optionalTest, ValueConstructor) {
364
- constexpr absl::optional<int> opt0(0);
365
- static_assert(opt0, "");
366
- static_assert(*opt0 == 0, "");
367
- EXPECT_TRUE((std::is_convertible<int, absl::optional<int>>::value));
368
- // Copy initialization ( = "abc") won't work due to optional(optional&&)
369
- // is not constexpr. Use list initialization instead. This invokes
370
- // absl::optional<ConstexprType>::absl::optional<U>(U&&), with U = const char
371
- // (&) [4], which direct-initializes the ConstexprType value held by the
372
- // optional via ConstexprType::ConstexprType(const char*).
373
- constexpr absl::optional<ConstexprType> opt1 = {"abc"};
374
- static_assert(opt1, "");
375
- static_assert(ConstexprType::kCtorConstChar == (*opt1).x, "");
376
- EXPECT_TRUE(
377
- (std::is_convertible<const char*, absl::optional<ConstexprType>>::value));
378
- // direct initialization
379
- constexpr absl::optional<ConstexprType> opt2{2};
380
- static_assert(opt2, "");
381
- static_assert(ConstexprType::kCtorInt == (*opt2).x, "");
382
- EXPECT_FALSE(
383
- (std::is_convertible<int, absl::optional<ConstexprType>>::value));
384
-
385
- // this invokes absl::optional<int>::optional(int&&)
386
- // NOTE: this has different behavior than assignment, e.g.
387
- // "opt3 = {};" clears the optional rather than setting the value to 0
388
- // According to C++17 standard N4659 [over.ics.list] 16.3.3.1.5, (9.2)- "if
389
- // the initializer list has no elements, the implicit conversion is the
390
- // identity conversion", so `optional(int&&)` should be a better match than
391
- // `optional(optional&&)` which is a user-defined conversion.
392
- // Note: GCC 7 has a bug with this overload selection when compiled with
393
- // `-std=c++17`.
394
- #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ == 7 && \
395
- __cplusplus == 201703L
396
- #define ABSL_GCC7_OVER_ICS_LIST_BUG 1
397
- #endif
398
- #ifndef ABSL_GCC7_OVER_ICS_LIST_BUG
399
- constexpr absl::optional<int> opt3({});
400
- static_assert(opt3, "");
401
- static_assert(*opt3 == 0, "");
402
- #endif
403
-
404
- // this invokes the move constructor with a default constructed optional
405
- // because non-template function is a better match than template function.
406
- absl::optional<ConstexprType> opt4({});
407
- EXPECT_FALSE(opt4);
408
- }
409
-
410
- struct Implicit {};
411
-
412
- struct Explicit {};
413
-
414
- struct Convert {
415
- Convert(const Implicit&) // NOLINT(runtime/explicit)
416
- : implicit(true), move(false) {}
417
- Convert(Implicit&&) // NOLINT(runtime/explicit)
418
- : implicit(true), move(true) {}
419
- explicit Convert(const Explicit&) : implicit(false), move(false) {}
420
- explicit Convert(Explicit&&) : implicit(false), move(true) {}
421
-
422
- bool implicit;
423
- bool move;
424
- };
425
-
426
- struct ConvertFromOptional {
427
- ConvertFromOptional(const Implicit&) // NOLINT(runtime/explicit)
428
- : implicit(true), move(false), from_optional(false) {}
429
- ConvertFromOptional(Implicit&&) // NOLINT(runtime/explicit)
430
- : implicit(true), move(true), from_optional(false) {}
431
- ConvertFromOptional(
432
- const absl::optional<Implicit>&) // NOLINT(runtime/explicit)
433
- : implicit(true), move(false), from_optional(true) {}
434
- ConvertFromOptional(absl::optional<Implicit>&&) // NOLINT(runtime/explicit)
435
- : implicit(true), move(true), from_optional(true) {}
436
- explicit ConvertFromOptional(const Explicit&)
437
- : implicit(false), move(false), from_optional(false) {}
438
- explicit ConvertFromOptional(Explicit&&)
439
- : implicit(false), move(true), from_optional(false) {}
440
- explicit ConvertFromOptional(const absl::optional<Explicit>&)
441
- : implicit(false), move(false), from_optional(true) {}
442
- explicit ConvertFromOptional(absl::optional<Explicit>&&)
443
- : implicit(false), move(true), from_optional(true) {}
444
-
445
- bool implicit;
446
- bool move;
447
- bool from_optional;
448
- };
449
-
450
- TEST(optionalTest, ConvertingConstructor) {
451
- absl::optional<Implicit> i_empty;
452
- absl::optional<Implicit> i(absl::in_place);
453
- absl::optional<Explicit> e_empty;
454
- absl::optional<Explicit> e(absl::in_place);
455
- {
456
- // implicitly constructing absl::optional<Convert> from
457
- // absl::optional<Implicit>
458
- absl::optional<Convert> empty = i_empty;
459
- EXPECT_FALSE(empty);
460
- absl::optional<Convert> opt_copy = i;
461
- EXPECT_TRUE(opt_copy);
462
- EXPECT_TRUE(opt_copy->implicit);
463
- EXPECT_FALSE(opt_copy->move);
464
- absl::optional<Convert> opt_move = absl::optional<Implicit>(absl::in_place);
465
- EXPECT_TRUE(opt_move);
466
- EXPECT_TRUE(opt_move->implicit);
467
- EXPECT_TRUE(opt_move->move);
468
- }
469
- {
470
- // explicitly constructing absl::optional<Convert> from
471
- // absl::optional<Explicit>
472
- absl::optional<Convert> empty(e_empty);
473
- EXPECT_FALSE(empty);
474
- absl::optional<Convert> opt_copy(e);
475
- EXPECT_TRUE(opt_copy);
476
- EXPECT_FALSE(opt_copy->implicit);
477
- EXPECT_FALSE(opt_copy->move);
478
- EXPECT_FALSE((std::is_convertible<const absl::optional<Explicit>&,
479
- absl::optional<Convert>>::value));
480
- absl::optional<Convert> opt_move{absl::optional<Explicit>(absl::in_place)};
481
- EXPECT_TRUE(opt_move);
482
- EXPECT_FALSE(opt_move->implicit);
483
- EXPECT_TRUE(opt_move->move);
484
- EXPECT_FALSE((std::is_convertible<absl::optional<Explicit>&&,
485
- absl::optional<Convert>>::value));
486
- }
487
- {
488
- // implicitly constructing absl::optional<ConvertFromOptional> from
489
- // absl::optional<Implicit> via
490
- // ConvertFromOptional(absl::optional<Implicit>&&) check that
491
- // ConvertFromOptional(Implicit&&) is NOT called
492
- static_assert(
493
- std::is_convertible<absl::optional<Implicit>,
494
- absl::optional<ConvertFromOptional>>::value,
495
- "");
496
- absl::optional<ConvertFromOptional> opt0 = i_empty;
497
- EXPECT_TRUE(opt0);
498
- EXPECT_TRUE(opt0->implicit);
499
- EXPECT_FALSE(opt0->move);
500
- EXPECT_TRUE(opt0->from_optional);
501
- absl::optional<ConvertFromOptional> opt1 = absl::optional<Implicit>();
502
- EXPECT_TRUE(opt1);
503
- EXPECT_TRUE(opt1->implicit);
504
- EXPECT_TRUE(opt1->move);
505
- EXPECT_TRUE(opt1->from_optional);
506
- }
507
- {
508
- // implicitly constructing absl::optional<ConvertFromOptional> from
509
- // absl::optional<Explicit> via
510
- // ConvertFromOptional(absl::optional<Explicit>&&) check that
511
- // ConvertFromOptional(Explicit&&) is NOT called
512
- absl::optional<ConvertFromOptional> opt0(e_empty);
513
- EXPECT_TRUE(opt0);
514
- EXPECT_FALSE(opt0->implicit);
515
- EXPECT_FALSE(opt0->move);
516
- EXPECT_TRUE(opt0->from_optional);
517
- EXPECT_FALSE(
518
- (std::is_convertible<const absl::optional<Explicit>&,
519
- absl::optional<ConvertFromOptional>>::value));
520
- absl::optional<ConvertFromOptional> opt1{absl::optional<Explicit>()};
521
- EXPECT_TRUE(opt1);
522
- EXPECT_FALSE(opt1->implicit);
523
- EXPECT_TRUE(opt1->move);
524
- EXPECT_TRUE(opt1->from_optional);
525
- EXPECT_FALSE(
526
- (std::is_convertible<absl::optional<Explicit>&&,
527
- absl::optional<ConvertFromOptional>>::value));
528
- }
529
- }
530
-
531
- TEST(optionalTest, StructorBasic) {
532
- StructorListener listener;
533
- Listenable::listener = &listener;
534
- {
535
- absl::optional<Listenable> empty;
536
- EXPECT_FALSE(empty);
537
- absl::optional<Listenable> opt0(absl::in_place);
538
- EXPECT_TRUE(opt0);
539
- absl::optional<Listenable> opt1(absl::in_place, 1);
540
- EXPECT_TRUE(opt1);
541
- absl::optional<Listenable> opt2(absl::in_place, 1, 2);
542
- EXPECT_TRUE(opt2);
543
- }
544
- EXPECT_EQ(1, listener.construct0);
545
- EXPECT_EQ(1, listener.construct1);
546
- EXPECT_EQ(1, listener.construct2);
547
- EXPECT_EQ(3, listener.destruct);
548
- }
549
-
550
- TEST(optionalTest, CopyMoveStructor) {
551
- StructorListener listener;
552
- Listenable::listener = &listener;
553
- absl::optional<Listenable> original(absl::in_place);
554
- EXPECT_EQ(1, listener.construct0);
555
- EXPECT_EQ(0, listener.copy);
556
- EXPECT_EQ(0, listener.move);
557
- absl::optional<Listenable> copy(original);
558
- EXPECT_EQ(1, listener.construct0);
559
- EXPECT_EQ(1, listener.copy);
560
- EXPECT_EQ(0, listener.move);
561
- absl::optional<Listenable> move(std::move(original));
562
- EXPECT_EQ(1, listener.construct0);
563
- EXPECT_EQ(1, listener.copy);
564
- EXPECT_EQ(1, listener.move);
565
- }
566
-
567
- TEST(optionalTest, ListInit) {
568
- StructorListener listener;
569
- Listenable::listener = &listener;
570
- absl::optional<Listenable> listinit1(absl::in_place, {1});
571
- absl::optional<Listenable> listinit2(absl::in_place, {1, 2});
572
- EXPECT_EQ(2, listener.listinit);
573
- }
574
-
575
- TEST(optionalTest, AssignFromNullopt) {
576
- absl::optional<int> opt(1);
577
- opt = absl::nullopt;
578
- EXPECT_FALSE(opt);
579
-
580
- StructorListener listener;
581
- Listenable::listener = &listener;
582
- absl::optional<Listenable> opt1(absl::in_place);
583
- opt1 = absl::nullopt;
584
- EXPECT_FALSE(opt1);
585
- EXPECT_EQ(1, listener.construct0);
586
- EXPECT_EQ(1, listener.destruct);
587
-
588
- EXPECT_TRUE((
589
- std::is_nothrow_assignable<absl::optional<int>, absl::nullopt_t>::value));
590
- EXPECT_TRUE((std::is_nothrow_assignable<absl::optional<Listenable>,
591
- absl::nullopt_t>::value));
592
- }
593
-
594
- TEST(optionalTest, CopyAssignment) {
595
- const absl::optional<int> empty, opt1 = 1, opt2 = 2;
596
- absl::optional<int> empty_to_opt1, opt1_to_opt2, opt2_to_empty;
597
-
598
- EXPECT_FALSE(empty_to_opt1);
599
- empty_to_opt1 = empty;
600
- EXPECT_FALSE(empty_to_opt1);
601
- empty_to_opt1 = opt1;
602
- EXPECT_TRUE(empty_to_opt1);
603
- EXPECT_EQ(1, empty_to_opt1.value());
604
-
605
- EXPECT_FALSE(opt1_to_opt2);
606
- opt1_to_opt2 = opt1;
607
- EXPECT_TRUE(opt1_to_opt2);
608
- EXPECT_EQ(1, opt1_to_opt2.value());
609
- opt1_to_opt2 = opt2;
610
- EXPECT_TRUE(opt1_to_opt2);
611
- EXPECT_EQ(2, opt1_to_opt2.value());
612
-
613
- EXPECT_FALSE(opt2_to_empty);
614
- opt2_to_empty = opt2;
615
- EXPECT_TRUE(opt2_to_empty);
616
- EXPECT_EQ(2, opt2_to_empty.value());
617
- opt2_to_empty = empty;
618
- EXPECT_FALSE(opt2_to_empty);
619
-
620
- EXPECT_FALSE(absl::is_copy_assignable<absl::optional<const int>>::value);
621
- EXPECT_TRUE(absl::is_copy_assignable<absl::optional<Copyable>>::value);
622
- EXPECT_FALSE(absl::is_copy_assignable<absl::optional<MoveableThrow>>::value);
623
- EXPECT_FALSE(
624
- absl::is_copy_assignable<absl::optional<MoveableNoThrow>>::value);
625
- EXPECT_FALSE(absl::is_copy_assignable<absl::optional<NonMovable>>::value);
626
-
627
- EXPECT_TRUE(absl::is_trivially_copy_assignable<int>::value);
628
- EXPECT_TRUE(absl::is_trivially_copy_assignable<volatile int>::value);
629
-
630
- struct Trivial {
631
- int i;
632
- };
633
- struct NonTrivial {
634
- NonTrivial& operator=(const NonTrivial&) { return *this; }
635
- int i;
636
- };
637
-
638
- EXPECT_TRUE(absl::is_trivially_copy_assignable<Trivial>::value);
639
- EXPECT_FALSE(absl::is_copy_assignable<const Trivial>::value);
640
- EXPECT_FALSE(absl::is_copy_assignable<volatile Trivial>::value);
641
- EXPECT_TRUE(absl::is_copy_assignable<NonTrivial>::value);
642
- EXPECT_FALSE(absl::is_trivially_copy_assignable<NonTrivial>::value);
643
-
644
- #if !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
645
- {
646
- StructorListener listener;
647
- Listenable::listener = &listener;
648
-
649
- absl::optional<volatile Listenable> empty, set(absl::in_place);
650
- EXPECT_EQ(1, listener.construct0);
651
- absl::optional<volatile Listenable> empty_to_empty, empty_to_set,
652
- set_to_empty(absl::in_place), set_to_set(absl::in_place);
653
- EXPECT_EQ(3, listener.construct0);
654
- empty_to_empty = empty; // no effect
655
- empty_to_set = set; // copy construct
656
- set_to_empty = empty; // destruct
657
- set_to_set = set; // copy assign
658
- EXPECT_EQ(1, listener.volatile_copy);
659
- EXPECT_EQ(0, listener.volatile_move);
660
- EXPECT_EQ(1, listener.destruct);
661
- EXPECT_EQ(1, listener.volatile_copy_assign);
662
- }
663
- #endif // !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
664
- }
665
-
666
- TEST(optionalTest, MoveAssignment) {
667
- {
668
- StructorListener listener;
669
- Listenable::listener = &listener;
670
-
671
- absl::optional<Listenable> empty1, empty2, set1(absl::in_place),
672
- set2(absl::in_place);
673
- EXPECT_EQ(2, listener.construct0);
674
- absl::optional<Listenable> empty_to_empty, empty_to_set,
675
- set_to_empty(absl::in_place), set_to_set(absl::in_place);
676
- EXPECT_EQ(4, listener.construct0);
677
- empty_to_empty = std::move(empty1);
678
- empty_to_set = std::move(set1);
679
- set_to_empty = std::move(empty2);
680
- set_to_set = std::move(set2);
681
- EXPECT_EQ(0, listener.copy);
682
- EXPECT_EQ(1, listener.move);
683
- EXPECT_EQ(1, listener.destruct);
684
- EXPECT_EQ(1, listener.move_assign);
685
- }
686
- #if !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
687
- {
688
- StructorListener listener;
689
- Listenable::listener = &listener;
690
-
691
- absl::optional<volatile Listenable> empty1, empty2, set1(absl::in_place),
692
- set2(absl::in_place);
693
- EXPECT_EQ(2, listener.construct0);
694
- absl::optional<volatile Listenable> empty_to_empty, empty_to_set,
695
- set_to_empty(absl::in_place), set_to_set(absl::in_place);
696
- EXPECT_EQ(4, listener.construct0);
697
- empty_to_empty = std::move(empty1); // no effect
698
- empty_to_set = std::move(set1); // move construct
699
- set_to_empty = std::move(empty2); // destruct
700
- set_to_set = std::move(set2); // move assign
701
- EXPECT_EQ(0, listener.volatile_copy);
702
- EXPECT_EQ(1, listener.volatile_move);
703
- EXPECT_EQ(1, listener.destruct);
704
- EXPECT_EQ(1, listener.volatile_move_assign);
705
- }
706
- #endif // !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
707
- EXPECT_FALSE(absl::is_move_assignable<absl::optional<const int>>::value);
708
- EXPECT_TRUE(absl::is_move_assignable<absl::optional<Copyable>>::value);
709
- EXPECT_TRUE(absl::is_move_assignable<absl::optional<MoveableThrow>>::value);
710
- EXPECT_TRUE(absl::is_move_assignable<absl::optional<MoveableNoThrow>>::value);
711
- EXPECT_FALSE(absl::is_move_assignable<absl::optional<NonMovable>>::value);
712
-
713
- EXPECT_FALSE(
714
- std::is_nothrow_move_assignable<absl::optional<MoveableThrow>>::value);
715
- EXPECT_TRUE(
716
- std::is_nothrow_move_assignable<absl::optional<MoveableNoThrow>>::value);
717
- }
718
-
719
- struct NoConvertToOptional {
720
- // disable implicit conversion from const NoConvertToOptional&
721
- // to absl::optional<NoConvertToOptional>.
722
- NoConvertToOptional(const NoConvertToOptional&) = delete;
723
- };
724
-
725
- struct CopyConvert {
726
- CopyConvert(const NoConvertToOptional&);
727
- CopyConvert& operator=(const CopyConvert&) = delete;
728
- CopyConvert& operator=(const NoConvertToOptional&);
729
- };
730
-
731
- struct CopyConvertFromOptional {
732
- CopyConvertFromOptional(const NoConvertToOptional&);
733
- CopyConvertFromOptional(const absl::optional<NoConvertToOptional>&);
734
- CopyConvertFromOptional& operator=(const CopyConvertFromOptional&) = delete;
735
- CopyConvertFromOptional& operator=(const NoConvertToOptional&);
736
- CopyConvertFromOptional& operator=(
737
- const absl::optional<NoConvertToOptional>&);
738
- };
739
-
740
- struct MoveConvert {
741
- MoveConvert(NoConvertToOptional&&);
742
- MoveConvert& operator=(const MoveConvert&) = delete;
743
- MoveConvert& operator=(NoConvertToOptional&&);
744
- };
745
-
746
- struct MoveConvertFromOptional {
747
- MoveConvertFromOptional(NoConvertToOptional&&);
748
- MoveConvertFromOptional(absl::optional<NoConvertToOptional>&&);
749
- MoveConvertFromOptional& operator=(const MoveConvertFromOptional&) = delete;
750
- MoveConvertFromOptional& operator=(NoConvertToOptional&&);
751
- MoveConvertFromOptional& operator=(absl::optional<NoConvertToOptional>&&);
752
- };
753
-
754
- // template <typename U = T> absl::optional<T>& operator=(U&& v);
755
- TEST(optionalTest, ValueAssignment) {
756
- absl::optional<int> opt;
757
- EXPECT_FALSE(opt);
758
- opt = 42;
759
- EXPECT_TRUE(opt);
760
- EXPECT_EQ(42, opt.value());
761
- opt = absl::nullopt;
762
- EXPECT_FALSE(opt);
763
- opt = 42;
764
- EXPECT_TRUE(opt);
765
- EXPECT_EQ(42, opt.value());
766
- opt = 43;
767
- EXPECT_TRUE(opt);
768
- EXPECT_EQ(43, opt.value());
769
- opt = {}; // this should clear optional
770
- EXPECT_FALSE(opt);
771
-
772
- opt = {44};
773
- EXPECT_TRUE(opt);
774
- EXPECT_EQ(44, opt.value());
775
-
776
- // U = const NoConvertToOptional&
777
- EXPECT_TRUE((std::is_assignable<absl::optional<CopyConvert>&,
778
- const NoConvertToOptional&>::value));
779
- // U = const absl::optional<NoConvertToOptional>&
780
- EXPECT_TRUE((std::is_assignable<absl::optional<CopyConvertFromOptional>&,
781
- const NoConvertToOptional&>::value));
782
- // U = const NoConvertToOptional& triggers SFINAE because
783
- // std::is_constructible_v<MoveConvert, const NoConvertToOptional&> is false
784
- EXPECT_FALSE((std::is_assignable<absl::optional<MoveConvert>&,
785
- const NoConvertToOptional&>::value));
786
- // U = NoConvertToOptional
787
- EXPECT_TRUE((std::is_assignable<absl::optional<MoveConvert>&,
788
- NoConvertToOptional&&>::value));
789
- // U = const NoConvertToOptional& triggers SFINAE because
790
- // std::is_constructible_v<MoveConvertFromOptional, const
791
- // NoConvertToOptional&> is false
792
- EXPECT_FALSE((std::is_assignable<absl::optional<MoveConvertFromOptional>&,
793
- const NoConvertToOptional&>::value));
794
- // U = NoConvertToOptional
795
- EXPECT_TRUE((std::is_assignable<absl::optional<MoveConvertFromOptional>&,
796
- NoConvertToOptional&&>::value));
797
- // U = const absl::optional<NoConvertToOptional>&
798
- EXPECT_TRUE(
799
- (std::is_assignable<absl::optional<CopyConvertFromOptional>&,
800
- const absl::optional<NoConvertToOptional>&>::value));
801
- // U = absl::optional<NoConvertToOptional>
802
- EXPECT_TRUE(
803
- (std::is_assignable<absl::optional<MoveConvertFromOptional>&,
804
- absl::optional<NoConvertToOptional>&&>::value));
805
- }
806
-
807
- // template <typename U> absl::optional<T>& operator=(const absl::optional<U>&
808
- // rhs); template <typename U> absl::optional<T>& operator=(absl::optional<U>&&
809
- // rhs);
810
- TEST(optionalTest, ConvertingAssignment) {
811
- absl::optional<int> opt_i;
812
- absl::optional<char> opt_c('c');
813
- opt_i = opt_c;
814
- EXPECT_TRUE(opt_i);
815
- EXPECT_EQ(*opt_c, *opt_i);
816
- opt_i = absl::optional<char>();
817
- EXPECT_FALSE(opt_i);
818
- opt_i = absl::optional<char>('d');
819
- EXPECT_TRUE(opt_i);
820
- EXPECT_EQ('d', *opt_i);
821
-
822
- absl::optional<std::string> opt_str;
823
- absl::optional<const char*> opt_cstr("abc");
824
- opt_str = opt_cstr;
825
- EXPECT_TRUE(opt_str);
826
- EXPECT_EQ(std::string("abc"), *opt_str);
827
- opt_str = absl::optional<const char*>();
828
- EXPECT_FALSE(opt_str);
829
- opt_str = absl::optional<const char*>("def");
830
- EXPECT_TRUE(opt_str);
831
- EXPECT_EQ(std::string("def"), *opt_str);
832
-
833
- // operator=(const absl::optional<U>&) with U = NoConvertToOptional
834
- EXPECT_TRUE(
835
- (std::is_assignable<absl::optional<CopyConvert>,
836
- const absl::optional<NoConvertToOptional>&>::value));
837
- // operator=(const absl::optional<U>&) with U = NoConvertToOptional
838
- // triggers SFINAE because
839
- // std::is_constructible_v<MoveConvert, const NoConvertToOptional&> is false
840
- EXPECT_FALSE(
841
- (std::is_assignable<absl::optional<MoveConvert>&,
842
- const absl::optional<NoConvertToOptional>&>::value));
843
- // operator=(absl::optional<U>&&) with U = NoConvertToOptional
844
- EXPECT_TRUE(
845
- (std::is_assignable<absl::optional<MoveConvert>&,
846
- absl::optional<NoConvertToOptional>&&>::value));
847
- // operator=(const absl::optional<U>&) with U = NoConvertToOptional triggers
848
- // SFINAE because std::is_constructible_v<MoveConvertFromOptional, const
849
- // NoConvertToOptional&> is false. operator=(U&&) with U = const
850
- // absl::optional<NoConverToOptional>& triggers SFINAE because
851
- // std::is_constructible<MoveConvertFromOptional,
852
- // absl::optional<NoConvertToOptional>&&> is true.
853
- EXPECT_FALSE(
854
- (std::is_assignable<absl::optional<MoveConvertFromOptional>&,
855
- const absl::optional<NoConvertToOptional>&>::value));
856
- }
857
-
858
- TEST(optionalTest, ResetAndHasValue) {
859
- StructorListener listener;
860
- Listenable::listener = &listener;
861
- absl::optional<Listenable> opt;
862
- EXPECT_FALSE(opt);
863
- EXPECT_FALSE(opt.has_value());
864
- opt.emplace();
865
- EXPECT_TRUE(opt);
866
- EXPECT_TRUE(opt.has_value());
867
- opt.reset();
868
- EXPECT_FALSE(opt);
869
- EXPECT_FALSE(opt.has_value());
870
- EXPECT_EQ(1, listener.destruct);
871
- opt.reset();
872
- EXPECT_FALSE(opt);
873
- EXPECT_FALSE(opt.has_value());
874
-
875
- constexpr absl::optional<int> empty;
876
- static_assert(!empty.has_value(), "");
877
- constexpr absl::optional<int> nonempty(1);
878
- static_assert(nonempty.has_value(), "");
879
- }
880
-
881
- TEST(optionalTest, Emplace) {
882
- StructorListener listener;
883
- Listenable::listener = &listener;
884
- absl::optional<Listenable> opt;
885
- EXPECT_FALSE(opt);
886
- opt.emplace(1);
887
- EXPECT_TRUE(opt);
888
- opt.emplace(1, 2);
889
- EXPECT_EQ(1, listener.construct1);
890
- EXPECT_EQ(1, listener.construct2);
891
- EXPECT_EQ(1, listener.destruct);
892
-
893
- absl::optional<std::string> o;
894
- EXPECT_TRUE((std::is_same<std::string&, decltype(o.emplace("abc"))>::value));
895
- std::string& ref = o.emplace("abc");
896
- EXPECT_EQ(&ref, &o.value());
897
- }
898
-
899
- TEST(optionalTest, ListEmplace) {
900
- StructorListener listener;
901
- Listenable::listener = &listener;
902
- absl::optional<Listenable> opt;
903
- EXPECT_FALSE(opt);
904
- opt.emplace({1});
905
- EXPECT_TRUE(opt);
906
- opt.emplace({1, 2});
907
- EXPECT_EQ(2, listener.listinit);
908
- EXPECT_EQ(1, listener.destruct);
909
-
910
- absl::optional<Listenable> o;
911
- EXPECT_TRUE((std::is_same<Listenable&, decltype(o.emplace({1}))>::value));
912
- Listenable& ref = o.emplace({1});
913
- EXPECT_EQ(&ref, &o.value());
914
- }
915
-
916
- TEST(optionalTest, Swap) {
917
- absl::optional<int> opt_empty, opt1 = 1, opt2 = 2;
918
- EXPECT_FALSE(opt_empty);
919
- EXPECT_TRUE(opt1);
920
- EXPECT_EQ(1, opt1.value());
921
- EXPECT_TRUE(opt2);
922
- EXPECT_EQ(2, opt2.value());
923
- swap(opt_empty, opt1);
924
- EXPECT_FALSE(opt1);
925
- EXPECT_TRUE(opt_empty);
926
- EXPECT_EQ(1, opt_empty.value());
927
- EXPECT_TRUE(opt2);
928
- EXPECT_EQ(2, opt2.value());
929
- swap(opt_empty, opt1);
930
- EXPECT_FALSE(opt_empty);
931
- EXPECT_TRUE(opt1);
932
- EXPECT_EQ(1, opt1.value());
933
- EXPECT_TRUE(opt2);
934
- EXPECT_EQ(2, opt2.value());
935
- swap(opt1, opt2);
936
- EXPECT_FALSE(opt_empty);
937
- EXPECT_TRUE(opt1);
938
- EXPECT_EQ(2, opt1.value());
939
- EXPECT_TRUE(opt2);
940
- EXPECT_EQ(1, opt2.value());
941
-
942
- EXPECT_TRUE(noexcept(opt1.swap(opt2)));
943
- EXPECT_TRUE(noexcept(swap(opt1, opt2)));
944
- }
945
-
946
- template <int v>
947
- struct DeletedOpAddr {
948
- int value = v;
949
- constexpr DeletedOpAddr() = default;
950
- constexpr const DeletedOpAddr<v>* operator&() const = delete; // NOLINT
951
- DeletedOpAddr<v>* operator&() = delete; // NOLINT
952
- };
953
-
954
- // The static_assert featuring a constexpr call to operator->() is commented out
955
- // to document the fact that the current implementation of absl::optional<T>
956
- // expects such usecases to be malformed and not compile.
957
- TEST(optionalTest, OperatorAddr) {
958
- constexpr int v = -1;
959
- { // constexpr
960
- constexpr absl::optional<DeletedOpAddr<v>> opt(absl::in_place_t{});
961
- static_assert(opt.has_value(), "");
962
- // static_assert(opt->value == v, "");
963
- static_assert((*opt).value == v, "");
964
- }
965
- { // non-constexpr
966
- const absl::optional<DeletedOpAddr<v>> opt(absl::in_place_t{});
967
- EXPECT_TRUE(opt.has_value());
968
- EXPECT_TRUE(opt->value == v);
969
- EXPECT_TRUE((*opt).value == v);
970
- }
971
- }
972
-
973
- TEST(optionalTest, PointerStuff) {
974
- absl::optional<std::string> opt(absl::in_place, "foo");
975
- EXPECT_EQ("foo", *opt);
976
- const auto& opt_const = opt;
977
- EXPECT_EQ("foo", *opt_const);
978
- EXPECT_EQ(opt->size(), 3u);
979
- EXPECT_EQ(opt_const->size(), 3u);
980
-
981
- constexpr absl::optional<ConstexprType> opt1(1);
982
- static_assert((*opt1).x == ConstexprType::kCtorInt, "");
983
- }
984
-
985
- TEST(optionalTest, Value) {
986
- using O = absl::optional<std::string>;
987
- using CO = const absl::optional<std::string>;
988
- using OC = absl::optional<const std::string>;
989
- O lvalue(absl::in_place, "lvalue");
990
- CO clvalue(absl::in_place, "clvalue");
991
- OC lvalue_c(absl::in_place, "lvalue_c");
992
- EXPECT_EQ("lvalue", lvalue.value());
993
- EXPECT_EQ("clvalue", clvalue.value());
994
- EXPECT_EQ("lvalue_c", lvalue_c.value());
995
- EXPECT_EQ("xvalue", O(absl::in_place, "xvalue").value());
996
- EXPECT_EQ("xvalue_c", OC(absl::in_place, "xvalue_c").value());
997
- EXPECT_EQ("cxvalue", CO(absl::in_place, "cxvalue").value());
998
- EXPECT_EQ("&", TypeQuals(lvalue.value()));
999
- EXPECT_EQ("c&", TypeQuals(clvalue.value()));
1000
- EXPECT_EQ("c&", TypeQuals(lvalue_c.value()));
1001
- EXPECT_EQ("&&", TypeQuals(O(absl::in_place, "xvalue").value()));
1002
- EXPECT_EQ("c&&", TypeQuals(CO(absl::in_place, "cxvalue").value()));
1003
- EXPECT_EQ("c&&", TypeQuals(OC(absl::in_place, "xvalue_c").value()));
1004
-
1005
- #if !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
1006
- // test on volatile type
1007
- using OV = absl::optional<volatile int>;
1008
- OV lvalue_v(absl::in_place, 42);
1009
- EXPECT_EQ(42, lvalue_v.value());
1010
- EXPECT_EQ(42, OV(42).value());
1011
- EXPECT_TRUE((std::is_same<volatile int&, decltype(lvalue_v.value())>::value));
1012
- EXPECT_TRUE((std::is_same<volatile int&&, decltype(OV(42).value())>::value));
1013
- #endif // !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
1014
-
1015
- // test exception throw on value()
1016
- absl::optional<int> empty;
1017
- #ifdef ABSL_HAVE_EXCEPTIONS
1018
- EXPECT_THROW((void)empty.value(), absl::bad_optional_access);
1019
- #else
1020
- EXPECT_DEATH_IF_SUPPORTED((void)empty.value(), "Bad optional access");
1021
- #endif
1022
-
1023
- // test constexpr value()
1024
- constexpr absl::optional<int> o1(1);
1025
- static_assert(1 == o1.value(), ""); // const &
1026
- #ifndef _MSC_VER
1027
- using COI = const absl::optional<int>;
1028
- static_assert(2 == COI(2).value(), ""); // const &&
1029
- #endif
1030
- }
1031
-
1032
- TEST(optionalTest, DerefOperator) {
1033
- using O = absl::optional<std::string>;
1034
- using CO = const absl::optional<std::string>;
1035
- using OC = absl::optional<const std::string>;
1036
- O lvalue(absl::in_place, "lvalue");
1037
- CO clvalue(absl::in_place, "clvalue");
1038
- OC lvalue_c(absl::in_place, "lvalue_c");
1039
- EXPECT_EQ("lvalue", *lvalue);
1040
- EXPECT_EQ("clvalue", *clvalue);
1041
- EXPECT_EQ("lvalue_c", *lvalue_c);
1042
- EXPECT_EQ("xvalue", *O(absl::in_place, "xvalue"));
1043
- EXPECT_EQ("xvalue_c", *OC(absl::in_place, "xvalue_c"));
1044
- EXPECT_EQ("cxvalue", *CO(absl::in_place, "cxvalue"));
1045
- EXPECT_EQ("&", TypeQuals(*lvalue));
1046
- EXPECT_EQ("c&", TypeQuals(*clvalue));
1047
- EXPECT_EQ("&&", TypeQuals(*O(absl::in_place, "xvalue")));
1048
- EXPECT_EQ("c&&", TypeQuals(*CO(absl::in_place, "cxvalue")));
1049
- EXPECT_EQ("c&&", TypeQuals(*OC(absl::in_place, "xvalue_c")));
1050
-
1051
- #if !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
1052
- // test on volatile type
1053
- using OV = absl::optional<volatile int>;
1054
- OV lvalue_v(absl::in_place, 42);
1055
- EXPECT_EQ(42, *lvalue_v);
1056
- EXPECT_EQ(42, *OV(42));
1057
- EXPECT_TRUE((std::is_same<volatile int&, decltype(*lvalue_v)>::value));
1058
- EXPECT_TRUE((std::is_same<volatile int&&, decltype(*OV(42))>::value));
1059
- #endif // !defined(ABSL_VOLATILE_RETURN_TYPES_DEPRECATED)
1060
-
1061
- constexpr absl::optional<int> opt1(1);
1062
- static_assert(*opt1 == 1, "");
1063
- #if !defined(_MSC_VER) && !defined(ABSL_SKIP_OVERLOAD_TEST_DUE_TO_GCC_BUG)
1064
- using COI = const absl::optional<int>;
1065
- static_assert(*COI(2) == 2, "");
1066
- #endif
1067
- }
1068
-
1069
- TEST(optionalTest, ValueOr) {
1070
- absl::optional<double> opt_empty, opt_set = 1.2;
1071
- EXPECT_EQ(42.0, opt_empty.value_or(42));
1072
- EXPECT_EQ(1.2, opt_set.value_or(42));
1073
- EXPECT_EQ(42.0, absl::optional<double>().value_or(42));
1074
- EXPECT_EQ(1.2, absl::optional<double>(1.2).value_or(42));
1075
-
1076
- constexpr absl::optional<double> copt_empty, copt_set = {1.2};
1077
- static_assert(42.0 == copt_empty.value_or(42), "");
1078
- static_assert(1.2 == copt_set.value_or(42), "");
1079
- using COD = const absl::optional<double>;
1080
- static_assert(42.0 == COD().value_or(42), "");
1081
- static_assert(1.2 == COD(1.2).value_or(42), "");
1082
- }
1083
-
1084
- // make_optional cannot be constexpr until C++17
1085
- TEST(optionalTest, make_optional) {
1086
- auto opt_int = absl::make_optional(42);
1087
- EXPECT_TRUE((std::is_same<decltype(opt_int), absl::optional<int>>::value));
1088
- EXPECT_EQ(42, opt_int);
1089
-
1090
- StructorListener listener;
1091
- Listenable::listener = &listener;
1092
-
1093
- absl::optional<Listenable> opt0 = absl::make_optional<Listenable>();
1094
- EXPECT_EQ(1, listener.construct0);
1095
- absl::optional<Listenable> opt1 = absl::make_optional<Listenable>(1);
1096
- EXPECT_EQ(1, listener.construct1);
1097
- absl::optional<Listenable> opt2 = absl::make_optional<Listenable>(1, 2);
1098
- EXPECT_EQ(1, listener.construct2);
1099
- absl::optional<Listenable> opt3 = absl::make_optional<Listenable>({1});
1100
- absl::optional<Listenable> opt4 = absl::make_optional<Listenable>({1, 2});
1101
- EXPECT_EQ(2, listener.listinit);
1102
-
1103
- // Constexpr tests on trivially copyable types
1104
- // optional<T> has trivial copy/move ctors when T is trivially copyable.
1105
- // For nontrivial types with constexpr constructors, we need copy elision in
1106
- // C++17 for make_optional to be constexpr.
1107
- {
1108
- constexpr absl::optional<int> c_opt = absl::make_optional(42);
1109
- static_assert(c_opt.value() == 42, "");
1110
- }
1111
- {
1112
- struct TrivialCopyable {
1113
- constexpr TrivialCopyable() : x(0) {}
1114
- constexpr explicit TrivialCopyable(int i) : x(i) {}
1115
- int x;
1116
- };
1117
-
1118
- constexpr TrivialCopyable v;
1119
- constexpr absl::optional<TrivialCopyable> c_opt0 = absl::make_optional(v);
1120
- static_assert((*c_opt0).x == 0, "");
1121
- constexpr absl::optional<TrivialCopyable> c_opt1 =
1122
- absl::make_optional<TrivialCopyable>();
1123
- static_assert((*c_opt1).x == 0, "");
1124
- constexpr absl::optional<TrivialCopyable> c_opt2 =
1125
- absl::make_optional<TrivialCopyable>(42);
1126
- static_assert((*c_opt2).x == 42, "");
1127
- }
1128
- }
1129
-
1130
- template <typename T, typename U>
1131
- void optionalTest_Comparisons_EXPECT_LESS(T x, U y) {
1132
- EXPECT_FALSE(x == y);
1133
- EXPECT_TRUE(x != y);
1134
- EXPECT_TRUE(x < y);
1135
- EXPECT_FALSE(x > y);
1136
- EXPECT_TRUE(x <= y);
1137
- EXPECT_FALSE(x >= y);
1138
- }
1139
-
1140
- template <typename T, typename U>
1141
- void optionalTest_Comparisons_EXPECT_SAME(T x, U y) {
1142
- EXPECT_TRUE(x == y);
1143
- EXPECT_FALSE(x != y);
1144
- EXPECT_FALSE(x < y);
1145
- EXPECT_FALSE(x > y);
1146
- EXPECT_TRUE(x <= y);
1147
- EXPECT_TRUE(x >= y);
1148
- }
1149
-
1150
- template <typename T, typename U>
1151
- void optionalTest_Comparisons_EXPECT_GREATER(T x, U y) {
1152
- EXPECT_FALSE(x == y);
1153
- EXPECT_TRUE(x != y);
1154
- EXPECT_FALSE(x < y);
1155
- EXPECT_TRUE(x > y);
1156
- EXPECT_FALSE(x <= y);
1157
- EXPECT_TRUE(x >= y);
1158
- }
1159
-
1160
- template <typename T, typename U, typename V>
1161
- void TestComparisons() {
1162
- absl::optional<T> ae, a2{2}, a4{4};
1163
- absl::optional<U> be, b2{2}, b4{4};
1164
- V v3 = 3;
1165
-
1166
- // LHS: absl::nullopt, ae, a2, v3, a4
1167
- // RHS: absl::nullopt, be, b2, v3, b4
1168
-
1169
- // optionalTest_Comparisons_EXPECT_NOT_TO_WORK(absl::nullopt,absl::nullopt);
1170
- optionalTest_Comparisons_EXPECT_SAME(absl::nullopt, be);
1171
- optionalTest_Comparisons_EXPECT_LESS(absl::nullopt, b2);
1172
- // optionalTest_Comparisons_EXPECT_NOT_TO_WORK(absl::nullopt,v3);
1173
- optionalTest_Comparisons_EXPECT_LESS(absl::nullopt, b4);
1174
-
1175
- optionalTest_Comparisons_EXPECT_SAME(ae, absl::nullopt);
1176
- optionalTest_Comparisons_EXPECT_SAME(ae, be);
1177
- optionalTest_Comparisons_EXPECT_LESS(ae, b2);
1178
- optionalTest_Comparisons_EXPECT_LESS(ae, v3);
1179
- optionalTest_Comparisons_EXPECT_LESS(ae, b4);
1180
-
1181
- optionalTest_Comparisons_EXPECT_GREATER(a2, absl::nullopt);
1182
- optionalTest_Comparisons_EXPECT_GREATER(a2, be);
1183
- optionalTest_Comparisons_EXPECT_SAME(a2, b2);
1184
- optionalTest_Comparisons_EXPECT_LESS(a2, v3);
1185
- optionalTest_Comparisons_EXPECT_LESS(a2, b4);
1186
-
1187
- // optionalTest_Comparisons_EXPECT_NOT_TO_WORK(v3,absl::nullopt);
1188
- optionalTest_Comparisons_EXPECT_GREATER(v3, be);
1189
- optionalTest_Comparisons_EXPECT_GREATER(v3, b2);
1190
- optionalTest_Comparisons_EXPECT_SAME(v3, v3);
1191
- optionalTest_Comparisons_EXPECT_LESS(v3, b4);
1192
-
1193
- optionalTest_Comparisons_EXPECT_GREATER(a4, absl::nullopt);
1194
- optionalTest_Comparisons_EXPECT_GREATER(a4, be);
1195
- optionalTest_Comparisons_EXPECT_GREATER(a4, b2);
1196
- optionalTest_Comparisons_EXPECT_GREATER(a4, v3);
1197
- optionalTest_Comparisons_EXPECT_SAME(a4, b4);
1198
- }
1199
-
1200
- struct Int1 {
1201
- Int1() = default;
1202
- Int1(int i) : i(i) {} // NOLINT(runtime/explicit)
1203
- int i;
1204
- };
1205
-
1206
- struct Int2 {
1207
- Int2() = default;
1208
- Int2(int i) : i(i) {} // NOLINT(runtime/explicit)
1209
- int i;
1210
- };
1211
-
1212
- // comparison between Int1 and Int2
1213
- constexpr bool operator==(const Int1& lhs, const Int2& rhs) {
1214
- return lhs.i == rhs.i;
1215
- }
1216
- constexpr bool operator!=(const Int1& lhs, const Int2& rhs) {
1217
- return !(lhs == rhs);
1218
- }
1219
- constexpr bool operator<(const Int1& lhs, const Int2& rhs) {
1220
- return lhs.i < rhs.i;
1221
- }
1222
- constexpr bool operator<=(const Int1& lhs, const Int2& rhs) {
1223
- return lhs < rhs || lhs == rhs;
1224
- }
1225
- constexpr bool operator>(const Int1& lhs, const Int2& rhs) {
1226
- return !(lhs <= rhs);
1227
- }
1228
- constexpr bool operator>=(const Int1& lhs, const Int2& rhs) {
1229
- return !(lhs < rhs);
1230
- }
1231
-
1232
- TEST(optionalTest, Comparisons) {
1233
- TestComparisons<int, int, int>();
1234
- TestComparisons<const int, int, int>();
1235
- TestComparisons<Int1, int, int>();
1236
- TestComparisons<int, Int2, int>();
1237
- TestComparisons<Int1, Int2, int>();
1238
-
1239
- // compare absl::optional<std::string> with const char*
1240
- absl::optional<std::string> opt_str = "abc";
1241
- const char* cstr = "abc";
1242
- EXPECT_TRUE(opt_str == cstr);
1243
- // compare absl::optional<std::string> with absl::optional<const char*>
1244
- absl::optional<const char*> opt_cstr = cstr;
1245
- EXPECT_TRUE(opt_str == opt_cstr);
1246
- // compare absl::optional<std::string> with absl::optional<absl::string_view>
1247
- absl::optional<absl::string_view> e1;
1248
- absl::optional<std::string> e2;
1249
- EXPECT_TRUE(e1 == e2);
1250
- }
1251
-
1252
- TEST(optionalTest, SwapRegression) {
1253
- StructorListener listener;
1254
- Listenable::listener = &listener;
1255
-
1256
- {
1257
- absl::optional<Listenable> a;
1258
- absl::optional<Listenable> b(absl::in_place);
1259
- a.swap(b);
1260
- }
1261
-
1262
- EXPECT_EQ(1, listener.construct0);
1263
- EXPECT_EQ(1, listener.move);
1264
- EXPECT_EQ(2, listener.destruct);
1265
-
1266
- {
1267
- absl::optional<Listenable> a(absl::in_place);
1268
- absl::optional<Listenable> b;
1269
- a.swap(b);
1270
- }
1271
-
1272
- EXPECT_EQ(2, listener.construct0);
1273
- EXPECT_EQ(2, listener.move);
1274
- EXPECT_EQ(4, listener.destruct);
1275
- }
1276
-
1277
- TEST(optionalTest, BigStringLeakCheck) {
1278
- constexpr size_t n = 1 << 16;
1279
-
1280
- using OS = absl::optional<std::string>;
1281
-
1282
- OS a;
1283
- OS b = absl::nullopt;
1284
- OS c = std::string(n, 'c');
1285
- std::string sd(n, 'd');
1286
- OS d = sd;
1287
- OS e(absl::in_place, n, 'e');
1288
- OS f;
1289
- f.emplace(n, 'f');
1290
-
1291
- OS ca(a);
1292
- OS cb(b);
1293
- OS cc(c);
1294
- OS cd(d);
1295
- OS ce(e);
1296
-
1297
- OS oa;
1298
- OS ob = absl::nullopt;
1299
- OS oc = std::string(n, 'c');
1300
- std::string sod(n, 'd');
1301
- OS od = sod;
1302
- OS oe(absl::in_place, n, 'e');
1303
- OS of;
1304
- of.emplace(n, 'f');
1305
-
1306
- OS ma(std::move(oa));
1307
- OS mb(std::move(ob));
1308
- OS mc(std::move(oc));
1309
- OS md(std::move(od));
1310
- OS me(std::move(oe));
1311
- OS mf(std::move(of));
1312
-
1313
- OS aa1;
1314
- OS ab1 = absl::nullopt;
1315
- OS ac1 = std::string(n, 'c');
1316
- std::string sad1(n, 'd');
1317
- OS ad1 = sad1;
1318
- OS ae1(absl::in_place, n, 'e');
1319
- OS af1;
1320
- af1.emplace(n, 'f');
1321
-
1322
- OS aa2;
1323
- OS ab2 = absl::nullopt;
1324
- OS ac2 = std::string(n, 'c');
1325
- std::string sad2(n, 'd');
1326
- OS ad2 = sad2;
1327
- OS ae2(absl::in_place, n, 'e');
1328
- OS af2;
1329
- af2.emplace(n, 'f');
1330
-
1331
- aa1 = af2;
1332
- ab1 = ae2;
1333
- ac1 = ad2;
1334
- ad1 = ac2;
1335
- ae1 = ab2;
1336
- af1 = aa2;
1337
-
1338
- OS aa3;
1339
- OS ab3 = absl::nullopt;
1340
- OS ac3 = std::string(n, 'c');
1341
- std::string sad3(n, 'd');
1342
- OS ad3 = sad3;
1343
- OS ae3(absl::in_place, n, 'e');
1344
- OS af3;
1345
- af3.emplace(n, 'f');
1346
-
1347
- aa3 = absl::nullopt;
1348
- ab3 = absl::nullopt;
1349
- ac3 = absl::nullopt;
1350
- ad3 = absl::nullopt;
1351
- ae3 = absl::nullopt;
1352
- af3 = absl::nullopt;
1353
-
1354
- OS aa4;
1355
- OS ab4 = absl::nullopt;
1356
- OS ac4 = std::string(n, 'c');
1357
- std::string sad4(n, 'd');
1358
- OS ad4 = sad4;
1359
- OS ae4(absl::in_place, n, 'e');
1360
- OS af4;
1361
- af4.emplace(n, 'f');
1362
-
1363
- aa4 = OS(absl::in_place, n, 'a');
1364
- ab4 = OS(absl::in_place, n, 'b');
1365
- ac4 = OS(absl::in_place, n, 'c');
1366
- ad4 = OS(absl::in_place, n, 'd');
1367
- ae4 = OS(absl::in_place, n, 'e');
1368
- af4 = OS(absl::in_place, n, 'f');
1369
-
1370
- OS aa5;
1371
- OS ab5 = absl::nullopt;
1372
- OS ac5 = std::string(n, 'c');
1373
- std::string sad5(n, 'd');
1374
- OS ad5 = sad5;
1375
- OS ae5(absl::in_place, n, 'e');
1376
- OS af5;
1377
- af5.emplace(n, 'f');
1378
-
1379
- std::string saa5(n, 'a');
1380
- std::string sab5(n, 'a');
1381
- std::string sac5(n, 'a');
1382
- std::string sad52(n, 'a');
1383
- std::string sae5(n, 'a');
1384
- std::string saf5(n, 'a');
1385
-
1386
- aa5 = saa5;
1387
- ab5 = sab5;
1388
- ac5 = sac5;
1389
- ad5 = sad52;
1390
- ae5 = sae5;
1391
- af5 = saf5;
1392
-
1393
- OS aa6;
1394
- OS ab6 = absl::nullopt;
1395
- OS ac6 = std::string(n, 'c');
1396
- std::string sad6(n, 'd');
1397
- OS ad6 = sad6;
1398
- OS ae6(absl::in_place, n, 'e');
1399
- OS af6;
1400
- af6.emplace(n, 'f');
1401
-
1402
- aa6 = std::string(n, 'a');
1403
- ab6 = std::string(n, 'b');
1404
- ac6 = std::string(n, 'c');
1405
- ad6 = std::string(n, 'd');
1406
- ae6 = std::string(n, 'e');
1407
- af6 = std::string(n, 'f');
1408
-
1409
- OS aa7;
1410
- OS ab7 = absl::nullopt;
1411
- OS ac7 = std::string(n, 'c');
1412
- std::string sad7(n, 'd');
1413
- OS ad7 = sad7;
1414
- OS ae7(absl::in_place, n, 'e');
1415
- OS af7;
1416
- af7.emplace(n, 'f');
1417
-
1418
- aa7.emplace(n, 'A');
1419
- ab7.emplace(n, 'B');
1420
- ac7.emplace(n, 'C');
1421
- ad7.emplace(n, 'D');
1422
- ae7.emplace(n, 'E');
1423
- af7.emplace(n, 'F');
1424
- }
1425
-
1426
- TEST(optionalTest, MoveAssignRegression) {
1427
- StructorListener listener;
1428
- Listenable::listener = &listener;
1429
-
1430
- {
1431
- absl::optional<Listenable> a;
1432
- Listenable b;
1433
- a = std::move(b);
1434
- }
1435
-
1436
- EXPECT_EQ(1, listener.construct0);
1437
- EXPECT_EQ(1, listener.move);
1438
- EXPECT_EQ(2, listener.destruct);
1439
- }
1440
-
1441
- TEST(optionalTest, ValueType) {
1442
- EXPECT_TRUE((std::is_same<absl::optional<int>::value_type, int>::value));
1443
- EXPECT_TRUE((std::is_same<absl::optional<std::string>::value_type,
1444
- std::string>::value));
1445
- EXPECT_FALSE(
1446
- (std::is_same<absl::optional<int>::value_type, absl::nullopt_t>::value));
1447
- }
1448
-
1449
- template <typename T>
1450
- struct is_hash_enabled_for {
1451
- template <typename U, typename = decltype(std::hash<U>()(std::declval<U>()))>
1452
- static std::true_type test(int);
1453
-
1454
- template <typename U>
1455
- static std::false_type test(...);
1456
-
1457
- static constexpr bool value = decltype(test<T>(0))::value;
1458
- };
1459
-
1460
- TEST(optionalTest, Hash) {
1461
- std::hash<absl::optional<int>> hash;
1462
- std::set<size_t> hashcodes;
1463
- hashcodes.insert(hash(absl::nullopt));
1464
- for (int i = 0; i < 100; ++i) {
1465
- hashcodes.insert(hash(i));
1466
- }
1467
- EXPECT_GT(hashcodes.size(), 90u);
1468
-
1469
- static_assert(is_hash_enabled_for<absl::optional<int>>::value, "");
1470
- static_assert(is_hash_enabled_for<absl::optional<Hashable>>::value, "");
1471
- static_assert(
1472
- absl::type_traits_internal::IsHashable<absl::optional<int>>::value, "");
1473
- static_assert(
1474
- absl::type_traits_internal::IsHashable<absl::optional<Hashable>>::value,
1475
- "");
1476
- absl::type_traits_internal::AssertHashEnabled<absl::optional<int>>();
1477
- absl::type_traits_internal::AssertHashEnabled<absl::optional<Hashable>>();
1478
-
1479
- #if ABSL_META_INTERNAL_STD_HASH_SFINAE_FRIENDLY_
1480
- static_assert(!is_hash_enabled_for<absl::optional<NonHashable>>::value, "");
1481
- static_assert(!absl::type_traits_internal::IsHashable<
1482
- absl::optional<NonHashable>>::value,
1483
- "");
1484
- #endif
1485
-
1486
- // libstdc++ std::optional is missing remove_const_t, i.e. it's using
1487
- // std::hash<T> rather than std::hash<std::remove_const_t<T>>.
1488
- // Reference: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82262
1489
- #ifndef __GLIBCXX__
1490
- static_assert(is_hash_enabled_for<absl::optional<const int>>::value, "");
1491
- static_assert(is_hash_enabled_for<absl::optional<const Hashable>>::value, "");
1492
- std::hash<absl::optional<const int>> c_hash;
1493
- for (int i = 0; i < 100; ++i) {
1494
- EXPECT_EQ(hash(i), c_hash(i));
1495
- }
1496
- #endif
1497
- }
1498
-
1499
- struct MoveMeNoThrow {
1500
- MoveMeNoThrow() : x(0) {}
1501
- [[noreturn]] MoveMeNoThrow(const MoveMeNoThrow& other) : x(other.x) {
1502
- LOG(FATAL) << "Should not be called.";
1503
- }
1504
- MoveMeNoThrow(MoveMeNoThrow&& other) noexcept : x(other.x) {}
1505
- int x;
1506
- };
1507
-
1508
- struct MoveMeThrow {
1509
- MoveMeThrow() : x(0) {}
1510
- MoveMeThrow(const MoveMeThrow& other) : x(other.x) {}
1511
- MoveMeThrow(MoveMeThrow&& other) : x(other.x) {}
1512
- int x;
1513
- };
1514
-
1515
- TEST(optionalTest, NoExcept) {
1516
- static_assert(
1517
- std::is_nothrow_move_constructible<absl::optional<MoveMeNoThrow>>::value,
1518
- "");
1519
- static_assert(absl::default_allocator_is_nothrow::value ==
1520
- std::is_nothrow_move_constructible<
1521
- absl::optional<MoveMeThrow>>::value,
1522
- "");
1523
- std::vector<absl::optional<MoveMeNoThrow>> v;
1524
- for (int i = 0; i < 10; ++i) v.emplace_back();
1525
- }
1526
-
1527
- struct AnyLike {
1528
- AnyLike(AnyLike&&) = default;
1529
- AnyLike(const AnyLike&) = default;
1530
-
1531
- template <typename ValueType,
1532
- typename T = typename std::decay<ValueType>::type,
1533
- typename std::enable_if<
1534
- !absl::disjunction<
1535
- std::is_same<AnyLike, T>,
1536
- absl::negation<std::is_copy_constructible<T>>>::value,
1537
- int>::type = 0>
1538
- AnyLike(ValueType&&) {} // NOLINT(runtime/explicit)
1539
-
1540
- AnyLike& operator=(AnyLike&&) = default;
1541
- AnyLike& operator=(const AnyLike&) = default;
1542
-
1543
- template <typename ValueType,
1544
- typename T = typename std::decay<ValueType>::type>
1545
- typename std::enable_if<
1546
- absl::conjunction<absl::negation<std::is_same<AnyLike, T>>,
1547
- std::is_copy_constructible<T>>::value,
1548
- AnyLike&>::type
1549
- operator=(ValueType&& /* rhs */) {
1550
- return *this;
1551
- }
1552
- };
1553
-
1554
- TEST(optionalTest, ConstructionConstraints) {
1555
- EXPECT_TRUE((std::is_constructible<AnyLike, absl::optional<AnyLike>>::value));
1556
-
1557
- EXPECT_TRUE(
1558
- (std::is_constructible<AnyLike, const absl::optional<AnyLike>&>::value));
1559
-
1560
- EXPECT_TRUE((std::is_constructible<absl::optional<AnyLike>, AnyLike>::value));
1561
- EXPECT_TRUE(
1562
- (std::is_constructible<absl::optional<AnyLike>, const AnyLike&>::value));
1563
-
1564
- EXPECT_TRUE((std::is_convertible<absl::optional<AnyLike>, AnyLike>::value));
1565
-
1566
- EXPECT_TRUE(
1567
- (std::is_convertible<const absl::optional<AnyLike>&, AnyLike>::value));
1568
-
1569
- EXPECT_TRUE((std::is_convertible<AnyLike, absl::optional<AnyLike>>::value));
1570
- EXPECT_TRUE(
1571
- (std::is_convertible<const AnyLike&, absl::optional<AnyLike>>::value));
1572
-
1573
- EXPECT_TRUE(std::is_move_constructible<absl::optional<AnyLike>>::value);
1574
- EXPECT_TRUE(std::is_copy_constructible<absl::optional<AnyLike>>::value);
1575
- }
1576
-
1577
- TEST(optionalTest, AssignmentConstraints) {
1578
- EXPECT_TRUE((std::is_assignable<AnyLike&, absl::optional<AnyLike>>::value));
1579
- EXPECT_TRUE(
1580
- (std::is_assignable<AnyLike&, const absl::optional<AnyLike>&>::value));
1581
- EXPECT_TRUE((std::is_assignable<absl::optional<AnyLike>&, AnyLike>::value));
1582
- EXPECT_TRUE(
1583
- (std::is_assignable<absl::optional<AnyLike>&, const AnyLike&>::value));
1584
- EXPECT_TRUE(std::is_move_assignable<absl::optional<AnyLike>>::value);
1585
- EXPECT_TRUE(absl::is_copy_assignable<absl::optional<AnyLike>>::value);
1586
- }
1587
-
1588
- #if !defined(__EMSCRIPTEN__)
1589
- struct NestedClassBug {
1590
- struct Inner {
1591
- bool dummy = false;
1592
- };
1593
- absl::optional<Inner> value;
1594
- };
1595
-
1596
- TEST(optionalTest, InPlaceTSFINAEBug) {
1597
- NestedClassBug b;
1598
- ((void)b);
1599
- using Inner = NestedClassBug::Inner;
1600
-
1601
- EXPECT_TRUE((std::is_default_constructible<Inner>::value));
1602
- EXPECT_TRUE((std::is_constructible<Inner>::value));
1603
- EXPECT_TRUE(
1604
- (std::is_constructible<absl::optional<Inner>, absl::in_place_t>::value));
1605
-
1606
- absl::optional<Inner> o(absl::in_place);
1607
- EXPECT_TRUE(o.has_value());
1608
- o.emplace();
1609
- EXPECT_TRUE(o.has_value());
1610
- }
1611
- #endif // !defined(__EMSCRIPTEN__)
1612
-
1613
- } // namespace
1614
-
1615
- #endif // #if !defined(ABSL_USES_STD_OPTIONAL)