re2 1.24.0 → 1.25.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 (370) hide show
  1. package/LICENSE +15 -20
  2. package/README.md +63 -4
  3. package/binding.gyp +1 -2
  4. package/lib/addon.cc +9 -5
  5. package/lib/exec.cc +4 -4
  6. package/lib/match.cc +4 -4
  7. package/lib/new.cc +6 -6
  8. package/lib/pattern.cc +148 -1
  9. package/lib/replace.cc +5 -4
  10. package/lib/search.cc +1 -1
  11. package/lib/set.cc +85 -10
  12. package/lib/test.cc +1 -1
  13. package/lib/unicode_properties.h +15840 -0
  14. package/lib/wrapped_re2.h +40 -4
  15. package/lib/wrapped_re2_set.h +3 -1
  16. package/llms-full.txt +497 -0
  17. package/llms.txt +135 -0
  18. package/package.json +19 -11
  19. package/re2.d.ts +2 -0
  20. package/re2.js +1 -0
  21. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +87 -74
  22. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  23. package/vendor/abseil-cpp/FAQ.md +130 -79
  24. package/vendor/abseil-cpp/MODULE.bazel +6 -7
  25. package/vendor/abseil-cpp/absl/BUILD.bazel +6 -0
  26. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +4 -0
  27. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +4 -0
  28. package/vendor/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  29. package/vendor/abseil-cpp/absl/algorithm/container.h +164 -17
  30. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +390 -13
  31. package/vendor/abseil-cpp/absl/base/BUILD.bazel +53 -6
  32. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +28 -4
  33. package/vendor/abseil-cpp/absl/base/attributes.h +61 -42
  34. package/vendor/abseil-cpp/absl/base/call_once.h +1 -0
  35. package/vendor/abseil-cpp/absl/base/casts.h +8 -1
  36. package/vendor/abseil-cpp/absl/base/casts_test.cc +3 -6
  37. package/vendor/abseil-cpp/absl/base/config.h +53 -9
  38. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +9 -9
  39. package/vendor/abseil-cpp/absl/base/fast_type_id.h +30 -2
  40. package/vendor/abseil-cpp/absl/base/fast_type_id_test.cc +3 -0
  41. package/vendor/abseil-cpp/absl/base/internal/exception_safety_testing.h +15 -12
  42. package/vendor/abseil-cpp/absl/base/internal/hardening.h +136 -0
  43. package/vendor/abseil-cpp/absl/base/internal/hardening_test.cc +168 -0
  44. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +2 -2
  45. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -0
  46. package/vendor/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  47. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +1 -2
  48. package/vendor/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  49. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  50. package/vendor/abseil-cpp/absl/base/macros.h +36 -20
  51. package/vendor/abseil-cpp/absl/base/nullability.h +4 -3
  52. package/vendor/abseil-cpp/absl/base/optimization.h +3 -2
  53. package/vendor/abseil-cpp/absl/base/optimization_test.cc +4 -3
  54. package/vendor/abseil-cpp/absl/base/options.h +55 -1
  55. package/vendor/abseil-cpp/absl/base/policy_checks.h +5 -5
  56. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  57. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  58. package/vendor/abseil-cpp/absl/base/throw_delegate_test.cc +19 -28
  59. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -0
  60. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +2 -0
  61. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +3 -2
  62. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  63. package/vendor/abseil-cpp/absl/container/BUILD.bazel +19 -7
  64. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +6 -5
  65. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +3 -5
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +5 -5
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +11 -14
  68. package/vendor/abseil-cpp/absl/container/chunked_queue.h +8 -6
  69. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +5 -5
  70. package/vendor/abseil-cpp/absl/container/fixed_array.h +14 -13
  71. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +3 -3
  72. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +18 -6
  73. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +34 -1
  74. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +21 -7
  75. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +39 -7
  76. package/vendor/abseil-cpp/absl/container/inlined_vector.h +29 -29
  77. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +2 -2
  78. package/vendor/abseil-cpp/absl/container/internal/btree.h +32 -24
  79. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +16 -17
  80. package/vendor/abseil-cpp/absl/container/internal/common.h +6 -5
  81. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  82. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +16 -16
  83. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +13 -13
  84. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +41 -31
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +2 -2
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +4 -4
  87. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +3 -3
  88. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +27 -19
  89. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -2
  90. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +0 -17
  91. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +12 -30
  92. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +28 -28
  93. package/vendor/abseil-cpp/absl/container/internal/layout.h +13 -13
  94. package/vendor/abseil-cpp/absl/container/internal/layout_test.cc +3 -2
  95. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +60 -62
  96. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +59 -39
  97. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +619 -326
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +25 -2
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +4 -4
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +575 -159
  101. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +2 -2
  102. package/vendor/abseil-cpp/absl/container/node_hash_map.h +27 -15
  103. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +34 -0
  104. package/vendor/abseil-cpp/absl/container/node_hash_set.h +25 -11
  105. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +39 -7
  106. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +7 -4
  107. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +0 -1
  108. package/vendor/abseil-cpp/absl/crc/CMakeLists.txt +2 -3
  109. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +2 -1
  110. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +6 -6
  111. package/vendor/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  112. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  113. package/vendor/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  114. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +143 -81
  115. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +9 -31
  116. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +3 -33
  117. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  118. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +2 -1
  119. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +12 -2
  120. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +2 -3
  121. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -0
  122. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -4
  123. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  124. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +4 -0
  125. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +46 -36
  126. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +18 -58
  127. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +5 -48
  128. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +10 -124
  129. package/vendor/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  130. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +58 -106
  131. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +37 -36
  132. package/vendor/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  133. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -3
  134. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +1 -1
  135. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  136. package/vendor/abseil-cpp/absl/flags/commandlineflag_test.cc +1 -1
  137. package/vendor/abseil-cpp/absl/flags/flag_benchmark.cc +5 -5
  138. package/vendor/abseil-cpp/absl/flags/flag_test.cc +30 -30
  139. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +4 -4
  140. package/vendor/abseil-cpp/absl/flags/internal/flag.h +6 -6
  141. package/vendor/abseil-cpp/absl/flags/marshalling.h +2 -28
  142. package/vendor/abseil-cpp/absl/flags/marshalling_test.cc +12 -11
  143. package/vendor/abseil-cpp/absl/flags/reflection_test.cc +1 -1
  144. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +26 -1
  145. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +29 -1
  146. package/vendor/abseil-cpp/absl/functional/any_invocable.h +13 -14
  147. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +46 -47
  148. package/vendor/abseil-cpp/absl/functional/bind_back.h +79 -0
  149. package/vendor/abseil-cpp/absl/functional/bind_back_test.cc +237 -0
  150. package/vendor/abseil-cpp/absl/functional/bind_front.h +7 -1
  151. package/vendor/abseil-cpp/absl/functional/bind_front_test.cc +4 -4
  152. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +2 -2
  153. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +28 -28
  154. package/vendor/abseil-cpp/absl/functional/internal/back_binder.h +95 -0
  155. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  156. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  157. package/vendor/abseil-cpp/absl/functional/overload_test.cc +13 -13
  158. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +1 -2
  159. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +1 -2
  160. package/vendor/abseil-cpp/absl/hash/hash.h +1 -1
  161. package/vendor/abseil-cpp/absl/hash/hash_test.cc +14 -20
  162. package/vendor/abseil-cpp/absl/hash/hash_testing.h +11 -9
  163. package/vendor/abseil-cpp/absl/hash/internal/city.cc +39 -51
  164. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +165 -47
  165. package/vendor/abseil-cpp/absl/hash/internal/hash.h +86 -27
  166. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +36 -1
  167. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +8 -5
  168. package/vendor/abseil-cpp/absl/log/BUILD.bazel +5 -2
  169. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +5 -3
  170. package/vendor/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  171. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +15 -1
  172. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -4
  173. package/vendor/abseil-cpp/absl/log/internal/log_message.h +14 -0
  174. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  175. package/vendor/abseil-cpp/absl/log/internal/proto.cc +13 -0
  176. package/vendor/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  177. package/vendor/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  178. package/vendor/abseil-cpp/absl/log/internal/structured_proto_test.cc +3 -3
  179. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +2 -2
  180. package/vendor/abseil-cpp/absl/log/internal/vlog_config_benchmark.cc +3 -3
  181. package/vendor/abseil-cpp/absl/log/log_format_test.cc +19 -2
  182. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +18 -0
  183. package/vendor/abseil-cpp/absl/log/log_streamer.h +29 -2
  184. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +18 -0
  185. package/vendor/abseil-cpp/absl/log/scoped_mock_log_test.cc +1 -1
  186. package/vendor/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  187. package/vendor/abseil-cpp/absl/log/vlog_is_on_test.cc +6 -5
  188. package/vendor/abseil-cpp/absl/memory/memory.h +55 -5
  189. package/vendor/abseil-cpp/absl/memory/memory_test.cc +55 -1
  190. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  191. package/vendor/abseil-cpp/absl/meta/internal/requires.h +1 -1
  192. package/vendor/abseil-cpp/absl/meta/type_traits.h +119 -55
  193. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +7 -7
  194. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +6 -6
  195. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +3 -1
  196. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +0 -4
  197. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +32 -33
  198. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +25 -2
  199. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +8 -5
  200. package/vendor/abseil-cpp/absl/random/BUILD.bazel +13 -1
  201. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +23 -2
  202. package/vendor/abseil-cpp/absl/random/benchmarks.cc +1 -1
  203. package/vendor/abseil-cpp/absl/random/beta_distribution.h +2 -2
  204. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  205. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +43 -0
  206. package/vendor/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  207. package/vendor/abseil-cpp/absl/random/distributions.h +17 -17
  208. package/vendor/abseil-cpp/absl/random/distributions_test.cc +4 -4
  209. package/vendor/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  210. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +4 -2
  211. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  212. package/vendor/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  213. package/vendor/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  214. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  215. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc +3 -2
  216. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +14 -40
  217. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  218. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +2 -2
  219. package/vendor/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  220. package/vendor/abseil-cpp/absl/random/internal/pcg_engine_test.cc +3 -2
  221. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  222. package/vendor/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  223. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +3 -2
  224. package/vendor/abseil-cpp/absl/random/internal/randen_test.cc +3 -2
  225. package/vendor/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  226. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +4 -4
  227. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  228. package/vendor/abseil-cpp/absl/random/internal/traits.h +21 -0
  229. package/vendor/abseil-cpp/absl/random/internal/traits_test.cc +5 -0
  230. package/vendor/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  231. package/vendor/abseil-cpp/absl/random/internal/uniform_helper_test.cc +2 -1
  232. package/vendor/abseil-cpp/absl/random/mocking_access.h +74 -0
  233. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +9 -19
  234. package/vendor/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  235. package/vendor/abseil-cpp/absl/status/BUILD.bazel +81 -0
  236. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +91 -0
  237. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  238. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +26 -2
  239. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +22 -8
  240. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +43 -43
  241. package/vendor/abseil-cpp/absl/status/status.cc +62 -70
  242. package/vendor/abseil-cpp/absl/status/status.h +249 -23
  243. package/vendor/abseil-cpp/absl/status/status_benchmark.cc +12 -0
  244. package/vendor/abseil-cpp/absl/status/status_builder.cc +196 -0
  245. package/vendor/abseil-cpp/absl/status/status_builder.h +978 -0
  246. package/vendor/abseil-cpp/absl/status/status_builder_test.cc +380 -0
  247. package/vendor/abseil-cpp/absl/status/status_macros.h +484 -0
  248. package/vendor/abseil-cpp/absl/status/status_macros_test.cc +634 -0
  249. package/vendor/abseil-cpp/absl/status/status_matchers.h +2 -1
  250. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +3 -4
  251. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  252. package/vendor/abseil-cpp/absl/status/status_test.cc +443 -13
  253. package/vendor/abseil-cpp/absl/status/statusor.h +69 -36
  254. package/vendor/abseil-cpp/absl/status/statusor_test.cc +132 -35
  255. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +42 -7
  256. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +33 -4
  257. package/vendor/abseil-cpp/absl/strings/ascii.h +1 -2
  258. package/vendor/abseil-cpp/absl/strings/atod_manual_test.cc +5 -5
  259. package/vendor/abseil-cpp/absl/strings/cord.cc +26 -7
  260. package/vendor/abseil-cpp/absl/strings/cord.h +23 -13
  261. package/vendor/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  262. package/vendor/abseil-cpp/absl/strings/cord_test.cc +85 -9
  263. package/vendor/abseil-cpp/absl/strings/escaping.cc +183 -35
  264. package/vendor/abseil-cpp/absl/strings/escaping.h +12 -2
  265. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +1 -3
  266. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +22 -18
  267. package/vendor/abseil-cpp/absl/strings/has_absl_stringify_test.cc +2 -2
  268. package/vendor/abseil-cpp/absl/strings/has_ostream_operator_test.cc +2 -2
  269. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +10 -10
  270. package/vendor/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc +1 -1
  271. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  272. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  273. package/vendor/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  274. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +2 -26
  275. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +23 -2
  276. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +6 -2
  277. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -24
  278. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized_test.cc +16 -41
  279. package/vendor/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  280. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  281. package/vendor/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  282. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +12 -20
  283. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +510 -307
  284. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +0 -1
  285. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +9 -10
  286. package/vendor/abseil-cpp/absl/strings/internal/string_constant_test.cc +6 -5
  287. package/vendor/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  288. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream.h +119 -0
  289. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream_test.cc +111 -0
  290. package/vendor/abseil-cpp/absl/strings/numbers.cc +406 -0
  291. package/vendor/abseil-cpp/absl/strings/numbers.h +4 -0
  292. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +33 -0
  293. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +10 -6
  294. package/vendor/abseil-cpp/absl/strings/str_cat.h +36 -1
  295. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +1 -2
  296. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +28 -0
  297. package/vendor/abseil-cpp/absl/strings/str_join_test.cc +4 -4
  298. package/vendor/abseil-cpp/absl/strings/str_split.h +11 -6
  299. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +13 -0
  300. package/vendor/abseil-cpp/absl/strings/substitute.h +2 -2
  301. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +3 -0
  302. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +21 -0
  303. package/vendor/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  304. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +13 -0
  305. package/vendor/abseil-cpp/absl/synchronization/mutex.h +32 -2
  306. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +17 -3
  307. package/vendor/abseil-cpp/absl/time/BUILD.bazel +80 -0
  308. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +73 -0
  309. package/vendor/abseil-cpp/absl/time/clock.h +3 -0
  310. package/vendor/abseil-cpp/absl/time/clock_interface.cc +71 -0
  311. package/vendor/abseil-cpp/absl/time/clock_interface.h +93 -0
  312. package/vendor/abseil-cpp/absl/time/clock_interface_test.cc +128 -0
  313. package/vendor/abseil-cpp/absl/time/format.cc +3 -10
  314. package/vendor/abseil-cpp/absl/time/format_test.cc +12 -0
  315. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +90 -89
  316. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +80 -5
  317. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +1 -2
  318. package/vendor/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  319. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  320. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver +0 -0
  321. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
  322. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh +0 -0
  323. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon +0 -0
  324. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi +0 -0
  325. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane +0 -0
  326. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific +0 -0
  327. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau +0 -0
  328. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol +0 -0
  329. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +1 -1
  330. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +3 -3
  331. package/vendor/abseil-cpp/absl/time/simulated_clock.cc +225 -0
  332. package/vendor/abseil-cpp/absl/time/simulated_clock.h +109 -0
  333. package/vendor/abseil-cpp/absl/time/simulated_clock_test.cc +614 -0
  334. package/vendor/abseil-cpp/absl/types/BUILD.bazel +116 -0
  335. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +100 -0
  336. package/vendor/abseil-cpp/absl/types/any.h +26 -4
  337. package/vendor/abseil-cpp/absl/types/any_span.h +1067 -0
  338. package/vendor/abseil-cpp/absl/types/any_span_benchmark.cc +258 -0
  339. package/vendor/abseil-cpp/absl/types/any_span_test.cc +1210 -0
  340. package/vendor/abseil-cpp/absl/types/compare.h +4 -4
  341. package/vendor/abseil-cpp/absl/types/internal/any_span.h +477 -0
  342. package/vendor/abseil-cpp/absl/types/internal/span.h +5 -6
  343. package/vendor/abseil-cpp/absl/types/optional.h +30 -3
  344. package/vendor/abseil-cpp/absl/types/optional_ref.h +295 -0
  345. package/vendor/abseil-cpp/absl/types/optional_ref_test.cc +370 -0
  346. package/vendor/abseil-cpp/absl/types/source_location.cc +18 -0
  347. package/vendor/abseil-cpp/absl/types/source_location.h +172 -0
  348. package/vendor/abseil-cpp/absl/types/source_location_test.cc +139 -0
  349. package/vendor/abseil-cpp/absl/types/span.h +19 -23
  350. package/vendor/abseil-cpp/absl/types/variant.h +75 -18
  351. package/vendor/abseil-cpp/absl/types/variant_test.cc +23 -23
  352. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -0
  353. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +1 -0
  354. package/vendor/abseil-cpp/absl/utility/utility.h +99 -16
  355. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -0
  356. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +10 -4
  357. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +13 -6
  358. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +10 -4
  359. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +12 -5
  360. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +9 -2
  361. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  362. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +10 -3
  363. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +8 -2
  364. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +4 -3
  365. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +2 -2
  366. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -1
  367. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -1
  368. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +0 -118
  369. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +0 -71
  370. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +0 -97
@@ -0,0 +1,1210 @@
1
+ // Copyright 2026 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/any_span.h"
16
+
17
+ #include <cstddef>
18
+ #include <deque>
19
+ #include <functional>
20
+ #include <iterator>
21
+ #include <memory>
22
+ #include <optional>
23
+ #include <string>
24
+ #include <string_view>
25
+ #include <type_traits>
26
+ #include <utility>
27
+ #include <vector>
28
+
29
+ #include "gmock/gmock.h"
30
+ #include "gtest/gtest.h"
31
+ #include "absl/base/config.h"
32
+ #include "absl/base/internal/exception_testing.h"
33
+ #include "absl/base/internal/raw_logging.h"
34
+ #include "absl/base/macros.h"
35
+ #include "absl/hash/hash_testing.h"
36
+ #include "absl/meta/type_traits.h"
37
+ #include "absl/strings/str_cat.h"
38
+ #include "absl/strings/string_view.h"
39
+ #include "absl/types/span.h"
40
+
41
+ namespace absl {
42
+ ABSL_NAMESPACE_BEGIN
43
+ namespace {
44
+
45
+ using testing::ElementsAre;
46
+
47
+ static_assert(!absl::type_traits_internal::IsOwner<AnySpan<int>>::value &&
48
+ absl::type_traits_internal::IsView<AnySpan<int>>::value,
49
+ "AnySpan is a view, not an owner");
50
+
51
+ bool IsHardened() {
52
+ bool hardened = false;
53
+ ABSL_HARDENING_ASSERT([&hardened]() {
54
+ hardened = true;
55
+ return true;
56
+ }());
57
+ return hardened;
58
+ }
59
+
60
+ // Tests that the span points to all of the elements of the given container.
61
+ template <typename T, typename Container>
62
+ void ExpectSpanEqualsContainer(AnySpan<T> span, const Container& c) {
63
+ EXPECT_EQ(span.size(), c.size());
64
+ typename AnySpan<const T>::size_type index = 0;
65
+ for (const T& s : span) {
66
+ SCOPED_TRACE(index);
67
+ const T& expected = c[index];
68
+ EXPECT_EQ(expected, s);
69
+ EXPECT_EQ(expected, span[index]);
70
+ EXPECT_EQ(&expected, &span[index]);
71
+ ++index;
72
+ }
73
+ EXPECT_EQ(index, span.size());
74
+ }
75
+
76
+ // AnySpanTest covers parts of AnySpan that make sense for both const and
77
+ // non-const elements. How the given tests will run is determined by whether or
78
+ // not ElementsAreConst is true_type or false_type.
79
+ template <typename ElementsAreConst>
80
+ class AnySpanTest : public ::testing::Test {
81
+ public:
82
+ using IsConstTest = ElementsAreConst;
83
+
84
+ // Const T if this test instantiation is supposed to cover const AnySpans.
85
+ // T if this test instantiation is supposed to cover mutable AnySpans.
86
+ template <typename T>
87
+ using MaybeConst =
88
+ typename std::conditional<IsConstTest::value, const T, T>::type;
89
+
90
+ // Initalizes a AnySpan around the given container and tests for
91
+ // equality in a variety of ways.
92
+ template <typename T, typename Container, typename Transform>
93
+ static void TestContainer(Container c, const Transform& t) {
94
+ AnySpan<MaybeConst<T>> span(c, t);
95
+ EXPECT_NO_FATAL_FAILURE(ExpectSpanEqualsContainer(span, c));
96
+ }
97
+
98
+ // Initializes a dereferencing AnySpan around the given container of pointers
99
+ // and tests for equality in a variety of ways.
100
+ template <typename T, typename Container>
101
+ static void TestPointerContainer(Container* c) {
102
+ AnySpan<const T> span(*c, any_span_transform::Deref());
103
+ EXPECT_EQ(span.size(), c->size());
104
+ int index = 0;
105
+ for (const T& s : span) {
106
+ const T& expected = *(*c)[index];
107
+ EXPECT_EQ(expected, s);
108
+ EXPECT_EQ(expected, span[index]);
109
+ EXPECT_EQ(&expected, &span[index]);
110
+ index++;
111
+ }
112
+ EXPECT_EQ(index, span.size());
113
+ }
114
+ };
115
+
116
+ using ElementsAreConst = ::testing::Types<std::true_type, std::false_type>;
117
+
118
+ TYPED_TEST_SUITE(AnySpanTest, ElementsAreConst);
119
+
120
+ TYPED_TEST(AnySpanTest, NullAndEmpty) {
121
+ using T = typename TestFixture::template MaybeConst<std::string>;
122
+ AnySpan<T> empty;
123
+ EXPECT_TRUE(empty.empty());
124
+ EXPECT_EQ(empty.size(), 0);
125
+ for (const std::string& a : empty) {
126
+ (void)a;
127
+ ABSL_RAW_LOG(FATAL, "Empty container should not iterate.");
128
+ }
129
+ EXPECT_EQ(empty.begin(), empty.end());
130
+ }
131
+
132
+ TYPED_TEST(AnySpanTest, Ptr) {
133
+ using T = typename TestFixture::template MaybeConst<std::string>;
134
+ std::vector<std::string> v = {"a", "b", "c", "d"};
135
+ AnySpan<T> span1(v.data(), v.size());
136
+ EXPECT_EQ(&span1[0], &v[0]);
137
+ AnySpan<T> span2(v.data(), v.size());
138
+ EXPECT_EQ(&span2[0], &v[0]);
139
+ }
140
+
141
+ TYPED_TEST(AnySpanTest, PtrPtr) {
142
+ using T = typename TestFixture::template MaybeConst<int>;
143
+ int i;
144
+ std::vector<int*> v = {&i};
145
+ AnySpan<T> span(v.data(), v.size(), any_span_transform::Deref());
146
+ EXPECT_EQ(&span[0], &i);
147
+ }
148
+
149
+ TYPED_TEST(AnySpanTest, DerefOptional) {
150
+ const std::vector<std::optional<int>> v = {17, 19};
151
+ const AnySpan<const int> span = absl::MakeDerefAnySpan(v);
152
+ EXPECT_THAT(span, ElementsAre(17, 19));
153
+ }
154
+
155
+ TYPED_TEST(AnySpanTest, ArrayOfKnownSize) {
156
+ using T = typename TestFixture::template MaybeConst<std::string>;
157
+ std::string a[] = {"a", "b", "c", "d"};
158
+
159
+ AnySpan<T> span(a);
160
+ EXPECT_EQ(span.size(), 4);
161
+ EXPECT_EQ(&span[0], &a[0]);
162
+ }
163
+
164
+ // This gets its own test because AnySpan(array, size) has the potential to be
165
+ // ambiguous with AnySpan(array, transform).
166
+ TYPED_TEST(AnySpanTest, ArrayWithExplicitSize) {
167
+ using T = typename TestFixture::template MaybeConst<std::string>;
168
+ std::string a[] = {"a", "b", "c", "d"};
169
+
170
+ AnySpan<T> span(a, 4);
171
+ EXPECT_EQ(span.size(), 4);
172
+ EXPECT_EQ(&span[0], &a[0]);
173
+ }
174
+
175
+ TYPED_TEST(AnySpanTest, PtrArrayOfKnownSize) {
176
+ using T = typename TestFixture::template MaybeConst<std::string>;
177
+ std::string s;
178
+ std::string* a[] = {&s, &s, &s, &s};
179
+
180
+ AnySpan<T> span(a, any_span_transform::Deref());
181
+ EXPECT_EQ(span.size(), 4);
182
+ EXPECT_EQ(&span[0], &s);
183
+ }
184
+
185
+ TYPED_TEST(AnySpanTest, Range) {
186
+ using T = typename TestFixture::template MaybeConst<std::string>;
187
+ std::vector<std::string> a = {"a", "b", "c", "d"};
188
+ auto range = any_span_adaptor::MakeAdaptorFromRange(a.begin(), a.end());
189
+ AnySpan<T> span(range);
190
+ EXPECT_NO_FATAL_FAILURE(ExpectSpanEqualsContainer(span, a));
191
+ }
192
+
193
+ TYPED_TEST(AnySpanTest, View) {
194
+ using T = typename TestFixture::template MaybeConst<std::string>;
195
+ std::vector<std::string> a = {"a", "b", "c", "d"};
196
+ auto range = any_span_adaptor::MakeAdaptorFromView(a);
197
+ AnySpan<T> span(range);
198
+ EXPECT_NO_FATAL_FAILURE(ExpectSpanEqualsContainer(span, a));
199
+ }
200
+
201
+ TYPED_TEST(AnySpanTest, VectorString) {
202
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<std::string>(
203
+ std::vector<std::string>{"a", "b", "c", "d"},
204
+ any_span_transform::Identity()));
205
+ }
206
+
207
+ TYPED_TEST(AnySpanTest, VectorInt) {
208
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<int>(
209
+ std::vector<int>{1, 2, 3, 4}, any_span_transform::Identity()));
210
+ }
211
+
212
+ TYPED_TEST(AnySpanTest, VectorStringPointer) {
213
+ std::vector<std::string> v = {"a", "b", "c", "d"};
214
+ std::vector<std::string*> vp;
215
+ for (std::string& s : v) {
216
+ vp.push_back(&s);
217
+ }
218
+ TestFixture::template TestPointerContainer<std::string>(&vp);
219
+ }
220
+
221
+ TYPED_TEST(AnySpanTest, VectorStringUniquePointer) {
222
+ std::vector<std::unique_ptr<std::string>> v;
223
+ for (const std::string& s : std::vector<std::string>{"a", "b", "c", "d"}) {
224
+ v.emplace_back(new std::string(s));
225
+ }
226
+ TestFixture::template TestPointerContainer<std::string>(&v);
227
+ }
228
+
229
+ TYPED_TEST(AnySpanTest, VectorIntPointer) {
230
+ std::vector<int> v = {1, 2, 3, 4};
231
+ std::vector<int*> vp;
232
+ for (int& i : v) {
233
+ vp.push_back(&i);
234
+ }
235
+ TestFixture::template TestPointerContainer<int>(&vp);
236
+ }
237
+
238
+ TYPED_TEST(AnySpanTest, DequeString) {
239
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<std::string>(
240
+ std::deque<std::string>{"a", "b", "c", "d"},
241
+ any_span_transform::Identity()));
242
+ }
243
+
244
+ TYPED_TEST(AnySpanTest, DequeInt) {
245
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<int>(
246
+ std::deque<int>{1, 2, 3, 4}, any_span_transform::Identity()));
247
+ }
248
+
249
+ TYPED_TEST(AnySpanTest, DequeStringPtr) {
250
+ std::vector<std::string> v = {"a", "b", "c", "d"};
251
+ std::deque<std::string*> dp;
252
+ for (std::string& s : v) {
253
+ dp.push_back(&s);
254
+ }
255
+ TestFixture::template TestPointerContainer<std::string>(&dp);
256
+ }
257
+
258
+ TYPED_TEST(AnySpanTest, ImplicitConversions) {
259
+ using T = typename TestFixture::template MaybeConst<std::string>;
260
+ std::string one = "1";
261
+ std::string two = "2";
262
+ std::vector<std::reference_wrapper<std::string>> v(
263
+ {std::ref(one), std::ref(two)});
264
+ AnySpan<T> span(v);
265
+
266
+ EXPECT_THAT(span, ElementsAre("1", "2"));
267
+ }
268
+
269
+ TYPED_TEST(AnySpanTest, TrivialSubspan) {
270
+ EXPECT_EQ(AnySpan<int>().subspan(0).size(), 0);
271
+ }
272
+
273
+ TYPED_TEST(AnySpanTest, TrivialFirst) {
274
+ using T = typename TestFixture::template MaybeConst<int>;
275
+ EXPECT_EQ(AnySpan<T>().first(0).size(), 0);
276
+ }
277
+
278
+ TYPED_TEST(AnySpanTest, TrivialLast) {
279
+ using T = typename TestFixture::template MaybeConst<int>;
280
+ EXPECT_EQ(AnySpan<T>().last(0).size(), 0);
281
+ }
282
+
283
+ struct Base1 {
284
+ virtual ~Base1() = default;
285
+ bool operator==(const Base1& other) const { return this == &other; }
286
+ int b1 = 1;
287
+ };
288
+ struct Base2 {
289
+ virtual ~Base2() = default;
290
+ bool operator==(const Base2& other) const { return this == &other; }
291
+ int b2 = 2;
292
+ };
293
+ struct Child : public Base1, public Base2 {
294
+ bool operator==(const Child& other) const { return this == &other; }
295
+ };
296
+
297
+ TYPED_TEST(AnySpanTest, VectorBaseClass) {
298
+ std::vector<Child> v;
299
+ v.resize(20);
300
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<Base1>(
301
+ v, any_span_transform::Identity()));
302
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<Base2>(
303
+ v, any_span_transform::Identity()));
304
+ }
305
+
306
+ TYPED_TEST(AnySpanTest, AnySpanVectorBaseClass) {
307
+ std::vector<Child> v;
308
+ v.resize(20);
309
+ AnySpan<Child> span(v);
310
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<Base1>(
311
+ span, any_span_transform::Identity()));
312
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<Base2>(
313
+ span, any_span_transform::Identity()));
314
+ }
315
+
316
+ TYPED_TEST(AnySpanTest, DerefAnySpanVectorBaseClass) {
317
+ Child c;
318
+ std::vector<Child*> v_ptrs(20, &c);
319
+ AnySpan<Child> span(v_ptrs, any_span_transform::Deref());
320
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<Base1>(
321
+ span, any_span_transform::Identity()));
322
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<Base2>(
323
+ span, any_span_transform::Identity()));
324
+ }
325
+
326
+ TYPED_TEST(AnySpanTest, AnySpanDequeBaseClass) {
327
+ std::deque<Child> v;
328
+ v.resize(20);
329
+ AnySpan<Child> span(v);
330
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<Base1>(
331
+ span, any_span_transform::Identity()));
332
+ EXPECT_NO_FATAL_FAILURE(TestFixture::template TestContainer<Base2>(
333
+ span, any_span_transform::Identity()));
334
+ }
335
+
336
+ TYPED_TEST(AnySpanTest, VectorSubspan) {
337
+ using T = typename TestFixture::template MaybeConst<int>;
338
+ std::vector<int> v = {1, 2, 3, 4};
339
+ auto span = AnySpan<T>(v).subspan(1, 2);
340
+ EXPECT_EQ(span.size(), 2);
341
+ EXPECT_EQ(span[0], 2);
342
+ EXPECT_EQ(span[1], 3);
343
+ span = AnySpan<T>(v).subspan(1);
344
+ EXPECT_EQ(span.size(), 3);
345
+ EXPECT_EQ(span[2], 4);
346
+
347
+ std::vector<int> zero_length_vector;
348
+ auto zero_length_subspan = AnySpan<T>(zero_length_vector).subspan(0);
349
+ EXPECT_EQ(zero_length_subspan.size(), 0);
350
+ }
351
+
352
+ TYPED_TEST(AnySpanTest, DequeSubspan) {
353
+ using T = typename TestFixture::template MaybeConst<int>;
354
+ std::deque<int> v = {1, 2, 3, 4};
355
+ auto span = AnySpan<T>(v).subspan(1, 2);
356
+ EXPECT_EQ(span.size(), 2);
357
+ EXPECT_EQ(span[0], 2);
358
+ EXPECT_EQ(span[1], 3);
359
+ }
360
+
361
+ TYPED_TEST(AnySpanTest, VectorFirst) {
362
+ using T = typename TestFixture::template MaybeConst<int>;
363
+ std::vector<int> v = {1, 2, 3, 4};
364
+ auto span = AnySpan<T>(v).first(2);
365
+ EXPECT_THAT(span, ElementsAre(1, 2));
366
+ span = AnySpan<T>(v).first(4);
367
+ EXPECT_THAT(span, ElementsAre(1, 2, 3, 4));
368
+
369
+ std::vector<int> zero_length_vector;
370
+ auto zero_length_subspan = AnySpan<T>(zero_length_vector).first(0);
371
+ EXPECT_EQ(zero_length_subspan.size(), 0);
372
+ }
373
+
374
+ TYPED_TEST(AnySpanTest, DequeFirst) {
375
+ using T = typename TestFixture::template MaybeConst<int>;
376
+ std::deque<int> v = {1, 2, 3, 4};
377
+ auto span = AnySpan<T>(v).first(2);
378
+ EXPECT_THAT(span, ElementsAre(1, 2));
379
+ }
380
+
381
+ TYPED_TEST(AnySpanTest, VectorLast) {
382
+ using T = typename TestFixture::template MaybeConst<int>;
383
+ std::vector<int> v = {1, 2, 3, 4};
384
+ auto span = AnySpan<T>(v).last(2);
385
+ EXPECT_THAT(span, ElementsAre(3, 4));
386
+ span = AnySpan<T>(v).last(4);
387
+ EXPECT_THAT(span, ElementsAre(1, 2, 3, 4));
388
+
389
+ std::vector<int> zero_length_vector;
390
+ auto zero_length_subspan = AnySpan<T>(zero_length_vector).last(0);
391
+ EXPECT_EQ(zero_length_subspan.size(), 0);
392
+ }
393
+
394
+ TYPED_TEST(AnySpanTest, DequeLast) {
395
+ using T = typename TestFixture::template MaybeConst<int>;
396
+ std::deque<int> v = {1, 2, 3, 4};
397
+ auto span = AnySpan<T>(v).last(2);
398
+ EXPECT_THAT(span, ElementsAre(3, 4));
399
+ }
400
+
401
+ TYPED_TEST(AnySpanTest, LambdaTransformFromVector) {
402
+ using T = typename TestFixture::template MaybeConst<std::string>;
403
+ std::vector<std::string> v = {"b", "a", "d", "c"};
404
+ std::vector<int> alphabetical_order = {1, 0, 3, 2};
405
+ auto subscript_v = [&v](size_t i) -> std::string& { return v[i]; };
406
+ AnySpan<T> span(alphabetical_order, subscript_v);
407
+ EXPECT_EQ(span[0], "a");
408
+ EXPECT_EQ(span[1], "b");
409
+ EXPECT_EQ(span[2], "c");
410
+ EXPECT_EQ(span[3], "d");
411
+ }
412
+
413
+ TYPED_TEST(AnySpanTest, LambdaTransformFromSpanOfDifferentType) {
414
+ using T = typename TestFixture::template MaybeConst<int>;
415
+ using U = typename TestFixture::template MaybeConst<std::string>;
416
+ std::vector<std::string> v = {"b", "a", "d", "c"};
417
+ std::vector<int> alphabetical_order = {1, 0, 3, 2};
418
+ AnySpan<T> alphabetical_order_as_span(alphabetical_order);
419
+ auto subscript_v = [&v](size_t i) -> std::string& { return v[i]; };
420
+ AnySpan<U> span(alphabetical_order_as_span, subscript_v);
421
+ EXPECT_EQ(span[0], "a");
422
+ EXPECT_EQ(span[1], "b");
423
+ EXPECT_EQ(span[2], "c");
424
+ EXPECT_EQ(span[3], "d");
425
+ }
426
+
427
+ TYPED_TEST(AnySpanTest, LambdaTransformFromSpanOfSameType) {
428
+ using T = typename TestFixture::template MaybeConst<int>;
429
+ std::vector<int> v = {2, 1, 4, 3};
430
+ std::vector<int> sorted_order = {1, 0, 3, 2};
431
+ AnySpan<T> sorted_order_as_span(sorted_order);
432
+ auto subscript_v = [&v](size_t i) -> int& { return v[i]; };
433
+ AnySpan<T> span(sorted_order_as_span, subscript_v);
434
+ EXPECT_EQ(span[0], 1);
435
+ EXPECT_EQ(span[1], 2);
436
+ EXPECT_EQ(span[2], 3);
437
+ EXPECT_EQ(span[3], 4);
438
+ }
439
+
440
+ TYPED_TEST(AnySpanTest, MakeAnySpanFromVector) {
441
+ using V = typename TestFixture::template MaybeConst<std::vector<int>>;
442
+ using T = typename TestFixture::template MaybeConst<int>;
443
+ V v = {1, 2, 3, 4};
444
+ auto span = MakeAnySpan(v);
445
+ EXPECT_TRUE((std::is_same<decltype(span), AnySpan<T>>()));
446
+ EXPECT_EQ(span.size(), 4);
447
+ for (size_t i = 0; i < 4; ++i) {
448
+ EXPECT_EQ(&span[i], &v[i]);
449
+ }
450
+ }
451
+
452
+ TYPED_TEST(AnySpanTest, MakeAnySpanFromPtrAndSize) {
453
+ using V = typename TestFixture::template MaybeConst<std::vector<int>>;
454
+ using T = typename TestFixture::template MaybeConst<int>;
455
+ V v = {1, 2, 3, 4};
456
+ auto span = MakeAnySpan(v.data(), v.size());
457
+ EXPECT_TRUE((std::is_same<decltype(span), AnySpan<T>>()));
458
+ EXPECT_EQ(span.size(), 4);
459
+ for (int i = 0; i < 4; ++i) {
460
+ EXPECT_EQ(&span[i], &v[i]);
461
+ }
462
+ }
463
+
464
+ TYPED_TEST(AnySpanTest, MakeAnySpanFromArray) {
465
+ using T = typename TestFixture::template MaybeConst<int>;
466
+ T a[] = {1, 2, 3, 4};
467
+ auto span = MakeAnySpan(a);
468
+ EXPECT_TRUE((std::is_same<decltype(span), AnySpan<T>>()));
469
+ EXPECT_EQ(span.size(), 4);
470
+ for (int i = 0; i < 4; ++i) {
471
+ EXPECT_EQ(&span[i], &a[i]);
472
+ }
473
+ }
474
+
475
+ TYPED_TEST(AnySpanTest, MakeDerefAnySpanFromArray) {
476
+ using T = typename TestFixture::template MaybeConst<int>;
477
+ T v = 0;
478
+ T* a[] = {&v, &v, &v};
479
+ auto span = MakeDerefAnySpan(a);
480
+ EXPECT_TRUE((std::is_same<decltype(span), AnySpan<T>>()));
481
+ EXPECT_EQ(span.size(), 3);
482
+ for (int i = 0; i < 3; ++i) {
483
+ EXPECT_EQ(&span[i], a[i]);
484
+ }
485
+ }
486
+
487
+ // Tests transforms that are supported by std::invoke.
488
+ TYPED_TEST(AnySpanTest, InvokableTransforms) {
489
+ using T = typename TestFixture::template MaybeConst<std::string>;
490
+ struct S;
491
+ using SRef = typename TestFixture::template MaybeConst<S>&;
492
+ struct S {
493
+ std::string a, b;
494
+ static T& Fun(SRef p) { return p.a; }
495
+ std::string& MemFun() { return a; }
496
+ const std::string& MemFun() const { return a; }
497
+ };
498
+
499
+ // For const span tests, we need a pointer to constant member function. We
500
+ // choose the correct type of member function here.
501
+ using MemFunPtr =
502
+ typename std::conditional<TestFixture::IsConstTest::value,
503
+ T& (S::*)() const, T& (S::*)()>::type;
504
+
505
+ std::vector<S> v = {{"1", "2"}, {"3", "4"}};
506
+ S a[] = {{"1", "2"}, {"3", "4"}};
507
+ T& (*fun_ptr)(SRef) = &S::Fun;
508
+ MemFunPtr mem_fun_ptr = &S::MemFun;
509
+ T S::* mem_ptr = &S::a;
510
+
511
+ AnySpan<T> spans[] = {
512
+ // Function reference.
513
+ AnySpan<T>(v, S::Fun),
514
+ AnySpan<T>(a, S::Fun),
515
+ AnySpan<T>(a, 2, S::Fun),
516
+
517
+ // Function pointer prvalue.
518
+ AnySpan<T>(v, &S::Fun),
519
+ AnySpan<T>(a, &S::Fun),
520
+ AnySpan<T>(a, 2, &S::Fun),
521
+
522
+ // Function pointer lvalue.
523
+ AnySpan<T>(v, fun_ptr),
524
+ AnySpan<T>(a, fun_ptr),
525
+ AnySpan<T>(a, 2, fun_ptr),
526
+
527
+ // Dereferenced function pointer variable.
528
+ AnySpan<T>(v, *fun_ptr),
529
+ AnySpan<T>(a, *fun_ptr),
530
+ AnySpan<T>(a, 2, *fun_ptr),
531
+
532
+ // Member function pointer.
533
+ AnySpan<T>(v, mem_fun_ptr),
534
+ AnySpan<T>(a, mem_fun_ptr),
535
+ AnySpan<T>(a, 2, mem_fun_ptr),
536
+
537
+ // Data member.
538
+ AnySpan<T>(v, mem_ptr),
539
+ AnySpan<T>(a, mem_ptr),
540
+ AnySpan<T>(a, 2, mem_ptr),
541
+ };
542
+
543
+ for (const auto& span : spans) {
544
+ EXPECT_EQ(span[0], "1");
545
+ EXPECT_EQ(span[1], "3");
546
+ }
547
+ }
548
+
549
+ TYPED_TEST(AnySpanTest, VectorPtrSubspan) {
550
+ using T = typename TestFixture::template MaybeConst<int>;
551
+ std::vector<int> v = {1, 2, 3, 4};
552
+ std::vector<int*> vp;
553
+ for (int& i : v) {
554
+ vp.push_back(&i);
555
+ }
556
+ AnySpan<T> span = AnySpan<T>(vp, any_span_transform::Deref()).subspan(1, 2);
557
+ EXPECT_EQ(span.size(), 2);
558
+ EXPECT_EQ(span[0], 2);
559
+ EXPECT_EQ(span[1], 3);
560
+ }
561
+
562
+ TYPED_TEST(AnySpanTest, VectorPtrFirst) {
563
+ using T = typename TestFixture::template MaybeConst<int>;
564
+ std::vector<int> v = {1, 2, 3, 4};
565
+ std::vector<int*> vp;
566
+ for (int& i : v) {
567
+ vp.push_back(&i);
568
+ }
569
+ AnySpan<T> span = AnySpan<T>(vp, any_span_transform::Deref()).first(2);
570
+ EXPECT_THAT(span, ElementsAre(1, 2));
571
+ }
572
+
573
+ TYPED_TEST(AnySpanTest, VectorPtrLast) {
574
+ using T = typename TestFixture::template MaybeConst<int>;
575
+ std::vector<int> v = {1, 2, 3, 4};
576
+ std::vector<int*> vp;
577
+ for (int& i : v) {
578
+ vp.push_back(&i);
579
+ }
580
+ AnySpan<T> span = AnySpan<T>(vp, any_span_transform::Deref()).last(2);
581
+ EXPECT_THAT(span, ElementsAre(3, 4));
582
+ }
583
+
584
+ TYPED_TEST(AnySpanTest, Iterator) {
585
+ using T = typename TestFixture::template MaybeConst<std::string>;
586
+ std::vector<std::string> v = {"0", "1", "2", "3"};
587
+ AnySpan<T> span(v);
588
+
589
+ // Dereference.
590
+ auto it = span.begin();
591
+ EXPECT_EQ("0", *it);
592
+
593
+ // Postfix increment.
594
+ EXPECT_EQ("0", *(it++));
595
+ EXPECT_EQ("1", *(it++));
596
+
597
+ // Postfix decrement.
598
+ EXPECT_EQ("2", *(it--));
599
+ EXPECT_EQ("1", *(it--));
600
+
601
+ // Prefix increment.
602
+ EXPECT_EQ(it, span.begin());
603
+ EXPECT_EQ("1", *(++it));
604
+ EXPECT_EQ("2", *(++it));
605
+
606
+ // Postfix decrement.
607
+ EXPECT_EQ("1", *(--it));
608
+ EXPECT_EQ("0", *(--it));
609
+
610
+ // Increment by integer.
611
+ EXPECT_EQ(it, span.begin());
612
+ it += 3;
613
+ EXPECT_EQ("3", *it);
614
+
615
+ // Decrement by integer.
616
+ it = span.end();
617
+ it -= 4;
618
+ EXPECT_EQ("0", *it);
619
+
620
+ // Add and subtract.
621
+ EXPECT_EQ(v.begin() + 2, v.end() - 2);
622
+ EXPECT_EQ(2 + v.begin(), v.end() - 2);
623
+
624
+ // Index.
625
+ it = span.begin();
626
+ EXPECT_EQ("3", v[3]);
627
+
628
+ // Relational operators.
629
+ EXPECT_TRUE(span.begin() != span.end());
630
+ EXPECT_TRUE(span.begin() == span.begin());
631
+ EXPECT_TRUE(span.begin() < span.end());
632
+ EXPECT_TRUE(span.begin() <= span.end());
633
+ EXPECT_TRUE(span.end() > span.begin());
634
+ EXPECT_TRUE(span.end() >= span.begin());
635
+ }
636
+
637
+ TYPED_TEST(AnySpanTest, ConstIterator) {
638
+ using T = typename TestFixture::template MaybeConst<std::string>;
639
+ std::vector<std::string> v = {"0", "1", "2", "3"};
640
+ AnySpan<T> span(v);
641
+
642
+ // Dereference.
643
+ auto it = span.cbegin();
644
+ EXPECT_EQ("0", *it);
645
+
646
+ // Postfix increment.
647
+ EXPECT_EQ("0", *(it++));
648
+ EXPECT_EQ("1", *(it++));
649
+
650
+ // Postfix decrement.
651
+ EXPECT_EQ("2", *(it--));
652
+ EXPECT_EQ("1", *(it--));
653
+
654
+ // Prefix increment.
655
+ EXPECT_EQ(it, span.cbegin());
656
+ EXPECT_EQ("1", *(++it));
657
+ EXPECT_EQ("2", *(++it));
658
+
659
+ // Postfix decrement.
660
+ EXPECT_EQ("1", *(--it));
661
+ EXPECT_EQ("0", *(--it));
662
+
663
+ // Increment by integer.
664
+ EXPECT_EQ(it, span.cbegin());
665
+ it += 3;
666
+ EXPECT_EQ("3", *it);
667
+
668
+ // Decrement by integer.
669
+ it = span.cend();
670
+ it -= 4;
671
+ EXPECT_EQ("0", *it);
672
+
673
+ // Add and subtract.
674
+ EXPECT_EQ(v.cbegin() + 2, v.cend() - 2);
675
+ EXPECT_EQ(2 + v.cbegin(), v.cend() - 2);
676
+
677
+ // Index.
678
+ it = span.cbegin();
679
+ EXPECT_EQ("3", v[3]);
680
+
681
+ // Relational operators.
682
+ EXPECT_TRUE(span.cbegin() != span.cend());
683
+ EXPECT_TRUE(span.cbegin() == span.cbegin());
684
+ EXPECT_TRUE(span.cbegin() < span.cend());
685
+ EXPECT_TRUE(span.cbegin() <= span.cend());
686
+ EXPECT_TRUE(span.cend() > span.cbegin());
687
+ EXPECT_TRUE(span.cend() >= span.cbegin());
688
+ }
689
+
690
+ TYPED_TEST(AnySpanTest, ReverseIterator) {
691
+ using T = typename TestFixture::template MaybeConst<std::string>;
692
+ std::vector<std::string> v = {"a", "b", "c", "d"};
693
+ AnySpan<T> span(v);
694
+ auto v_it = v.rbegin();
695
+ for (auto it = span.rbegin(); it != span.rend(); ++it, ++v_it) {
696
+ EXPECT_EQ(*v_it, *it);
697
+ }
698
+ }
699
+
700
+ TYPED_TEST(AnySpanTest, IndexingAt) {
701
+ using T = typename TestFixture::template MaybeConst<std::string>;
702
+ std::vector<std::string> v = {"a", "b", "c", "d"};
703
+ AnySpan<T> span(v);
704
+ EXPECT_EQ(&v.at(0), &v.at(0));
705
+ EXPECT_EQ(&v.at(1), &v.at(1));
706
+ EXPECT_EQ(&v.at(3), &v.at(3));
707
+ }
708
+
709
+ TYPED_TEST(AnySpanTest, AtThrows) {
710
+ using T = typename TestFixture::template MaybeConst<std::string>;
711
+ std::vector<std::string> v = {"a", "b", "c", "d"};
712
+ AnySpan<T> span(v);
713
+ ABSL_BASE_INTERNAL_EXPECT_FAIL(span.at(4), std::out_of_range,
714
+ "failed bounds check");
715
+ }
716
+
717
+ TYPED_TEST(AnySpanTest, FrontBack) {
718
+ using T = typename TestFixture::template MaybeConst<std::string>;
719
+ std::vector<std::string> v = {"a", "b", "c", "d"};
720
+ AnySpan<T> span(v);
721
+ EXPECT_EQ(&v.front(), &span.front());
722
+ EXPECT_EQ("a", span.front());
723
+ EXPECT_EQ(&v.back(), &span.back());
724
+ EXPECT_EQ("d", span.back());
725
+ }
726
+
727
+ // Returns a reference to a default constructed instance of the given type.
728
+ template <typename Container>
729
+ Container& DefaultInstance() {
730
+ static auto* c = new Container;
731
+ return *c;
732
+ }
733
+
734
+ // This test reaches into the implementation a bit, but it buys a lot of
735
+ // confidence that the flat-array optimizations are working correctly.
736
+ TYPED_TEST(AnySpanTest, CheapTypes) {
737
+ using T = typename TestFixture::template MaybeConst<int>;
738
+ using any_span_internal::IsCheap;
739
+ EXPECT_FALSE(IsCheap(AnySpan<T>(DefaultInstance<std::deque<int>>())));
740
+ EXPECT_FALSE(
741
+ IsCheap(AnySpan<T>(DefaultInstance<std::vector<std::unique_ptr<int>>>(),
742
+ any_span_transform::Deref())));
743
+ EXPECT_TRUE(IsCheap(AnySpan<T>(DefaultInstance<std::vector<int>>())));
744
+ EXPECT_TRUE(IsCheap(AnySpan<T>(DefaultInstance<absl::Span<int>>())));
745
+ EXPECT_TRUE(IsCheap(AnySpan<T>(DefaultInstance<std::vector<int>>())));
746
+ EXPECT_TRUE(IsCheap(AnySpan<T>(DefaultInstance<std::vector<int*>>(),
747
+ any_span_transform::Deref())));
748
+ EXPECT_TRUE(IsCheap(AnySpan<T>(DefaultInstance<std::vector<int*>>(),
749
+ any_span_transform::Deref())));
750
+ struct SomeContainer {
751
+ int& operator[](std::size_t) { ABSL_RAW_LOG(FATAL, "Not implemented"); }
752
+ const int& operator[](std::size_t) const {
753
+ ABSL_RAW_LOG(FATAL, "Not implemented");
754
+ }
755
+ std::size_t size() const { return 1; }
756
+ };
757
+ EXPECT_FALSE(IsCheap(AnySpan<T>(DefaultInstance<SomeContainer>())));
758
+ struct SomeCheapMutableContainer {
759
+ int& operator[](std::size_t) const {
760
+ ABSL_RAW_LOG(FATAL, "Not implemented");
761
+ }
762
+ int* data() const { return nullptr; }
763
+ std::size_t size() const { return 1; }
764
+ };
765
+ EXPECT_TRUE(
766
+ IsCheap(AnySpan<T>(DefaultInstance<SomeCheapMutableContainer>())));
767
+
768
+ struct SomeWonkyContainer {
769
+ int& operator[](std::size_t) const {
770
+ ABSL_RAW_LOG(FATAL, "Not implemented");
771
+ }
772
+ const int** data() const { return nullptr; }
773
+ std::size_t size() const { return 1; }
774
+ };
775
+ EXPECT_FALSE(IsCheap(AnySpan<T>(DefaultInstance<SomeWonkyContainer>())));
776
+ }
777
+
778
+ TYPED_TEST(AnySpanTest, TriviallyCopyable) {
779
+ using T = typename TestFixture::template MaybeConst<std::string>;
780
+ // Note: we could use is_trivially_copyable, but it is not implemented in
781
+ // Crosstool v18 which is the current version at the time of writing.
782
+ EXPECT_TRUE(std::is_trivially_copy_constructible<AnySpan<T>>::value);
783
+ EXPECT_TRUE(std::is_trivially_copy_assignable<AnySpan<T>>::value);
784
+ EXPECT_TRUE(std::is_trivially_destructible<AnySpan<T>>::value);
785
+ }
786
+
787
+ TYPED_TEST(AnySpanTest, IsConstructible) {
788
+ using T = typename TestFixture::template MaybeConst<std::string>;
789
+ using U = typename TestFixture::template MaybeConst<int>;
790
+ using VectorT =
791
+ typename TestFixture::template MaybeConst<std::vector<std::string>>;
792
+ using VectorU = typename TestFixture::template MaybeConst<std::vector<int>>;
793
+ EXPECT_FALSE((std::is_constructible<AnySpan<T>, T>::value));
794
+ EXPECT_FALSE((std::is_constructible<AnySpan<T>, T*>::value));
795
+ EXPECT_FALSE((std::is_constructible<AnySpan<T>, U>::value));
796
+ EXPECT_FALSE((std::is_constructible<AnySpan<T>, U(&)[5]>::value));
797
+ EXPECT_FALSE((std::is_constructible<AnySpan<T>, U*, std::size_t>::value));
798
+ EXPECT_FALSE((std::is_constructible<AnySpan<T>, VectorU&>::value));
799
+
800
+ EXPECT_TRUE((std::is_constructible<AnySpan<T>, VectorT&>::value));
801
+ EXPECT_TRUE((std::is_constructible<AnySpan<T>, T(&)[5]>::value));
802
+ EXPECT_TRUE((std::is_constructible<AnySpan<T>, T*, std::size_t>::value));
803
+ }
804
+
805
+ //
806
+ // ConstAnySpanTest covers parts of AnySpan interface that are only valid for
807
+ // AnySpans with const elements.
808
+ //
809
+
810
+ TEST(ConstAnySpanTest, ImplicitConversion) {
811
+ std::vector<int> v = {1, 2, 3};
812
+ ExpectSpanEqualsContainer<const int>(v, v);
813
+ }
814
+
815
+ TEST(ConstAnySpanTest, TemporaryArrayOfKnownSize) {
816
+ const int i = 5;
817
+ EXPECT_THAT(AnySpan<const int>({&i, &i, &i}, any_span_transform::Deref()),
818
+ testing::ElementsAre(5, 5, 5));
819
+ }
820
+
821
+ TEST(ConstAnySpanTest, CheapTypes) {
822
+ using any_span_internal::IsCheap;
823
+ EXPECT_TRUE(IsCheap(AnySpan<const int>(std::vector<const int*>(),
824
+ any_span_transform::Deref())));
825
+ EXPECT_TRUE(IsCheap(AnySpan<const int>(std::vector<const int*>(),
826
+ any_span_transform::Deref())));
827
+ EXPECT_TRUE(
828
+ IsCheap(AnySpan<const int>(DefaultInstance<absl::Span<const int>>())));
829
+ struct SomeCheapConstContainer {
830
+ const int& operator[](std::size_t) const {
831
+ ABSL_RAW_LOG(FATAL, "Not implemented");
832
+ }
833
+ const int* data() const { return nullptr; }
834
+ std::size_t size() const { return 1; }
835
+ };
836
+ EXPECT_TRUE(IsCheap(AnySpan<const int>(SomeCheapConstContainer())));
837
+ }
838
+
839
+ TEST(ConstAnySpanTest, InitializerListInt) {
840
+ auto test = [](AnySpan<const int> span) {
841
+ int expected = 1;
842
+ for (int i : span) {
843
+ EXPECT_EQ(expected++, i);
844
+ }
845
+ EXPECT_EQ(expected, 5);
846
+ };
847
+ test({1, 2, 3, 4});
848
+ }
849
+
850
+ TEST(ConstAnySpanTest, InitializerListString) {
851
+ auto test = [](AnySpan<const std::string> span) {
852
+ int expected = 1;
853
+ for (const std::string& i : span) {
854
+ EXPECT_EQ(absl::StrCat(expected++), i);
855
+ }
856
+ EXPECT_EQ(expected, 5);
857
+ };
858
+ test({"1", "2", "3", "4"});
859
+ }
860
+
861
+ TEST(ConstAnySpanTest, InitializerListDerivedToBase) {
862
+ // Derived to base, implicit conversion.
863
+ [](AnySpan<const Base2> bases) {
864
+ for (const Base2& b : bases) {
865
+ EXPECT_EQ(b.b2, 2);
866
+ // Make sure the value was not sliced.
867
+ EXPECT_EQ(typeid(b), typeid(Child));
868
+ }
869
+ }({Child{}, Child{}, Child{}});
870
+
871
+ // Derived to base with explicit transform.
872
+ Child children[3];
873
+ [](AnySpan<const Base2> bases) {
874
+ for (const Base2& b : bases) {
875
+ EXPECT_EQ(b.b2, 2);
876
+ // Make sure the value was not sliced.
877
+ EXPECT_EQ(typeid(b), typeid(Child));
878
+ }
879
+ }({{Child{}, Child{}, Child{}},
880
+ [](auto& obj) -> const Base2& { return obj; }});
881
+ }
882
+
883
+ TEST(ConstAnySpanTest,
884
+ InitializerListUsesValueTypeWhenConversionNeedsTemporaries) {
885
+ // If this were to call the initializer_list<Element> overload it would fail
886
+ // when it tries to make an lvalue transform from std::string to
887
+ // std::string_view.
888
+ // Instead, it must be calling the initializer_list<value_type> overload,
889
+ // doing the conversion on the call site.
890
+ [](AnySpan<const std::string_view> s) {
891
+ EXPECT_THAT(s, ElementsAre("A", "B", "C"));
892
+ }({"A", "B", "C"});
893
+ }
894
+
895
+ TEST(ConstAnySpanTest, MakeAnySpanFromVector) {
896
+ std::vector<int> v = {1, 2, 3, 4};
897
+ auto span = MakeConstAnySpan(v);
898
+ EXPECT_TRUE((std::is_same<decltype(span), AnySpan<const int>>()));
899
+ EXPECT_EQ(span.size(), 4);
900
+ for (size_t i = 0; i < 4; ++i) {
901
+ EXPECT_EQ(&span[i], &v[i]);
902
+ }
903
+ }
904
+
905
+ TEST(ConstAnySpanTest, MakeAnySpanFromPtrAndSize) {
906
+ std::vector<int> v = {1, 2, 3, 4};
907
+ auto span = MakeConstAnySpan(v.data(), v.size());
908
+ EXPECT_TRUE((std::is_same<decltype(span), AnySpan<const int>>()));
909
+ EXPECT_EQ(span.size(), 4);
910
+ for (size_t i = 0; i < 4; ++i) {
911
+ EXPECT_EQ(&span[i], &v[i]);
912
+ }
913
+ }
914
+
915
+ TEST(ConstAnySpanTest, MakeAnySpanFromArray) {
916
+ int a[] = {1, 2, 3, 4};
917
+ auto span = MakeConstAnySpan(a);
918
+ EXPECT_TRUE((std::is_same<decltype(span), AnySpan<const int>>()));
919
+ EXPECT_EQ(span.size(), 4);
920
+ for (size_t i = 0; i < 4; ++i) {
921
+ EXPECT_EQ(&span[i], &a[i]);
922
+ }
923
+ }
924
+
925
+ TEST(ConstAnySpanTest, MakeDerefAnySpanFromArray) {
926
+ int v = 0;
927
+ int* a[] = {&v, &v, &v};
928
+ auto span = MakeConstDerefAnySpan(a);
929
+ EXPECT_TRUE((std::is_same<decltype(span), AnySpan<const int>>()));
930
+ EXPECT_EQ(span.size(), 3);
931
+ for (size_t i = 0; i < 3; ++i) {
932
+ EXPECT_EQ(&span[i], a[i]);
933
+ }
934
+ }
935
+
936
+ //
937
+ // MutableAnySpanTest covers parts of AnySpan interface that are only valid for
938
+ // AnySpans with mutable elements.
939
+ //
940
+
941
+ TEST(MutableAnySpanTest, MutableVectorString) {
942
+ std::vector<std::string> v = {"a", "b", "c", "d"};
943
+ AnySpan<std::string> span(v);
944
+ span[0] = "e";
945
+ EXPECT_EQ(v[0], "e");
946
+ }
947
+
948
+ TEST(MutableAnySpanTest, MutableToConstConversion) {
949
+ std::vector<std::string> v = {"a", "b", "c", "d"};
950
+ AnySpan<std::string> mutable_span(v);
951
+ AnySpan<const std::string> const_span(mutable_span);
952
+ EXPECT_TRUE(any_span_internal::IsCheap(const_span));
953
+ mutable_span[0] = "e";
954
+ EXPECT_EQ(const_span[0], "e");
955
+ mutable_span.subspan(1)[0] = "f";
956
+ EXPECT_EQ(const_span[1], "f");
957
+
958
+ std::vector<std::string> v2 = {"a"};
959
+ mutable_span = AnySpan<std::string>(v2);
960
+ EXPECT_EQ(const_span[0], "e");
961
+ }
962
+
963
+ TEST(MutableAnySpanTest, DerefMutableToConstConversion) {
964
+ std::vector<std::string> v = {"a", "b", "c", "d"};
965
+ std::vector<std::string*> v_ptrs;
966
+ for (std::string& s : v) {
967
+ v_ptrs.push_back(&s);
968
+ }
969
+ AnySpan<std::string> mutable_span(v_ptrs, any_span_transform::Deref());
970
+ AnySpan<const std::string> const_span(mutable_span);
971
+ EXPECT_TRUE(any_span_internal::IsCheap(const_span));
972
+ mutable_span[0] = "e";
973
+ EXPECT_EQ(const_span[0], "e");
974
+ EXPECT_EQ(v[0], "e");
975
+ mutable_span.subspan(1)[0] = "f";
976
+ EXPECT_EQ(const_span[1], "f");
977
+ }
978
+
979
+ TEST(MutableAnySpanTest, MutableToConstDeque) {
980
+ std::deque<std::string> d = {"a", "b", "c", "d"};
981
+ AnySpan<std::string> mutable_span(d);
982
+ AnySpan<const std::string> const_span(mutable_span);
983
+ EXPECT_FALSE(any_span_internal::IsCheap(const_span));
984
+ mutable_span[0] = "e";
985
+ EXPECT_EQ(const_span[0], "e");
986
+ mutable_span.subspan(1)[0] = "f";
987
+ EXPECT_EQ(const_span[1], "f");
988
+ }
989
+
990
+ TEST(MutableAnySpanTest, Deref) {
991
+ std::string s = "a";
992
+ AnySpan<std::string>({&s}, any_span_transform::Deref())[0] = "b";
993
+ EXPECT_EQ(s, "b");
994
+ }
995
+
996
+ // Checks that recommended usage works.
997
+ TEST(MutableAnySpanTest, AsFunctionArgument) {
998
+ std::vector<std::string> v = {"a", "b", "c", "d"};
999
+ auto set_all_to_e = [](AnySpan<std::string> span) {
1000
+ for (std::string& s : span) {
1001
+ s = "e";
1002
+ }
1003
+ };
1004
+ set_all_to_e(AnySpan<std::string>(v));
1005
+ for (const std::string& e : v) {
1006
+ EXPECT_EQ(e, "e");
1007
+ }
1008
+ }
1009
+
1010
+ TEST(MutableAnySpanTest, MutateThroughIterator) {
1011
+ std::vector<std::string> v = {"a", "b", "c", "d"};
1012
+ AnySpan<std::string> span(v);
1013
+ AnySpan<std::string>::iterator it = span.begin();
1014
+ it[2] = "e";
1015
+ EXPECT_EQ(v[2], "e");
1016
+ ++it;
1017
+ *it = "f";
1018
+ EXPECT_EQ(v[1], "f");
1019
+ for (std::string& s : span) {
1020
+ s = "g";
1021
+ }
1022
+ for (const std::string& e : v) {
1023
+ EXPECT_EQ(e, "g");
1024
+ }
1025
+ }
1026
+
1027
+ TEST(MutableAnySpanTest, MutateThroughSubSpan) {
1028
+ std::vector<int> v = {1, 2, 3, 4};
1029
+ AnySpan<int> span(v);
1030
+ span = span.subspan(1, 2);
1031
+ for (int& i : span) {
1032
+ i = 42;
1033
+ }
1034
+ EXPECT_THAT(v, ElementsAre(1, 42, 42, 4));
1035
+ }
1036
+
1037
+ TYPED_TEST(AnySpanTest, SubspanToEnd) {
1038
+ int arr[] = {0, 1, 2};
1039
+ AnySpan<int> span(arr);
1040
+ EXPECT_THAT(span.subspan(0, AnySpan<int>::npos), ElementsAre(0, 1, 2));
1041
+ EXPECT_THAT(span.subspan(1, AnySpan<int>::npos), ElementsAre(1, 2));
1042
+ EXPECT_THAT(span.subspan(2, AnySpan<int>::npos), ElementsAre(2));
1043
+ EXPECT_THAT(span.subspan(3, AnySpan<int>::npos), ElementsAre());
1044
+ #if GTEST_HAS_DEATH_TEST
1045
+ if (IsHardened()) {
1046
+ EXPECT_DEATH(span.subspan(4, AnySpan<int>::npos), "");
1047
+ EXPECT_DEATH(span.subspan(AnySpan<int>::npos, AnySpan<int>::npos), "");
1048
+ }
1049
+ #endif
1050
+ }
1051
+
1052
+ TEST(MutableAnySpanTest, NonTruncatingSubspan) {
1053
+ std::vector<int> v = {1, 2, 3, 4};
1054
+ AnySpan<int> span(v);
1055
+ #if GTEST_HAS_DEATH_TEST
1056
+ if (IsHardened()) {
1057
+ EXPECT_DEATH(span.subspan(5, 0), "");
1058
+ EXPECT_DEATH(span.subspan(5, 1), "");
1059
+ EXPECT_DEATH(span.subspan(AnySpan<int>::npos, 0), "");
1060
+ EXPECT_DEATH(span.subspan(AnySpan<int>::npos, 1), "");
1061
+ EXPECT_DEATH(span.subspan(0, 5), "");
1062
+ EXPECT_DEATH(span.first(5), "");
1063
+ EXPECT_DEATH(span.first(AnySpan<int>::npos), "");
1064
+ }
1065
+ #endif
1066
+ }
1067
+
1068
+ TEST(MutableAnySpanTest, IteratorToConstIteratorConversion) {
1069
+ std::vector<int> v = {1};
1070
+ AnySpan<int> span(v);
1071
+ AnySpan<int>::iterator it = span.begin();
1072
+ AnySpan<int>::const_iterator cit = it;
1073
+ EXPECT_EQ(&*it, &*cit);
1074
+ }
1075
+
1076
+ // Checks that implicit conversion from a mutable view works.
1077
+ TEST(MutableAnySpanTest, ImplicitConversionFromMutableSpan) {
1078
+ std::vector<std::string> v = {"a", "b", "c", "d"};
1079
+ absl::Span<std::string> mutable_slice(v);
1080
+ auto set_all_to_e = [](AnySpan<std::string> span) {
1081
+ for (std::string& s : span) {
1082
+ s = "e";
1083
+ }
1084
+ };
1085
+ set_all_to_e(mutable_slice);
1086
+ for (const std::string& s : v) {
1087
+ EXPECT_EQ(s, "e");
1088
+ }
1089
+ }
1090
+
1091
+ bool WantsStringOrAnySpan(absl::string_view /* ignored */) { return false; }
1092
+ bool WantsStringOrAnySpan(AnySpan<std::string> /* ignored */) { return true; }
1093
+ bool WantsStringOrConstAnySpan(absl::string_view /* ignored */) {
1094
+ return false;
1095
+ }
1096
+ bool WantsStringOrConstAnySpan(AnySpan<const std::string> /* ignored */) {
1097
+ return true;
1098
+ }
1099
+ // Checks that AnySpan(char (&array)[N]) is not used in the overload
1100
+ // resolution when building an AnySpan<string> (it would not compile anyway).
1101
+ TEST(MutableAnySpanTest, ResolveAmbiguityWithAnySpanOfChars) {
1102
+ std::string foo;
1103
+ AnySpan<std::string> bar;
1104
+ EXPECT_FALSE(WantsStringOrAnySpan("abc"));
1105
+ EXPECT_FALSE(WantsStringOrAnySpan(foo));
1106
+ EXPECT_TRUE(WantsStringOrAnySpan(bar));
1107
+ EXPECT_FALSE(WantsStringOrConstAnySpan("abc"));
1108
+ EXPECT_FALSE(WantsStringOrConstAnySpan(foo));
1109
+ EXPECT_TRUE(WantsStringOrConstAnySpan(bar));
1110
+ }
1111
+
1112
+ TEST(AnySpanTest, SupportsAbslHash) {
1113
+ std::vector<size_t> v = {1, 2, 3};
1114
+ std::vector<std::string> vs = {"1", "2", "3"};
1115
+ std::vector<std::unique_ptr<size_t>> vu;
1116
+ vu.push_back(std::make_unique<size_t>(1));
1117
+ vu.push_back(std::make_unique<size_t>(2));
1118
+ vu.push_back(std::make_unique<size_t>(3));
1119
+
1120
+ EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
1121
+ // {1, 2, 3}
1122
+ AnySpan<const size_t>(v),
1123
+ AnySpan<const size_t>(vu, any_span_transform::Deref()),
1124
+ // {1, 2}
1125
+ AnySpan<const size_t>(std::vector<size_t>({1, 2})),
1126
+ AnySpan<const size_t>(std::deque<size_t>({1, 2})),
1127
+ // {1, 2, 4}
1128
+ AnySpan<const size_t>(std::vector<size_t>({1, 2, 4})),
1129
+ AnySpan<const size_t>(std::deque<size_t>({1, 2, 4})),
1130
+ // Empty.
1131
+ AnySpan<const size_t>(),
1132
+ AnySpan<const size_t>(std::vector<size_t>()),
1133
+ }));
1134
+ }
1135
+
1136
+ // This is necessary to avoid a bunch of lint warnings suggesting that we use
1137
+ // EXPECT_EQ/etc.
1138
+ bool Identity(bool b) { return b; }
1139
+
1140
+ template <typename T, typename U, typename V>
1141
+ void TestEquality(T&& orig, U&& eq, V&& diff) {
1142
+ EXPECT_TRUE(Identity(std::forward<T>(orig) == std::forward<U>(eq)));
1143
+ EXPECT_TRUE(Identity(std::forward<U>(eq) == std::forward<T>(orig)));
1144
+ EXPECT_FALSE(Identity(std::forward<T>(orig) != std::forward<U>(eq)));
1145
+ EXPECT_FALSE(Identity(std::forward<U>(eq) != std::forward<T>(orig)));
1146
+
1147
+ EXPECT_FALSE(Identity(std::forward<T>(orig) == std::forward<V>(diff)));
1148
+ EXPECT_FALSE(Identity(std::forward<V>(diff) == std::forward<T>(orig)));
1149
+ EXPECT_TRUE(Identity(std::forward<T>(orig) != std::forward<V>(diff)));
1150
+ EXPECT_TRUE(Identity(std::forward<V>(diff) != std::forward<T>(orig)));
1151
+ }
1152
+
1153
+ TEST(AnySpanTest, Equals) {
1154
+ int arr[] = {1, 2, 3};
1155
+ std::vector<int> eq(std::begin(arr), std::end(arr));
1156
+ int diff[] = {1, 2, 4};
1157
+ TestEquality(AnySpan<int>(arr), AnySpan<int>(eq), AnySpan<int>(diff));
1158
+ TestEquality(AnySpan<const int>(arr), AnySpan<int>(eq), AnySpan<int>(diff));
1159
+ TestEquality(AnySpan<int>(arr), AnySpan<const int>(eq),
1160
+ AnySpan<const int>(diff));
1161
+ TestEquality(AnySpan<const int>(arr), AnySpan<const int>(eq),
1162
+ AnySpan<const int>(diff));
1163
+
1164
+ TestEquality(AnySpan<const int>(arr), eq, diff);
1165
+ TestEquality(AnySpan<int>(arr), eq, diff);
1166
+ }
1167
+
1168
+ // If an object is copied, mark the bool pointed by `copied` true.
1169
+ class MarkIfCopied {
1170
+ public:
1171
+ explicit MarkIfCopied(bool* copied) : copied_(copied) {}
1172
+
1173
+ // NOLINT_NEXT_LINE(google-explicit-constructor)
1174
+ MarkIfCopied(const MarkIfCopied& other) { *this = other; }
1175
+
1176
+ MarkIfCopied& operator=(const MarkIfCopied& other) {
1177
+ copied_ = other.copied_;
1178
+ *copied_ = true;
1179
+ return *this;
1180
+ }
1181
+
1182
+ private:
1183
+ bool* copied_;
1184
+ };
1185
+
1186
+ TEST(MarkIfCopied, EnsureWorks) {
1187
+ bool copied = false;
1188
+ MarkIfCopied item(&copied);
1189
+ ASSERT_FALSE(copied);
1190
+ MarkIfCopied _unused_copied_item(item);
1191
+ EXPECT_TRUE(copied);
1192
+ }
1193
+
1194
+ TEST(AnySpanTest, ReferenceWrapperNotCopied) {
1195
+ bool copied1 = false;
1196
+ bool copied2 = false;
1197
+ MarkIfCopied item1(&copied1);
1198
+ MarkIfCopied item2(&copied2);
1199
+ std::vector<std::reference_wrapper<const MarkIfCopied>> items;
1200
+ items.push_back(std::cref(item1));
1201
+ items.push_back(std::cref(item2));
1202
+ AnySpan<const MarkIfCopied> span(items);
1203
+ EXPECT_EQ(2, span.size());
1204
+ EXPECT_FALSE(copied1);
1205
+ EXPECT_FALSE(copied2);
1206
+ }
1207
+
1208
+ } // namespace
1209
+ ABSL_NAMESPACE_END
1210
+ } // namespace absl