re2 1.24.1 → 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 +62 -4
  3. package/binding.gyp +1 -2
  4. package/lib/addon.cc +7 -3
  5. package/lib/exec.cc +4 -4
  6. package/lib/match.cc +4 -4
  7. package/lib/pattern.cc +148 -1
  8. package/lib/replace.cc +5 -4
  9. package/lib/search.cc +1 -1
  10. package/lib/set.cc +75 -0
  11. package/lib/test.cc +1 -1
  12. package/lib/unicode_properties.h +15840 -0
  13. package/lib/wrapped_re2.h +11 -4
  14. package/lib/wrapped_re2_set.h +3 -1
  15. package/llms-full.txt +37 -7
  16. package/llms.txt +4 -1
  17. package/package.json +11 -10
  18. package/re2.d.ts +2 -0
  19. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +87 -74
  20. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  21. package/vendor/abseil-cpp/FAQ.md +130 -79
  22. package/vendor/abseil-cpp/MODULE.bazel +6 -7
  23. package/vendor/abseil-cpp/absl/BUILD.bazel +6 -0
  24. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +4 -0
  25. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +4 -0
  26. package/vendor/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  27. package/vendor/abseil-cpp/absl/algorithm/container.h +164 -17
  28. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +390 -13
  29. package/vendor/abseil-cpp/absl/base/BUILD.bazel +53 -6
  30. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +28 -4
  31. package/vendor/abseil-cpp/absl/base/attributes.h +61 -42
  32. package/vendor/abseil-cpp/absl/base/call_once.h +1 -0
  33. package/vendor/abseil-cpp/absl/base/casts.h +8 -1
  34. package/vendor/abseil-cpp/absl/base/casts_test.cc +3 -6
  35. package/vendor/abseil-cpp/absl/base/config.h +54 -10
  36. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +9 -9
  37. package/vendor/abseil-cpp/absl/base/fast_type_id.h +30 -2
  38. package/vendor/abseil-cpp/absl/base/fast_type_id_test.cc +3 -0
  39. package/vendor/abseil-cpp/absl/base/internal/exception_safety_testing.h +15 -12
  40. package/vendor/abseil-cpp/absl/base/internal/hardening.h +136 -0
  41. package/vendor/abseil-cpp/absl/base/internal/hardening_test.cc +168 -0
  42. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +2 -2
  43. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -0
  44. package/vendor/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  45. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +1 -2
  46. package/vendor/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  47. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  48. package/vendor/abseil-cpp/absl/base/macros.h +36 -20
  49. package/vendor/abseil-cpp/absl/base/nullability.h +4 -3
  50. package/vendor/abseil-cpp/absl/base/optimization.h +3 -2
  51. package/vendor/abseil-cpp/absl/base/optimization_test.cc +4 -3
  52. package/vendor/abseil-cpp/absl/base/options.h +55 -1
  53. package/vendor/abseil-cpp/absl/base/policy_checks.h +5 -5
  54. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  55. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  56. package/vendor/abseil-cpp/absl/base/throw_delegate_test.cc +19 -28
  57. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -0
  58. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +2 -0
  59. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +3 -2
  60. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  61. package/vendor/abseil-cpp/absl/container/BUILD.bazel +19 -7
  62. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +6 -5
  63. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +3 -5
  64. package/vendor/abseil-cpp/absl/container/btree_set.h +5 -5
  65. package/vendor/abseil-cpp/absl/container/btree_test.cc +11 -14
  66. package/vendor/abseil-cpp/absl/container/chunked_queue.h +8 -6
  67. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +5 -5
  68. package/vendor/abseil-cpp/absl/container/fixed_array.h +14 -13
  69. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +3 -3
  70. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +18 -6
  71. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +34 -1
  72. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +21 -7
  73. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +39 -7
  74. package/vendor/abseil-cpp/absl/container/inlined_vector.h +29 -29
  75. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +2 -2
  76. package/vendor/abseil-cpp/absl/container/internal/btree.h +32 -24
  77. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +16 -17
  78. package/vendor/abseil-cpp/absl/container/internal/common.h +6 -5
  79. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  80. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +16 -16
  81. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +13 -13
  82. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +41 -31
  83. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +2 -2
  84. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +4 -4
  85. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +3 -3
  86. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +27 -19
  87. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -2
  88. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +0 -17
  89. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +12 -30
  90. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +28 -28
  91. package/vendor/abseil-cpp/absl/container/internal/layout.h +13 -13
  92. package/vendor/abseil-cpp/absl/container/internal/layout_test.cc +3 -2
  93. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +60 -62
  94. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +59 -39
  95. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +619 -326
  96. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +25 -2
  97. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +4 -4
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +575 -159
  99. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +2 -2
  100. package/vendor/abseil-cpp/absl/container/node_hash_map.h +27 -15
  101. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +34 -0
  102. package/vendor/abseil-cpp/absl/container/node_hash_set.h +25 -11
  103. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +39 -7
  104. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +7 -4
  105. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +0 -1
  106. package/vendor/abseil-cpp/absl/crc/CMakeLists.txt +2 -3
  107. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +2 -1
  108. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +6 -6
  109. package/vendor/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  110. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  111. package/vendor/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  112. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +143 -81
  113. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +9 -31
  114. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +3 -33
  115. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  116. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +2 -1
  117. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +12 -2
  118. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +2 -3
  119. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -0
  120. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -4
  121. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  122. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +4 -0
  123. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +46 -36
  124. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +18 -58
  125. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +5 -48
  126. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +10 -124
  127. package/vendor/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  128. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +58 -106
  129. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +37 -36
  130. package/vendor/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  131. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -3
  132. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +1 -1
  133. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  134. package/vendor/abseil-cpp/absl/flags/commandlineflag_test.cc +1 -1
  135. package/vendor/abseil-cpp/absl/flags/flag_benchmark.cc +5 -5
  136. package/vendor/abseil-cpp/absl/flags/flag_test.cc +30 -30
  137. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +4 -4
  138. package/vendor/abseil-cpp/absl/flags/internal/flag.h +6 -6
  139. package/vendor/abseil-cpp/absl/flags/marshalling.h +2 -28
  140. package/vendor/abseil-cpp/absl/flags/marshalling_test.cc +12 -11
  141. package/vendor/abseil-cpp/absl/flags/reflection_test.cc +1 -1
  142. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +26 -1
  143. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +29 -1
  144. package/vendor/abseil-cpp/absl/functional/any_invocable.h +13 -14
  145. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +46 -47
  146. package/vendor/abseil-cpp/absl/functional/bind_back.h +79 -0
  147. package/vendor/abseil-cpp/absl/functional/bind_back_test.cc +237 -0
  148. package/vendor/abseil-cpp/absl/functional/bind_front.h +7 -1
  149. package/vendor/abseil-cpp/absl/functional/bind_front_test.cc +4 -4
  150. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +2 -2
  151. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +28 -28
  152. package/vendor/abseil-cpp/absl/functional/internal/back_binder.h +95 -0
  153. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  154. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  155. package/vendor/abseil-cpp/absl/functional/overload_test.cc +13 -13
  156. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +1 -2
  157. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +1 -2
  158. package/vendor/abseil-cpp/absl/hash/hash.h +1 -1
  159. package/vendor/abseil-cpp/absl/hash/hash_test.cc +14 -20
  160. package/vendor/abseil-cpp/absl/hash/hash_testing.h +11 -9
  161. package/vendor/abseil-cpp/absl/hash/internal/city.cc +39 -51
  162. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +165 -47
  163. package/vendor/abseil-cpp/absl/hash/internal/hash.h +82 -26
  164. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +36 -1
  165. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +8 -5
  166. package/vendor/abseil-cpp/absl/log/BUILD.bazel +5 -2
  167. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +5 -3
  168. package/vendor/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  169. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +15 -1
  170. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -4
  171. package/vendor/abseil-cpp/absl/log/internal/log_message.h +14 -0
  172. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  173. package/vendor/abseil-cpp/absl/log/internal/proto.cc +13 -0
  174. package/vendor/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  175. package/vendor/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  176. package/vendor/abseil-cpp/absl/log/internal/structured_proto_test.cc +3 -3
  177. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +2 -2
  178. package/vendor/abseil-cpp/absl/log/internal/vlog_config_benchmark.cc +3 -3
  179. package/vendor/abseil-cpp/absl/log/log_format_test.cc +19 -2
  180. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +18 -0
  181. package/vendor/abseil-cpp/absl/log/log_streamer.h +29 -2
  182. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +18 -0
  183. package/vendor/abseil-cpp/absl/log/scoped_mock_log_test.cc +1 -1
  184. package/vendor/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  185. package/vendor/abseil-cpp/absl/log/vlog_is_on_test.cc +6 -5
  186. package/vendor/abseil-cpp/absl/memory/memory.h +55 -5
  187. package/vendor/abseil-cpp/absl/memory/memory_test.cc +55 -1
  188. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  189. package/vendor/abseil-cpp/absl/meta/internal/requires.h +1 -1
  190. package/vendor/abseil-cpp/absl/meta/type_traits.h +119 -55
  191. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +7 -7
  192. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +6 -6
  193. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +3 -1
  194. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +0 -4
  195. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +32 -33
  196. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +25 -2
  197. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +8 -5
  198. package/vendor/abseil-cpp/absl/random/BUILD.bazel +13 -1
  199. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +23 -2
  200. package/vendor/abseil-cpp/absl/random/benchmarks.cc +1 -1
  201. package/vendor/abseil-cpp/absl/random/beta_distribution.h +2 -2
  202. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  203. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +43 -0
  204. package/vendor/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  205. package/vendor/abseil-cpp/absl/random/distributions.h +17 -17
  206. package/vendor/abseil-cpp/absl/random/distributions_test.cc +4 -4
  207. package/vendor/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  208. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +4 -2
  209. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  210. package/vendor/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  211. package/vendor/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  212. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  213. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc +3 -2
  214. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +14 -40
  215. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  216. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +2 -2
  217. package/vendor/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  218. package/vendor/abseil-cpp/absl/random/internal/pcg_engine_test.cc +3 -2
  219. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  220. package/vendor/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  221. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +3 -2
  222. package/vendor/abseil-cpp/absl/random/internal/randen_test.cc +3 -2
  223. package/vendor/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  224. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +4 -4
  225. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  226. package/vendor/abseil-cpp/absl/random/internal/traits.h +21 -0
  227. package/vendor/abseil-cpp/absl/random/internal/traits_test.cc +5 -0
  228. package/vendor/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  229. package/vendor/abseil-cpp/absl/random/internal/uniform_helper_test.cc +2 -1
  230. package/vendor/abseil-cpp/absl/random/mocking_access.h +74 -0
  231. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +9 -19
  232. package/vendor/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  233. package/vendor/abseil-cpp/absl/status/BUILD.bazel +81 -0
  234. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +91 -0
  235. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  236. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +26 -2
  237. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +22 -8
  238. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +43 -43
  239. package/vendor/abseil-cpp/absl/status/status.cc +62 -70
  240. package/vendor/abseil-cpp/absl/status/status.h +249 -23
  241. package/vendor/abseil-cpp/absl/status/status_benchmark.cc +12 -0
  242. package/vendor/abseil-cpp/absl/status/status_builder.cc +196 -0
  243. package/vendor/abseil-cpp/absl/status/status_builder.h +978 -0
  244. package/vendor/abseil-cpp/absl/status/status_builder_test.cc +380 -0
  245. package/vendor/abseil-cpp/absl/status/status_macros.h +484 -0
  246. package/vendor/abseil-cpp/absl/status/status_macros_test.cc +634 -0
  247. package/vendor/abseil-cpp/absl/status/status_matchers.h +2 -1
  248. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +3 -4
  249. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  250. package/vendor/abseil-cpp/absl/status/status_test.cc +443 -13
  251. package/vendor/abseil-cpp/absl/status/statusor.h +69 -36
  252. package/vendor/abseil-cpp/absl/status/statusor_test.cc +132 -35
  253. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +42 -7
  254. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +33 -4
  255. package/vendor/abseil-cpp/absl/strings/ascii.h +1 -2
  256. package/vendor/abseil-cpp/absl/strings/atod_manual_test.cc +5 -5
  257. package/vendor/abseil-cpp/absl/strings/cord.cc +26 -7
  258. package/vendor/abseil-cpp/absl/strings/cord.h +23 -13
  259. package/vendor/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  260. package/vendor/abseil-cpp/absl/strings/cord_test.cc +85 -9
  261. package/vendor/abseil-cpp/absl/strings/escaping.cc +176 -30
  262. package/vendor/abseil-cpp/absl/strings/escaping.h +12 -2
  263. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +1 -3
  264. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +18 -18
  265. package/vendor/abseil-cpp/absl/strings/has_absl_stringify_test.cc +2 -2
  266. package/vendor/abseil-cpp/absl/strings/has_ostream_operator_test.cc +2 -2
  267. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +10 -10
  268. package/vendor/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc +1 -1
  269. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  270. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  271. package/vendor/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  272. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +2 -26
  273. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +23 -2
  274. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +6 -2
  275. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -24
  276. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized_test.cc +16 -41
  277. package/vendor/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  278. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  279. package/vendor/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  280. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +12 -20
  281. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +510 -307
  282. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +0 -1
  283. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +9 -10
  284. package/vendor/abseil-cpp/absl/strings/internal/string_constant_test.cc +6 -5
  285. package/vendor/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  286. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream.h +119 -0
  287. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream_test.cc +111 -0
  288. package/vendor/abseil-cpp/absl/strings/numbers.cc +406 -0
  289. package/vendor/abseil-cpp/absl/strings/numbers.h +4 -0
  290. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +33 -0
  291. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +10 -6
  292. package/vendor/abseil-cpp/absl/strings/str_cat.h +36 -1
  293. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +1 -2
  294. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +28 -0
  295. package/vendor/abseil-cpp/absl/strings/str_join_test.cc +4 -4
  296. package/vendor/abseil-cpp/absl/strings/str_split.h +11 -6
  297. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +13 -0
  298. package/vendor/abseil-cpp/absl/strings/substitute.h +2 -2
  299. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +3 -0
  300. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +21 -0
  301. package/vendor/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  302. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +13 -0
  303. package/vendor/abseil-cpp/absl/synchronization/mutex.h +32 -2
  304. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +17 -3
  305. package/vendor/abseil-cpp/absl/time/BUILD.bazel +80 -0
  306. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +73 -0
  307. package/vendor/abseil-cpp/absl/time/clock.h +3 -0
  308. package/vendor/abseil-cpp/absl/time/clock_interface.cc +71 -0
  309. package/vendor/abseil-cpp/absl/time/clock_interface.h +93 -0
  310. package/vendor/abseil-cpp/absl/time/clock_interface_test.cc +128 -0
  311. package/vendor/abseil-cpp/absl/time/format.cc +3 -10
  312. package/vendor/abseil-cpp/absl/time/format_test.cc +12 -0
  313. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +90 -89
  314. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +80 -5
  315. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +1 -2
  316. package/vendor/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  317. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  318. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver +0 -0
  319. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
  320. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh +0 -0
  321. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon +0 -0
  322. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi +0 -0
  323. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane +0 -0
  324. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific +0 -0
  325. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau +0 -0
  326. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol +0 -0
  327. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +1 -1
  328. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +3 -3
  329. package/vendor/abseil-cpp/absl/time/simulated_clock.cc +225 -0
  330. package/vendor/abseil-cpp/absl/time/simulated_clock.h +109 -0
  331. package/vendor/abseil-cpp/absl/time/simulated_clock_test.cc +614 -0
  332. package/vendor/abseil-cpp/absl/types/BUILD.bazel +116 -0
  333. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +100 -0
  334. package/vendor/abseil-cpp/absl/types/any.h +26 -4
  335. package/vendor/abseil-cpp/absl/types/any_span.h +1067 -0
  336. package/vendor/abseil-cpp/absl/types/any_span_benchmark.cc +258 -0
  337. package/vendor/abseil-cpp/absl/types/any_span_test.cc +1210 -0
  338. package/vendor/abseil-cpp/absl/types/compare.h +4 -4
  339. package/vendor/abseil-cpp/absl/types/internal/any_span.h +477 -0
  340. package/vendor/abseil-cpp/absl/types/internal/span.h +5 -6
  341. package/vendor/abseil-cpp/absl/types/optional.h +30 -3
  342. package/vendor/abseil-cpp/absl/types/optional_ref.h +295 -0
  343. package/vendor/abseil-cpp/absl/types/optional_ref_test.cc +370 -0
  344. package/vendor/abseil-cpp/absl/types/source_location.cc +18 -0
  345. package/vendor/abseil-cpp/absl/types/source_location.h +172 -0
  346. package/vendor/abseil-cpp/absl/types/source_location_test.cc +139 -0
  347. package/vendor/abseil-cpp/absl/types/span.h +19 -23
  348. package/vendor/abseil-cpp/absl/types/variant.h +75 -18
  349. package/vendor/abseil-cpp/absl/types/variant_test.cc +23 -23
  350. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -0
  351. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +1 -0
  352. package/vendor/abseil-cpp/absl/utility/utility.h +99 -16
  353. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -0
  354. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +10 -4
  355. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +13 -6
  356. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +10 -4
  357. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +12 -5
  358. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +9 -2
  359. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  360. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +10 -3
  361. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +8 -2
  362. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +4 -3
  363. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +2 -2
  364. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -1
  365. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -1
  366. package/AGENTS.md +0 -131
  367. package/ARCHITECTURE.md +0 -152
  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,1067 @@
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
+ // -----------------------------------------------------------------------------
16
+ // File: any_span.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // AnySpan provides a view of a random access container, much like absl::Span
20
+ // (go/totw/93). See also go/totw/145#gtlanyspan for an introduction of AnySpan.
21
+ //
22
+ // The primary differences from absl::Span are:
23
+ // * AnySpan works with any random access container, whereas Span only works if
24
+ // elements are contiguous in memory -- both will work with std::vector, but
25
+ // only AnySpan will work with std::deque.
26
+ // * AnySpan performs a variety of transformations, such as dereferencing
27
+ // containers of pointers, or accessing specific members from a collection of
28
+ // structs, whereas Span does not offer such capability. For example,
29
+ // AnySpan<std::string> can handle both std::vector<std::string> and
30
+ // std::vector<std::string*>. Safe implicit conversions for a container's
31
+ // value type (such as up-casting from child classes, or converting
32
+ // reference_wrapper<T> to const T&) will happen implicitly.
33
+ // * AnySpan's generality has some small runtime cost, usually only a
34
+ // conditional branch per element access, or a function-pointer call in the
35
+ // worst case. Span may be preferable when the inputs are likely to be
36
+ // contiguous and performance is critical.
37
+ //
38
+ // AnySpan<T> is a mutable view to the elements and AnySpan<const T> is a
39
+ // read-only view to the elements, similar to absl::Span.
40
+ //
41
+ // AnySpan only requires containers to provide a size() and an operator[] that
42
+ // returns a reference. It will use data() if it returns a pointer to the type
43
+ // returned by operator[], which allows it to perform some internal
44
+ // optimizations (this should apply to many well behaved random access
45
+ // containers that use arrays internally, but notably
46
+ // RepeatedPtrField<T>::data() returns T** instead of T*).
47
+ //
48
+ // Using AnySpan as an input parameter:
49
+ //
50
+ // To write a function that can accept vector<MyMessage>,
51
+ // vector<unique_ptr<MyMessage>>, or RepeatedPtrField<MyMessage> as inputs, you
52
+ // can use AnySpan as the input to the function. AnySpan should be passed by
53
+ // value and it is trivially copyable so it does not need to be moved:
54
+ //
55
+ // void MyFunction(AnySpan<const MyMessage> messages);
56
+ //
57
+ // You can invoke MyFunction with a vector<MyMessage> or deque<MyMessage>:
58
+ //
59
+ // std::vector<MyMessage> messages = ...;
60
+ // MyFunction(messages);
61
+ //
62
+ // Or a container of smart pointers:
63
+ //
64
+ // std::deque<std::unique_ptr<MyMessage>> message_ptrs = ...;
65
+ // MyFunction(AnySpan<const MyMessage>(
66
+ // message_ptrs, any_span_transform::Deref()));
67
+ //
68
+ // Or, you can call the same function with a repeated proto field of type
69
+ // MyMessage:
70
+ //
71
+ // OtherMessage proto_message = ...;
72
+ // MyFunction(proto_message.repeated_field());
73
+ //
74
+ //
75
+ // Using AnySpan as an output parameter:
76
+ //
77
+ // To write a function that allows mutation of a fixed-size container of
78
+ // objects, you can use AnySpan with a non-const value type.
79
+ //
80
+ // void MyMutatingFunction(AnySpan<MyMessage> messages);
81
+ //
82
+ // To bind a mutable AnySpan to a container, callers must construct it
83
+ // explicitly around an lvalue:
84
+ //
85
+ // std::vector<MyMessage> messages = ...;
86
+ // MyMutatingFunction(AnySpan<MyMessages>(messages));
87
+ //
88
+ // Or use one of the "Make" functions:
89
+ //
90
+ // std::vector<MyMessage*> message_ptrs = ...;
91
+ // MyMutatingFunction(MakeDerefAnySpan(message_ptrs));
92
+ //
93
+ // Or, if you are already dealing with a mutable view-like object, construction
94
+ // can usually be implicit:
95
+ //
96
+ // absl::Span<MyMessage> mutable_span = ...;
97
+ // MyMutatingFunction(mutable_span);
98
+ //
99
+ // Transforming Spans:
100
+ //
101
+ // A set of useful transformation functors are provided (see the
102
+ // any_span_transform namespace), but you can provide your own transforms as
103
+ // well.
104
+ //
105
+ // Transforms work for both mutable and const values. When a transform is used
106
+ // for a mutable AnySpan, it will usually have to accept its argument as a
107
+ // mutable reference.
108
+ //
109
+ // Transforms can be any object supported by std::invoke, such as
110
+ // callable objects, function pointers, member function pointers, and even data
111
+ // members. Invoking a transform must return a reference to T or a reference to
112
+ // a compatible object such as a std::reference_wrapper or a child class.
113
+ // Transforms that return value types will not compile and would return
114
+ // dangling references if they did.
115
+ //
116
+ // struct MyStruct {
117
+ // int member;
118
+ // }
119
+ //
120
+ // std::vector<MyStruct> structs = ...;
121
+ //
122
+ // // Create an AnySpan<const int> that accesses the members of 'structs':
123
+ // auto mem_ptr = &MyStruct::member;
124
+ // AnySpan<const int> members(structs, mem_ptr);
125
+ //
126
+ // // Or, using a lambda:
127
+ // auto get_member = [](const MyStruct& s) -> const int& {
128
+ // return s.member;
129
+ // };
130
+ // AnySpan<const int> members_from_lambda(structs, get_member);
131
+ //
132
+ // Transforms must outlive the spans that use them (even member/method pointers,
133
+ // but not function pointer). Callable transforms must provide a const call
134
+ // operator that takes a single argument and returns a reference. Transforms
135
+ // will be executed every time an element is accessed, so complex transforms may
136
+ // have significant performance consequences.
137
+ //
138
+ // Factory Functions:
139
+ //
140
+ // A set of useful functions for constructing common types of AnySpans are
141
+ // provided. Factories with "Const" in the name produce AnySpans of const
142
+ // elements. Factories with "Deref" in the name will dereference elements of the
143
+ // container or array:
144
+ //
145
+ // AnySpan<T> MakeAnySpan(Container& c);
146
+ // AnySpan<T> MakeDerefAnySpan(Container& c);
147
+ // AnySpan<T> MakeAnySpan(T* ptr, std::size_t size);
148
+ // AnySpan<const T> MakeConstAnySpan(const Container& c);
149
+ // AnySpan<const T> MakeConstDerefAnySpan(const Container& c);
150
+ // AnySpan<const T> MakeConstAnySpan(const T* ptr, std::size_t size);
151
+ //
152
+ // Lifetime Gotchas:
153
+ //
154
+ // Take care when constructing spans as named variables! AnySpan captures all
155
+ // arguments by reference, even if it's a pointer:
156
+ //
157
+ // AnySpan<T> span(v, &MyClass::SomeMethod); // Dangling reference!
158
+ //
159
+ // // Also bad! The lambda is destroyed before the span.
160
+ // AnySpan<T> span(v, [](U& u) { return SomeFunction(u); });
161
+ //
162
+ // Free functions are ok:
163
+ //
164
+ // AnySpan<T> span(v, SomeFunction); // This is OK.
165
+ // AnySpan<T> span(v, &SomeFunction); // This is OK too.
166
+ //
167
+ // In all other cases, you must ensure that the object used as a transform
168
+ // outlives the span, even if that object is a pointer type.
169
+ //
170
+ // AnySpan is also capable of capturing another AnySpan, so watch out for
171
+ // implicit conversions between types of AnySpans:
172
+ //
173
+ // // MakeDerefAnySpan() returns an AnySpan<Derived>, leaving 's' pointing to
174
+ // // a temporary!
175
+ // vector<Derived*> v;
176
+ // AnySpan<Base> s = MakeDerefAnySpan(v);
177
+ //
178
+ // Adapting Spans:
179
+ //
180
+ // Since AnySpan only expects operator[] and size(), it is relatively simple to
181
+ // write light-weight adaptor classes that can behave like containers. See the
182
+ // any_span_adaptor namespace for a utility class that does this for iterators
183
+ // and views.
184
+ //
185
+ // Adapters are more powerful than transforms, since they allow you to change
186
+ // the value type and element order of a container, but transforms will
187
+ // generally perform better and leave code with fewer object lifetime concerns.
188
+ //
189
+ //
190
+ // Note about RepeatedPtrField performance:
191
+ //
192
+ // AnySpan will use data() when it returns a pointer to the same type returned
193
+ // by operator[], however RepeatedPtrField's operator[] returns T& and its
194
+ // data() returns a T**. Because of this, AnySpan will fall back to a less
195
+ // efficient version of type-erasure. If you have a performance critical use of
196
+ // RepeatedPtrField, you might find this pattern to have better performance:
197
+ //
198
+ // MyFunction(AnySpan<const MyMessage>(
199
+ // proto_message.repeated_field().data(),
200
+ // proto_message.repeated_field().size(),
201
+ // any_span_transform::Deref()));
202
+ //
203
+ #ifndef ABSL_TYPES_ANY_SPAN_H_
204
+ #define ABSL_TYPES_ANY_SPAN_H_
205
+
206
+ #include <algorithm>
207
+ #include <cstddef>
208
+ #include <functional>
209
+ #include <initializer_list>
210
+ #include <iterator>
211
+ #include <type_traits>
212
+ #include <utility>
213
+
214
+ #include "absl/base/attributes.h"
215
+ #include "absl/base/config.h"
216
+ #include "absl/base/internal/hardening.h"
217
+ #include "absl/base/internal/raw_logging.h"
218
+ #include "absl/base/macros.h"
219
+ #include "absl/base/nullability.h"
220
+ #include "absl/base/optimization.h"
221
+ #include "absl/base/throw_delegate.h"
222
+ #include "absl/meta/type_traits.h"
223
+ #include "absl/types/internal/any_span.h"
224
+
225
+ namespace absl {
226
+ ABSL_NAMESPACE_BEGIN
227
+
228
+ // The accessors in the 'any_span_transform' namespace return references to
229
+ // Transform functors that may be passed to AnySpan. Generally you should
230
+ // prefer to use these functors whenever possible, as they may trigger internal
231
+ // optimizations that are otherwise not possible, and they are valid for the
232
+ // duration of the program, so you do not have to worry about their lifetime.
233
+ namespace any_span_transform {
234
+
235
+ //
236
+ // Identity() returns a functor that returns whatever is passed to it. Generally
237
+ // you should prefer to use AnySpan's implicit constructor directly, but this
238
+ // may be useful if you are writing templates on top of AnySpan.
239
+ //
240
+ // Returns a const reference so that callers don't have to worry about
241
+ // lifetime of the functor.
242
+ //
243
+
244
+ struct IdentityT {
245
+ template <typename T>
246
+ T& operator()(T& v) const { // NOLINT(runtime/references)
247
+ return v;
248
+ }
249
+ };
250
+
251
+ inline const IdentityT& Identity() {
252
+ static const IdentityT f = {};
253
+ return f;
254
+ }
255
+
256
+ struct DerefT {
257
+ template <typename Ptr>
258
+ auto operator()(Ptr& ptr) const // NOLINT(runtime/references)
259
+ -> decltype(*ptr) {
260
+ ABSL_RAW_DCHECK(ptr, "Cannot dereference null pointer");
261
+ return *ptr;
262
+ }
263
+ };
264
+
265
+ // Deref() returns a functor that dereferences whatever is passed to it. It
266
+ // works for smart and raw pointers, as well as std::optional. Do not use this
267
+ // with containers that may contain elements that cannot be dereferenced, such
268
+ // as null pointers.
269
+ //
270
+ // Returns a const reference so that callers don't have to worry about lifetime
271
+ // of the functor.
272
+ inline const DerefT& Deref() {
273
+ static const DerefT f = {};
274
+ return f;
275
+ }
276
+
277
+ } // namespace any_span_transform
278
+
279
+ // Utilities for adapting things to look like the interface that AnySpan
280
+ // expects. For the most part this is based on iterators and views, and is
281
+ // intended to be composed with absl/types/iterator_adaptors.h.
282
+ namespace any_span_adaptor {
283
+
284
+ // Adapts a pair of iterators into a container-like object that AnySpan can
285
+ // wrap. This is useful if you are faced with a range or view of random access
286
+ // iterators. Iter must be a valid random access iterator.
287
+ template <typename Iter>
288
+ class Range {
289
+ public:
290
+ static_assert(
291
+ std::is_same<typename std::iterator_traits<Iter>::iterator_category,
292
+ std::random_access_iterator_tag>::value,
293
+ "Iter must be a random access iterator.");
294
+
295
+ Range(Iter begin, Iter end) {
296
+ absl::base_internal::HardeningAssertLE(begin, end);
297
+ begin_ = begin;
298
+ end_ = end;
299
+ }
300
+
301
+ std::size_t size() const { return end_ - begin_; }
302
+
303
+ decltype(std::declval<Iter>()[0]) operator[](std::size_t i) const {
304
+ absl::base_internal::HardeningAssertLT(i, size());
305
+ return begin_[i];
306
+ }
307
+
308
+ private:
309
+ Iter begin_;
310
+ Iter end_;
311
+ };
312
+
313
+ // Returns a Range adaptor that wraps the given pair of iterators. The return
314
+ // value of this function must outlive any spans that use it. Iter must be a
315
+ // valid random access iterator.
316
+ template <typename Iter>
317
+ Range<Iter> MakeAdaptorFromRange(Iter begin, Iter end) {
318
+ return Range<Iter>(begin, end);
319
+ }
320
+
321
+ // Returns a Range adaptor that wraps the given view. The begin() and end()
322
+ // functions of the given view must return valid random access iterators. The
323
+ // return value of this function must outlive any spans that use it.
324
+ template <typename View>
325
+ auto MakeAdaptorFromView(View& view) // NOLINT(runtime/references)
326
+ -> Range<decltype(view.begin())> {
327
+ return Range<decltype(view.begin())>(view.begin(), view.end());
328
+ }
329
+
330
+ } // namespace any_span_adaptor
331
+
332
+ template <typename T>
333
+ class AnySpan;
334
+
335
+ template <typename T>
336
+ class ABSL_ATTRIBUTE_VIEW AnySpan {
337
+ private:
338
+ template <typename Iter, typename Value>
339
+ class IteratorBase;
340
+
341
+ template <typename U>
342
+ using EnableIfMutable = std::enable_if_t<!std::is_const<T>::value, U>;
343
+
344
+ template <typename U>
345
+ using EnableIfConst = std::enable_if_t<std::is_const<T>::value, U>;
346
+
347
+ static std::true_type CreatesATemporaryImpl(std::decay_t<T>&&);
348
+ static std::false_type CreatesATemporaryImpl(const T&);
349
+ template <typename U,
350
+ typename B = decltype(CreatesATemporaryImpl(std::declval<U>()))>
351
+ struct CreatesATemporary : B {};
352
+
353
+ // Enable if invoke(transform, element) is valid and if a reference to T can
354
+ // bind to its output. This prevents situations where the constructor may be
355
+ // ambiguous.
356
+ // We also verify that the conversion from TransformResult to T& does not
357
+ // create a temporary. Otherwise, we would get a false positive in the
358
+ // enabler where `const char*` looks like can be converted to
359
+ // `const std::string&`.
360
+ template <typename Transform, typename Element,
361
+ typename TransformResult = decltype(std::invoke(
362
+ std::declval<const Transform&>(), std::declval<Element>()))>
363
+ using EnableIfTransformIsValid =
364
+ std::enable_if_t<std::is_convertible_v<TransformResult, T&> &&
365
+ !CreatesATemporary<TransformResult>::value>;
366
+
367
+ // Enable if Container appears to be a valid container. Just checks for size()
368
+ // and makes sure the class is not an AnySpan for now.
369
+ template <typename Container>
370
+ using EnableIfContainer =
371
+ std::enable_if_t<any_span_internal::HasSize<Container>::value &&
372
+ !any_span_internal::IsAnySpan<Container>::value>;
373
+
374
+ template <typename Element>
375
+ using EnableIfDifferentElementType =
376
+ std::enable_if_t<!std::is_same<T, Element>::value &&
377
+ !std::is_same<T, const Element>::value>;
378
+
379
+ template <typename Transform>
380
+ using EnableIfTransformIsByCopy =
381
+ std::enable_if_t<any_span_internal::kIsTransformCopied<Transform>, bool>;
382
+ template <typename Transform>
383
+ using EnableIfTransformIsByRef =
384
+ std::enable_if_t<!any_span_internal::kIsTransformCopied<Transform>, bool>;
385
+
386
+ public:
387
+ using element_type = T;
388
+ using value_type = typename std::remove_const<T>::type;
389
+ using size_type = std::size_t;
390
+ using difference_type = std::ptrdiff_t;
391
+ using absl_internal_is_view = std::true_type;
392
+
393
+ static const size_type npos = static_cast<size_type>(-1); // NOLINT
394
+
395
+ using reference = T&;
396
+ using const_reference = typename std::add_const<T>::type&;
397
+
398
+ using pointer = T*;
399
+ using const_pointer = typename std::add_const<T>::type*;
400
+
401
+ // Note that iterator will be const if T is const.
402
+ class iterator;
403
+ class const_iterator;
404
+
405
+ using reverse_iterator = std::reverse_iterator<iterator>;
406
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
407
+
408
+ // Null and empty by default.
409
+ AnySpan() = default;
410
+
411
+ // Creates a span that wraps an initializer list. This makes it possible to
412
+ // pass a brace-enclosed initializer list to a function expecting an AnySpan.
413
+ //
414
+ // Example:
415
+ //
416
+ // void Process(AnySpan<const int> x);
417
+ // Process({1, 2, 3});
418
+ //
419
+ // The initializer_list must outlive this AnySpan.
420
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
421
+ std::initializer_list<value_type> l ABSL_ATTRIBUTE_LIFETIME_BOUND)
422
+ : AnySpan(l.begin(), l.size()) {}
423
+
424
+ // Creates a span that wraps an initializer list of a type other than
425
+ // value_type, or with an explicit transform. Applies the optional transform
426
+ // to elements before returning them.
427
+ //
428
+ // Example:
429
+ //
430
+ // struct Base {};
431
+ // struct Derived : Base {};
432
+ //
433
+ // void Process(AnySpan<const Base> x);
434
+ // Process({Derived(a), Derived(b), Derived(c)});
435
+ //
436
+ // where the default identity transform would apply an implicit
437
+ // derived-to-base conversion.
438
+ //
439
+ // The initializer_list must outlive this AnySpan.
440
+ template <typename Element, typename Transform,
441
+ typename = EnableIfTransformIsValid<Transform, const Element&>,
442
+ EnableIfTransformIsByCopy<Transform> = true>
443
+ constexpr AnySpan(std::initializer_list<Element> l
444
+ ABSL_ATTRIBUTE_LIFETIME_BOUND,
445
+ const Transform& transform)
446
+ : AnySpan(l.begin(), l.size(), transform) {}
447
+ template <typename Element,
448
+ typename Transform = any_span_transform::IdentityT,
449
+ typename = EnableIfTransformIsValid<Transform, const Element&>,
450
+ EnableIfTransformIsByRef<Transform> = true>
451
+ constexpr AnySpan(std::initializer_list<Element> l
452
+ ABSL_ATTRIBUTE_LIFETIME_BOUND,
453
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND =
454
+ any_span_transform::Identity())
455
+ : AnySpan(l.begin(), l.size(), transform) {}
456
+
457
+ // Creates a span that wraps an array. Applies the optional transform to
458
+ // elements before returning them.
459
+ //
460
+ // Transform must be a function object with a const operator() that takes
461
+ // Element as an argument and return a reference to T or compatible object.
462
+ //
463
+ // Both the transform and array must outlive this span.
464
+ template <typename Element, typename Transform,
465
+ typename = EnableIfTransformIsValid<Transform, const Element&>,
466
+ EnableIfTransformIsByCopy<Transform> = true>
467
+ constexpr AnySpan(const Element* absl_nullable ptr
468
+ ABSL_ATTRIBUTE_LIFETIME_BOUND,
469
+ size_type size, const Transform& transform)
470
+ : AnySpan(any_span_internal::MakeArrayGetter<T>(ptr, transform), size) {}
471
+ template <typename Element,
472
+ typename Transform = any_span_transform::IdentityT,
473
+ typename = EnableIfTransformIsValid<Transform, const Element&>,
474
+ EnableIfTransformIsByRef<Transform> = true>
475
+ constexpr AnySpan(const Element* absl_nullable ptr
476
+ ABSL_ATTRIBUTE_LIFETIME_BOUND,
477
+ size_type size,
478
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND =
479
+ any_span_transform::Identity())
480
+ : AnySpan(any_span_internal::MakeArrayGetter<T>(ptr, transform), size) {}
481
+
482
+ // Creates a span that wraps an array of fixed size. Applies the optional
483
+ // transform to elements before returning them.
484
+ //
485
+ // Transform must be a function object with a const operator() that takes
486
+ // Element as an argument and return a reference to T or compatible object.
487
+ //
488
+ // Both the transform and array must outlive this span.
489
+ template <typename Element, size_type N, typename Transform,
490
+ typename = EnableIfTransformIsValid<Transform, const Element&>,
491
+ EnableIfTransformIsByCopy<Transform> = true>
492
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
493
+ const Element (&array ABSL_ATTRIBUTE_LIFETIME_BOUND)[N],
494
+ const Transform& transform)
495
+ : AnySpan(array, N, transform) {}
496
+ template <typename Element, size_type N,
497
+ typename Transform = any_span_transform::IdentityT,
498
+ typename = EnableIfTransformIsValid<Transform, const Element&>,
499
+ EnableIfTransformIsByRef<Transform> = true>
500
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
501
+ const Element (&array ABSL_ATTRIBUTE_LIFETIME_BOUND)[N],
502
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND =
503
+ any_span_transform::Identity())
504
+ : AnySpan(array, N, transform) {}
505
+
506
+ // Creates a span that wraps a const container. Applies the optional transform
507
+ // to elements before returning them.
508
+ //
509
+ // This constructor is enabled even for mutable spans, since some
510
+ // container-like objects provide mutable element access even when the object
511
+ // itself is const (such as absl::Span)
512
+ //
513
+ // Transform must be a function object with a const operator() that takes the
514
+ // value type of Container as an argument and return a reference to T or
515
+ // compatible object.
516
+ //
517
+ // The transform, container, and the container's underlying storage must
518
+ // outlive this span. Any operation that may reallocate the container's
519
+ // storage or change its size will invalidate the span.
520
+ template <typename Container, typename Transform,
521
+ typename = EnableIfContainer<Container>,
522
+ typename = EnableIfTransformIsValid<
523
+ Transform, decltype(std::declval<const Container&>()[0])>,
524
+ EnableIfTransformIsByCopy<std::enable_if_t<
525
+ absl::type_traits_internal::IsView<Container>::value,
526
+ Transform>> = true>
527
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
528
+ const Container& container, const Transform& transform)
529
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(container, transform),
530
+ container.size()) {}
531
+ template <typename Container, typename Transform,
532
+ typename = EnableIfContainer<Container>,
533
+ typename = EnableIfTransformIsValid<
534
+ Transform, decltype(std::declval<const Container&>()[0])>,
535
+ EnableIfTransformIsByCopy<std::enable_if_t<
536
+ !absl::type_traits_internal::IsView<Container>::value,
537
+ Transform>> = true>
538
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
539
+ const Container& container ABSL_ATTRIBUTE_LIFETIME_BOUND,
540
+ const Transform& transform)
541
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(container, transform),
542
+ container.size()) {}
543
+ template <
544
+ typename Container, typename Transform = any_span_transform::IdentityT,
545
+ typename = EnableIfContainer<Container>,
546
+ typename = EnableIfTransformIsValid<
547
+ Transform, decltype(std::declval<const Container&>()[0])>,
548
+ EnableIfTransformIsByRef<
549
+ std::enable_if_t<absl::type_traits_internal::IsView<Container>::value,
550
+ Transform>> = true>
551
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
552
+ const Container& container,
553
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND =
554
+ any_span_transform::Identity())
555
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(container, transform),
556
+ container.size()) {}
557
+ template <typename Container,
558
+ typename Transform = any_span_transform::IdentityT,
559
+ typename = EnableIfContainer<Container>,
560
+ typename = EnableIfTransformIsValid<
561
+ Transform, decltype(std::declval<const Container&>()[0])>,
562
+ EnableIfTransformIsByRef<std::enable_if_t<
563
+ !absl::type_traits_internal::IsView<Container>::value,
564
+ Transform>> = true>
565
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
566
+ const Container& container ABSL_ATTRIBUTE_LIFETIME_BOUND,
567
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND =
568
+ any_span_transform::Identity())
569
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(container, transform),
570
+ container.size()) {}
571
+
572
+ // Creates a span that wraps a mutable array. Applies the optional transform
573
+ // to elements before returning them.
574
+ //
575
+ // Transform must be a function object with a const operator() that takes
576
+ // Element as an argument and return a reference to T or compatible object.
577
+ //
578
+ // Both the transform and array must outlive this span.
579
+ template <typename Element, typename Transform,
580
+ typename = EnableIfMutable<Element>,
581
+ typename = EnableIfTransformIsValid<Transform, Element&>,
582
+ EnableIfTransformIsByCopy<Transform> = true>
583
+ constexpr AnySpan(Element* absl_nullable ptr ABSL_ATTRIBUTE_LIFETIME_BOUND,
584
+ size_type size, const Transform& transform)
585
+ : AnySpan(any_span_internal::MakeArrayGetter<T>(ptr, transform), size) {}
586
+ template <typename Element,
587
+ typename Transform = any_span_transform::IdentityT,
588
+ typename = EnableIfMutable<Element>,
589
+ typename = EnableIfTransformIsValid<Transform, Element&>,
590
+ EnableIfTransformIsByRef<Transform> = true>
591
+ constexpr AnySpan(Element* absl_nullable ptr ABSL_ATTRIBUTE_LIFETIME_BOUND,
592
+ size_type size,
593
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND =
594
+ any_span_transform::Identity())
595
+ : AnySpan(any_span_internal::MakeArrayGetter<T>(ptr, transform), size) {}
596
+
597
+ // Creates a span that wraps a mutable array of fixed size. Applies the
598
+ // optional transform to elements before returning them.
599
+ //
600
+ // Transform must be a function object with a const operator() that takes
601
+ // Element as an argument and return a reference to T or compatible object.
602
+ //
603
+ // Both the transform and array must outlive this span.
604
+ template <typename Element, size_type N, typename Transform,
605
+ typename = EnableIfMutable<Element>,
606
+ typename = EnableIfTransformIsValid<Transform, Element&>,
607
+ EnableIfTransformIsByCopy<Transform> = true>
608
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
609
+ Element (&array ABSL_ATTRIBUTE_LIFETIME_BOUND)[N],
610
+ const Transform& transform)
611
+ : AnySpan(array, N, transform) {}
612
+ template <typename Element, size_type N,
613
+ typename Transform = any_span_transform::IdentityT,
614
+ typename = EnableIfMutable<Element>,
615
+ typename = EnableIfTransformIsValid<Transform, Element&>,
616
+ EnableIfTransformIsByRef<Transform> = true>
617
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
618
+ Element (&array ABSL_ATTRIBUTE_LIFETIME_BOUND)[N],
619
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND =
620
+ any_span_transform::Identity())
621
+ : AnySpan(array, N, transform) {}
622
+
623
+ // Creates a span that wraps a mutable container. Only enabled if T is
624
+ // mutable. Applies the optional transform to elements before returning them.
625
+ //
626
+ // Transform must be a function object with a const operator() that takes the
627
+ // value type of Container as an argument and return a reference to T or
628
+ // compatible object.
629
+ //
630
+ // The transform, container, and the container's underlying storage must
631
+ // outlive this span. Any operation that may reallocate the container's
632
+ // storage or change its size will invalidate the span.
633
+ template <typename Container, typename Transform,
634
+ typename = EnableIfMutable<Container>,
635
+ typename = EnableIfContainer<Container>,
636
+ typename = EnableIfTransformIsValid<
637
+ Transform, decltype(std::declval<Container&>()[0])>,
638
+ EnableIfTransformIsByCopy<Transform> = true>
639
+ constexpr explicit AnySpan( // NOLINT(google-explicit-constructor)
640
+ Container& container ABSL_ATTRIBUTE_LIFETIME_BOUND,
641
+ const Transform& transform)
642
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(container, transform),
643
+ container.size()) {}
644
+ template <typename Container,
645
+ typename Transform = any_span_transform::IdentityT,
646
+ typename = EnableIfMutable<Container>,
647
+ typename = EnableIfContainer<Container>,
648
+ typename = EnableIfTransformIsValid<
649
+ Transform, decltype(std::declval<Container&>()[0])>,
650
+ EnableIfTransformIsByRef<Transform> = true>
651
+ constexpr explicit AnySpan( // NOLINT(google-explicit-constructor)
652
+ Container& container ABSL_ATTRIBUTE_LIFETIME_BOUND,
653
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND =
654
+ any_span_transform::Identity())
655
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(container, transform),
656
+ container.size()) {}
657
+
658
+ // Converts a mutable span to a const span by copying the internal state
659
+ // (rather than wrapping the other span).
660
+ // TODO(b/179783710): add ABSL_ATTRIBUTE_LIFETIME_BOUND.
661
+ template <typename LazyT = T, typename = EnableIfConst<LazyT>>
662
+ constexpr AnySpan( // NOLINT(google-explicit-constructor)
663
+ const AnySpan<typename std::remove_const<T>::type>& other)
664
+ : getter_(other.getter_), size_(other.size()) {}
665
+
666
+ // Creates a span that wraps around another span of different type.
667
+ //
668
+ // This has performance and lifetime consequences, and can easily happen by
669
+ // mistake. We make such conversions explicit here.
670
+ template <typename Element, typename = EnableIfDifferentElementType<Element>,
671
+ typename = EnableIfTransformIsValid<any_span_transform::IdentityT,
672
+ Element&>>
673
+ constexpr explicit AnySpan(
674
+ const AnySpan<Element>& other ABSL_ATTRIBUTE_LIFETIME_BOUND)
675
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(
676
+ other, any_span_transform::Identity()),
677
+ other.size()) {}
678
+
679
+ // Creates a span that wraps around another span. Applies the non-optional
680
+ // transform to elements before returning them.
681
+ //
682
+ // This has lifetime consequences, and may happen by mistake. We make it
683
+ // explicit here.
684
+ template <typename Element, typename Transform,
685
+ typename = EnableIfTransformIsValid<Transform, Element&>,
686
+ EnableIfTransformIsByCopy<Transform> = true>
687
+ constexpr explicit AnySpan(const AnySpan<Element>& other
688
+ ABSL_ATTRIBUTE_LIFETIME_BOUND,
689
+ const Transform& transform)
690
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(other, transform),
691
+ other.size()) {}
692
+ template <typename Element, typename Transform,
693
+ typename = EnableIfTransformIsValid<Transform, Element&>,
694
+ EnableIfTransformIsByRef<Transform> = true>
695
+ constexpr explicit AnySpan(
696
+ const AnySpan<Element>& other ABSL_ATTRIBUTE_LIFETIME_BOUND,
697
+ const Transform& transform ABSL_ATTRIBUTE_LIFETIME_BOUND)
698
+ : AnySpan(any_span_internal::MakeContainerGetter<T>(other, transform),
699
+ other.size()) {}
700
+
701
+ // Returns a subspan of this span. This span may become invalid before the
702
+ // subspan, but both the container and transform must remain valid.
703
+ // pos must be non-negative and <= size().
704
+ // len must be non-negative and <= size() - pos, or equal to npos.
705
+ // If len == npos, the subspan continues till the end of this span.
706
+
707
+ constexpr AnySpan subspan(size_type pos, size_type len) const {
708
+ const size_t this_size = size();
709
+ if (len == AnySpan<T>::npos) {
710
+ len = this_size - pos;
711
+ }
712
+ absl::base_internal::HardeningAssertLE(pos, this_size);
713
+ absl::base_internal::HardeningAssertLE(len,
714
+ static_cast<size_type>(this_size
715
+ - pos));
716
+ return AnySpan<T>(getter_.Offset(pos), len);
717
+ }
718
+
719
+ constexpr AnySpan subspan(size_type pos) const {
720
+ absl::base_internal::HardeningAssertLE(pos, size());
721
+ return AnySpan(getter_.Offset(pos), size() - pos);
722
+ }
723
+
724
+ // Returns a `AnySpan` containing first `len` elements. Parameter `len`
725
+ // must be non-negative and <= size().
726
+ constexpr AnySpan first(size_type len) const {
727
+ absl::base_internal::HardeningAssert(len != AnySpan<T>::npos);
728
+ return subspan(0, len);
729
+ }
730
+
731
+ // Returns a `AnySpan` containing last `len` elements. Parameter `len` must be
732
+ // non-negative and <= size().
733
+ constexpr AnySpan last(size_type len) const { return subspan(size() - len); }
734
+
735
+ // Size operations.
736
+ constexpr size_type size() const { return size_; }
737
+ constexpr bool empty() const { return size() == 0; }
738
+
739
+ // Element access.
740
+ constexpr reference operator[](size_type index) const {
741
+ absl::base_internal::HardeningAssertLT(index, size());
742
+ return getter_.Get(index);
743
+ }
744
+ constexpr reference at(size_type index) const {
745
+ if (ABSL_PREDICT_FALSE(index >= size())) {
746
+ absl::ThrowStdOutOfRange("AnySpan::at failed bounds check");
747
+ }
748
+ return getter_.Get(index);
749
+ }
750
+ constexpr reference front() const {
751
+ absl::base_internal::HardeningAssertGT(size(), size_type{0});
752
+ return (*this)[0];
753
+ }
754
+ constexpr reference back() const {
755
+ absl::base_internal::HardeningAssertGT(size(), size_type{0});
756
+ return (*this)[size() - 1];
757
+ }
758
+
759
+ // Iterator accessors.
760
+ constexpr iterator begin() const { return iterator(this, 0); }
761
+ constexpr iterator end() const { return iterator(this, size_); }
762
+ constexpr reverse_iterator rbegin() const { return reverse_iterator(end()); }
763
+ constexpr reverse_iterator rend() const { return reverse_iterator(begin()); }
764
+ constexpr const_iterator cbegin() const { return const_iterator(this, 0); }
765
+ constexpr const_iterator cend() const { return const_iterator(this, size_); }
766
+ constexpr const_reverse_iterator crbegin() const { return rbegin(); }
767
+ constexpr const_reverse_iterator crend() const { return rend(); }
768
+
769
+ // Constructs from a getter and size. Not for external use.
770
+ AnySpan(any_span_internal::Getter<T> getter, size_type size)
771
+ : getter_(getter), size_(size) {}
772
+
773
+ // Support for absl::Hash.
774
+ template <typename H>
775
+ friend constexpr H AbslHashValue(H state, AnySpan any_span) {
776
+ for (const auto& v : any_span) {
777
+ state = H::combine(std::move(state), v);
778
+ }
779
+ return H::combine(std::move(state), any_span.size());
780
+ }
781
+
782
+ private:
783
+ template <typename U>
784
+ friend class AnySpan;
785
+
786
+ template <typename U>
787
+ friend bool any_span_internal::IsCheap(AnySpan<U> s);
788
+
789
+ // Getter to access elements.
790
+ any_span_internal::Getter<T> getter_;
791
+
792
+ // The size of this span.
793
+ size_type size_ = 0;
794
+
795
+ #if defined(__GNUC__) && !defined(__clang__)
796
+ #pragma GCC diagnostic push
797
+ #pragma GCC diagnostic ignored "-Wnon-template-friend"
798
+ #endif
799
+ // The technical reasons we need to declare these friends in this manner are
800
+ // quite subtle and confusing, but they're necessary on some toolchains to
801
+ // allow all mutable/const combinations with this & other range types while
802
+ // avoiding symbol collisions or ODR violations.
803
+ friend bool operator==(AnySpan<const T> a, AnySpan<const T> b);
804
+ friend bool operator!=(AnySpan<const T> a, AnySpan<const T> b);
805
+ #if defined(__GNUC__) && !defined(__clang__)
806
+ #pragma GCC diagnostic pop
807
+ #endif
808
+
809
+ // operator==
810
+ friend bool operator==(AnySpan a, AnySpan b) {
811
+ return any_span_internal::EqualImpl<const T>(a, b);
812
+ }
813
+ friend bool operator!=(AnySpan a, AnySpan b) { return !(a == b); }
814
+ };
815
+
816
+ // Constructs an AnySpan from a container or array.
817
+ template <int&... ExplicitArgumentBarrier, typename Container,
818
+ typename T = any_span_internal::ElementType<Container>>
819
+ std::enable_if_t<
820
+ absl::type_traits_internal::IsView<std::remove_cv_t<Container>>::value,
821
+ AnySpan<T>>
822
+ MakeAnySpan(Container& c) {
823
+ return AnySpan<T>(c);
824
+ }
825
+ template <int&... ExplicitArgumentBarrier, typename Container,
826
+ typename T = any_span_internal::ElementType<Container>>
827
+ std::enable_if_t<
828
+ !absl::type_traits_internal::IsView<std::remove_cv_t<Container>>::value,
829
+ AnySpan<T>>
830
+ MakeAnySpan(Container& c ABSL_ATTRIBUTE_LIFETIME_BOUND) {
831
+ return AnySpan<T>(c);
832
+ }
833
+
834
+ // Constructs an AnySpan that dereferences a container or array of pointers.
835
+ template <int&... ExplicitArgumentBarrier, typename Container,
836
+ typename T = any_span_internal::DerefElementType<Container>>
837
+ std::enable_if_t<
838
+ absl::type_traits_internal::IsView<std::remove_cv_t<Container>>::value,
839
+ AnySpan<T>>
840
+ MakeDerefAnySpan(Container& c) {
841
+ return AnySpan<T>(c, any_span_transform::Deref());
842
+ }
843
+ template <int&... ExplicitArgumentBarrier, typename Container,
844
+ typename T = any_span_internal::DerefElementType<Container>>
845
+ std::enable_if_t<
846
+ !absl::type_traits_internal::IsView<std::remove_cv_t<Container>>::value,
847
+ AnySpan<T>>
848
+ MakeDerefAnySpan(Container& c ABSL_ATTRIBUTE_LIFETIME_BOUND) {
849
+ return AnySpan<T>(c, any_span_transform::Deref());
850
+ }
851
+
852
+ // Constructs an AnySpan from a pointer and size.
853
+ template <int&... ExplicitArgumentBarrier, typename T>
854
+ AnySpan<T> MakeAnySpan(T* absl_nullable ptr ABSL_ATTRIBUTE_LIFETIME_BOUND,
855
+ std::size_t size) {
856
+ return AnySpan<T>(ptr, size);
857
+ }
858
+
859
+ // Constructs a const AnySpan from a container or array.
860
+ template <int&... ExplicitArgumentBarrier, typename Container,
861
+ typename T = any_span_internal::ElementType<const Container>>
862
+ std::enable_if_t<absl::type_traits_internal::IsView<Container>::value,
863
+ AnySpan<const T>>
864
+ MakeConstAnySpan(const Container& c) {
865
+ return AnySpan<const T>(c);
866
+ }
867
+ template <int&... ExplicitArgumentBarrier, typename Container,
868
+ typename T = any_span_internal::ElementType<const Container>>
869
+ std::enable_if_t<!absl::type_traits_internal::IsView<Container>::value,
870
+ AnySpan<const T>>
871
+ MakeConstAnySpan(const Container& c ABSL_ATTRIBUTE_LIFETIME_BOUND) {
872
+ return AnySpan<const T>(c);
873
+ }
874
+
875
+ // Constructs a const AnySpan that dereferences a container or array of
876
+ // pointers.
877
+ template <int&... ExplicitArgumentBarrier, typename Container,
878
+ typename T = any_span_internal::DerefElementType<const Container>>
879
+ std::enable_if_t<absl::type_traits_internal::IsView<Container>::value,
880
+ AnySpan<const T>>
881
+ MakeConstDerefAnySpan(const Container& c) {
882
+ return AnySpan<const T>(c, any_span_transform::Deref());
883
+ }
884
+ template <int&... ExplicitArgumentBarrier, typename Container,
885
+ typename T = any_span_internal::DerefElementType<const Container>>
886
+ std::enable_if_t<!absl::type_traits_internal::IsView<Container>::value,
887
+ AnySpan<const T>>
888
+ MakeConstDerefAnySpan(const Container& c ABSL_ATTRIBUTE_LIFETIME_BOUND) {
889
+ return AnySpan<const T>(c, any_span_transform::Deref());
890
+ }
891
+
892
+ // Constructs an AnySpan from a pointer and size.
893
+ template <int&... ExplicitArgumentBarrier, typename T>
894
+ AnySpan<const T> MakeConstAnySpan(const T* absl_nullable ptr,
895
+ std::size_t size) {
896
+ return AnySpan<const T>(ptr, size);
897
+ }
898
+
899
+ //
900
+ // Implementation details follow.
901
+ //
902
+
903
+ template <typename T>
904
+ const typename AnySpan<T>::size_type AnySpan<T>::npos;
905
+
906
+ // Iterator base class. Uses CRTP (Iter should be the child class). Constness of
907
+ // the iterator is determined by the constness of Value.
908
+ template <typename T>
909
+ template <typename Iter, typename Value>
910
+ class ABSL_ATTRIBUTE_VIEW AnySpan<T>::IteratorBase {
911
+ private:
912
+ // Returns a reference to this as the child class.
913
+ const Iter& self() const { return static_cast<const Iter&>(*this); }
914
+ Iter& self() { return static_cast<Iter&>(*this); }
915
+
916
+ public:
917
+ using iterator_category = std::random_access_iterator_tag;
918
+ using value_type = typename std::remove_const<Value>::type;
919
+ using difference_type = std::ptrdiff_t;
920
+ using reference = Value&;
921
+ using pointer = Value*;
922
+
923
+ // Constructs an invalid iterator.
924
+ IteratorBase() = default;
925
+
926
+ reference operator*() const { return (*container_)[index_]; }
927
+
928
+ pointer absl_nonnull operator->() const { return &(*container_)[index_]; }
929
+
930
+ reference operator[](difference_type i) const {
931
+ return (*container_)[index_ + i];
932
+ }
933
+
934
+ Iter& operator+=(difference_type d) {
935
+ index_ += d;
936
+ return self();
937
+ }
938
+
939
+ Iter& operator-=(difference_type d) { return self() += -d; }
940
+
941
+ Iter& operator++() {
942
+ self() += 1;
943
+ return self();
944
+ }
945
+
946
+ Iter operator++(int) {
947
+ Iter copy(self());
948
+ ++self();
949
+ return copy;
950
+ }
951
+
952
+ Iter& operator--() {
953
+ self() -= 1;
954
+ return self();
955
+ }
956
+
957
+ Iter operator--(int) {
958
+ Iter copy(self());
959
+ --self();
960
+ return copy;
961
+ }
962
+
963
+ Iter operator+(difference_type d) const {
964
+ Iter tmp = self();
965
+ tmp += d;
966
+ return tmp;
967
+ }
968
+
969
+ friend Iter operator+(difference_type d, Iter i) { return i + d; }
970
+
971
+ Iter operator-(difference_type d) const { return self() + (-d); }
972
+
973
+ difference_type operator-(const Iter& other) const {
974
+ return index_ - other.index_;
975
+ }
976
+
977
+ friend bool operator==(const Iter& a, const Iter& b) {
978
+ return a.index_ == b.index_;
979
+ }
980
+
981
+ friend bool operator!=(const Iter& a, const Iter& b) {
982
+ return a.index_ != b.index_;
983
+ }
984
+
985
+ friend bool operator<(const Iter& a, const Iter& b) {
986
+ return a.index_ < b.index_;
987
+ }
988
+
989
+ friend bool operator<=(const Iter& a, const Iter& b) {
990
+ return a.index_ <= b.index_;
991
+ }
992
+
993
+ friend bool operator>(const Iter& a, const Iter& b) {
994
+ return a.index_ > b.index_;
995
+ }
996
+
997
+ friend bool operator>=(const Iter& a, const Iter& b) {
998
+ return a.index_ >= b.index_;
999
+ }
1000
+
1001
+ protected:
1002
+ // Constructs an iterator that points to the given index of the given span.
1003
+ IteratorBase(const AnySpan* absl_nullable container, size_type index)
1004
+ : container_(container), index_(index) {}
1005
+
1006
+ const AnySpan* absl_nullable container_ = nullptr;
1007
+ size_type index_ = 0;
1008
+ };
1009
+
1010
+ // iterator implementation. This mostly just forwards to IteratorBase.
1011
+ template <typename T>
1012
+ class ABSL_ATTRIBUTE_VIEW AnySpan<T>::iterator
1013
+ : public IteratorBase<iterator, T> {
1014
+ private:
1015
+ using Base = IteratorBase<iterator, T>;
1016
+
1017
+ public:
1018
+ using typename Base::difference_type;
1019
+ using typename Base::iterator_category;
1020
+ using typename Base::pointer;
1021
+ using typename Base::reference;
1022
+ using typename Base::value_type;
1023
+
1024
+ iterator() = default;
1025
+
1026
+ private:
1027
+ // Only let AnySpan construct valid instances.
1028
+ friend class AnySpan;
1029
+
1030
+ iterator(const AnySpan* absl_nullable container, size_type index)
1031
+ : Base(container, index) {}
1032
+ };
1033
+
1034
+ // const_iterator implementation. This mostly just forwards to IteratorBase,
1035
+ // but also provides conversion from MutableIterator.
1036
+ template <typename T>
1037
+ class AnySpan<T>::const_iterator
1038
+ : public IteratorBase<const_iterator, typename std::add_const<T>::type> {
1039
+ private:
1040
+ using Base = IteratorBase<const_iterator, typename std::add_const<T>::type>;
1041
+
1042
+ public:
1043
+ using typename Base::difference_type;
1044
+ using typename Base::iterator_category;
1045
+ using typename Base::pointer;
1046
+ using typename Base::reference;
1047
+ using typename Base::value_type;
1048
+
1049
+ const_iterator() = default;
1050
+
1051
+ // Support conversion from mutable iterators.
1052
+ // NOLINTNEXTLINE(google-explicit-constructor)
1053
+ const_iterator(const iterator& other) // NOLINT(runtime/explicit)
1054
+ : Base(other.container_, other.index_) {}
1055
+
1056
+ private:
1057
+ // Only let AnySpan construct valid instances.
1058
+ friend class AnySpan;
1059
+
1060
+ const_iterator(const AnySpan* absl_nullable container, size_type index)
1061
+ : Base(container, index) {}
1062
+ };
1063
+
1064
+ ABSL_NAMESPACE_END
1065
+ } // namespace absl
1066
+
1067
+ #endif // ABSL_TYPES_ANY_SPAN_H_