re2 1.22.2 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +60 -4
  2. package/binding.gyp +5 -1
  3. package/lib/addon.cc +4 -0
  4. package/lib/new.cc +1 -246
  5. package/lib/pattern.cc +252 -0
  6. package/lib/pattern.h +10 -0
  7. package/lib/set.cc +777 -0
  8. package/lib/wrapped_re2_set.h +42 -0
  9. package/package.json +21 -9
  10. package/re2.d.ts +46 -9
  11. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
  12. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
  13. package/vendor/abseil-cpp/CMake/README.md +2 -2
  14. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  15. package/vendor/abseil-cpp/MODULE.bazel +6 -9
  16. package/vendor/abseil-cpp/README.md +6 -8
  17. package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
  18. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
  19. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
  20. package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
  21. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
  22. package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
  23. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
  24. package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
  25. package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
  26. package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
  27. package/vendor/abseil-cpp/absl/base/config.h +22 -129
  28. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
  29. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  30. package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
  31. package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  32. package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  33. package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
  34. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  35. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
  36. package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
  37. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
  38. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
  39. package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
  40. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
  41. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
  42. package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
  43. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
  44. package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
  45. package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
  46. package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  47. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
  48. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  49. package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
  50. package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
  51. package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
  52. package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
  53. package/vendor/abseil-cpp/absl/base/options.h +3 -80
  54. package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
  55. package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
  56. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
  57. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
  58. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
  59. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  60. package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
  61. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  62. package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
  63. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
  64. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
  65. package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
  68. package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
  69. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
  70. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
  71. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
  72. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
  73. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
  74. package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
  75. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
  76. package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
  77. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  78. package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
  79. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  80. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
  81. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
  82. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
  83. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
  84. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
  87. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
  88. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
  89. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
  90. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
  91. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
  92. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
  93. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
  94. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
  95. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
  96. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  97. package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
  101. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
  102. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
  103. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
  104. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
  105. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
  106. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
  107. package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
  108. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
  109. package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
  110. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
  111. package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
  112. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
  113. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
  114. package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
  115. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
  116. package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
  117. package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
  118. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
  119. package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
  120. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
  121. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
  122. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  123. package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
  124. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
  125. package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
  126. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
  127. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
  128. package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  129. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  130. package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  131. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  132. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  133. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
  134. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  135. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  136. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
  137. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  138. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  139. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  140. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  141. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  142. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  143. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
  144. package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
  145. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
  146. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  147. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
  148. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
  149. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  150. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  151. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
  152. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
  153. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  154. package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
  155. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  156. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
  157. package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
  158. package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
  159. package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
  160. package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
  161. package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
  162. package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
  163. package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
  164. package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
  165. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
  166. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
  167. package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
  168. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
  169. package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
  170. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
  171. package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
  172. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
  173. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  174. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  175. package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
  176. package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
  177. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
  178. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
  179. package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
  180. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
  181. package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
  182. package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
  183. package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
  184. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
  185. package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
  186. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
  187. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
  188. package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
  189. package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
  190. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
  191. package/vendor/abseil-cpp/absl/log/check.h +2 -1
  192. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
  193. package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
  194. package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
  195. package/vendor/abseil-cpp/absl/log/globals.h +4 -5
  196. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
  197. package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  198. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
  199. package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
  200. package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  201. package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
  202. package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
  203. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  204. package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
  205. package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
  206. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  207. package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
  208. package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
  209. package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
  210. package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
  211. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
  212. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  213. package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
  214. package/vendor/abseil-cpp/absl/log/log.h +48 -35
  215. package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
  216. package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
  217. package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
  218. package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
  219. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
  220. package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  221. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
  222. package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
  223. package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
  224. package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
  225. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  226. package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
  227. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
  228. package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
  229. package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
  230. package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
  231. package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
  232. package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
  233. package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
  234. package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
  235. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
  236. package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
  237. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
  238. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
  239. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
  240. package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
  241. package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  242. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
  243. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
  244. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
  245. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
  246. package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
  247. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
  248. package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
  249. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  250. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
  251. package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
  252. package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  253. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
  254. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  255. package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
  256. package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
  257. package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
  258. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
  259. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  260. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
  261. package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
  262. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  263. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  264. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  265. package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
  266. package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
  267. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
  268. package/vendor/abseil-cpp/absl/random/random.h +88 -53
  269. package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  270. package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
  271. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  272. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  273. package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
  274. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
  275. package/vendor/abseil-cpp/absl/status/status.cc +4 -8
  276. package/vendor/abseil-cpp/absl/status/status.h +8 -8
  277. package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
  278. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
  279. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  280. package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
  281. package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
  282. package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
  283. package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
  284. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
  285. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
  286. package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
  287. package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
  288. package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
  289. package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
  290. package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
  291. package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
  292. package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
  293. package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
  294. package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
  295. package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  296. package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  297. package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
  298. package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
  299. package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
  300. package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
  301. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
  302. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
  303. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  304. package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
  305. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
  306. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  307. package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
  308. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
  309. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
  310. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
  311. package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
  312. package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
  313. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  314. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  315. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
  316. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  317. package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
  318. package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  319. package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  320. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  321. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
  322. package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  323. package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  324. package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  325. package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
  326. package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
  327. package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
  328. package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
  329. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
  330. package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
  331. package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
  332. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
  333. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
  334. package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
  335. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
  336. package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
  337. package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
  338. package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
  339. package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
  340. package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
  341. package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
  342. package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
  343. package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
  344. package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
  345. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
  346. package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
  347. package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
  348. package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
  349. package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
  350. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
  351. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
  352. package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
  353. package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
  354. package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
  355. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  356. package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  357. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
  358. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
  359. package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
  360. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  361. package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  362. package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  363. package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  364. package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
  365. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  366. package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
  367. package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  368. package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
  369. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
  370. package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
  371. package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
  372. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
  373. package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
  374. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  375. package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
  376. package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
  377. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
  378. package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
  379. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
  380. package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
  381. package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
  382. package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
  383. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
  384. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
  385. package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  386. package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
  387. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
  388. package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
  389. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
  390. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
  391. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  392. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
  393. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  394. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
  395. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
  396. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
  397. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
  398. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
  399. package/vendor/abseil-cpp/absl/time/time.h +24 -18
  400. package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
  401. package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
  402. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
  403. package/vendor/abseil-cpp/absl/types/any.h +9 -484
  404. package/vendor/abseil-cpp/absl/types/optional.h +7 -747
  405. package/vendor/abseil-cpp/absl/types/span.h +46 -19
  406. package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
  407. package/vendor/abseil-cpp/absl/types/variant.h +5 -784
  408. package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
  409. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
  410. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
  411. package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
  412. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
  413. package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
  414. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
  415. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
  416. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
  417. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
  418. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
  419. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  420. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
  421. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
  422. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
  423. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
  424. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
  425. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
  426. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
  427. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
  428. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
  429. package/vendor/re2/.bazelrc +4 -4
  430. package/vendor/re2/.bcr/metadata.template.json +16 -0
  431. package/vendor/re2/.bcr/presubmit.yml +57 -0
  432. package/vendor/re2/.bcr/source.template.json +5 -0
  433. package/vendor/re2/.github/bazel.sh +1 -7
  434. package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
  435. package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
  436. package/vendor/re2/.github/workflows/ci.yml +5 -6
  437. package/vendor/re2/.github/workflows/pages.yml +3 -3
  438. package/vendor/re2/.github/workflows/python.yml +29 -24
  439. package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
  440. package/vendor/re2/.github/workflows/release.yml +15 -4
  441. package/vendor/re2/BUILD.bazel +25 -0
  442. package/vendor/re2/CMakeLists.txt +100 -85
  443. package/vendor/re2/CONTRIBUTING.md +0 -1
  444. package/vendor/re2/MODULE.bazel +10 -10
  445. package/vendor/re2/Makefile +1 -1
  446. package/vendor/re2/README.md +259 -0
  447. package/vendor/re2/python/BUILD.bazel +8 -0
  448. package/vendor/re2/python/re2.py +1 -1
  449. package/vendor/re2/python/re2_test.py +6 -0
  450. package/vendor/re2/python/setup.py +3 -3
  451. package/vendor/re2/re2/bitmap256.cc +3 -4
  452. package/vendor/re2/re2/bitstate.cc +15 -10
  453. package/vendor/re2/re2/dfa.cc +1 -2
  454. package/vendor/re2/re2/parse.cc +3 -4
  455. package/vendor/re2/re2/prog.cc +1 -2
  456. package/vendor/re2/re2/prog.h +1 -0
  457. package/vendor/re2/re2/re2.cc +5 -0
  458. package/vendor/re2/re2/re2.h +9 -9
  459. package/vendor/re2/re2/set.cc +6 -0
  460. package/vendor/re2/re2/set.h +5 -0
  461. package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
  462. package/vendor/re2/re2/testing/re2_test.cc +8 -0
  463. package/vendor/re2/re2/testing/set_test.cc +5 -0
  464. package/vendor/re2/re2/walker-inl.h +1 -1
  465. package/vendor/abseil-cpp/WORKSPACE +0 -76
  466. package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
  467. package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
  468. package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  469. package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
  470. package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
  471. package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
  472. package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
  473. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
  474. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
  475. package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  476. package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
  477. package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
  478. package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
  479. package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
  480. package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
  481. package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  482. package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  483. package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  484. package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  485. package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
  486. package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
  487. package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
  488. package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
  489. package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
  490. package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
  491. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
  492. package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
  493. package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
  494. package/vendor/re2/.github/workflows/pr.yml +0 -34
  495. package/vendor/re2/README +0 -47
@@ -31,6 +31,7 @@
31
31
  #include "gtest/gtest.h"
32
32
  #include "absl/base/attributes.h"
33
33
  #include "absl/base/internal/exception_testing.h"
34
+ #include "absl/base/internal/iterator_traits_test_helper.h"
34
35
  #include "absl/base/macros.h"
35
36
  #include "absl/base/options.h"
36
37
  #include "absl/container/internal/test_allocator.h"
@@ -649,6 +650,33 @@ TEST(IntVec, Insert) {
649
650
  }
650
651
  }
651
652
 
653
+ TEST(IntPairVec, Insert) {
654
+ for (size_t len = 0; len < 20; len++) {
655
+ for (ptrdiff_t pos = 0; pos <= static_cast<ptrdiff_t>(len); pos++) {
656
+ // Iterator range (C++20 forward iterator)
657
+ const std::forward_list<int> unzipped_input = {9999, 8888, 7777};
658
+ const absl::base_internal::Cpp20ForwardZipIterator<
659
+ std::forward_list<int>::const_iterator>
660
+ begin(unzipped_input.cbegin(), unzipped_input.cbegin());
661
+ const absl::base_internal::Cpp20ForwardZipIterator<
662
+ std::forward_list<int>::const_iterator>
663
+ end(unzipped_input.cend(), unzipped_input.cend());
664
+
665
+ std::vector<std::pair<int, int>> std_v;
666
+ absl::InlinedVector<std::pair<int, int>, 8> v;
667
+ for (size_t i = 0; i < len; ++i) {
668
+ std_v.emplace_back(i, i);
669
+ v.emplace_back(i, i);
670
+ }
671
+
672
+ std_v.insert(std_v.begin() + pos, begin, end);
673
+ auto it = v.insert(v.cbegin() + pos, begin, end);
674
+ EXPECT_THAT(v, ElementsAreArray(std_v));
675
+ EXPECT_EQ(it, v.cbegin() + pos);
676
+ }
677
+ }
678
+ }
679
+
652
680
  TEST(RefCountedVec, InsertConstructorDestructor) {
653
681
  // Make sure the proper construction/destruction happen during insert
654
682
  // operations.
@@ -60,6 +60,7 @@
60
60
  #include "absl/base/config.h"
61
61
  #include "absl/base/internal/raw_logging.h"
62
62
  #include "absl/base/macros.h"
63
+ #include "absl/base/optimization.h"
63
64
  #include "absl/container/internal/common.h"
64
65
  #include "absl/container/internal/common_policy_traits.h"
65
66
  #include "absl/container/internal/compressed_tuple.h"
@@ -224,7 +225,7 @@ struct key_compare_adapter {
224
225
 
225
226
  public:
226
227
  using Base::Base;
227
- checked_compare(Compare comp) : Base(std::move(comp)) {} // NOLINT
228
+ checked_compare(Compare cmp) : Base(std::move(cmp)) {} // NOLINT
228
229
 
229
230
  // Allow converting to Compare for use in key_comp()/value_comp().
230
231
  explicit operator Compare() const { return comp(); }
@@ -708,6 +709,8 @@ class btree_node {
708
709
  }
709
710
 
710
711
  // Getter for the parent of this node.
712
+ // TODO(ezb): assert that the child of the returned node at position
713
+ // `node_->position()` maps to the current node.
711
714
  btree_node *parent() const { return *GetField<0>(); }
712
715
  // Getter for whether the node is the root of the tree. The parent of the
713
716
  // root of the tree is the leftmost node in the tree which is guaranteed to
@@ -1175,6 +1178,26 @@ class btree_iterator : private btree_iterator_generation_info {
1175
1178
  return distance_slow(other);
1176
1179
  }
1177
1180
 
1181
+ // Advances the iterator by `n`. Values of `n` must not result in going past
1182
+ // the `end` iterator (for a positive `n`) or before the `begin` iterator (for
1183
+ // a negative `n`).
1184
+ btree_iterator &operator+=(difference_type n) {
1185
+ assert_valid_generation(node_);
1186
+ if (n == 0) return *this;
1187
+ if (n < 0) return decrement_n_slow(-n);
1188
+ return increment_n_slow(n);
1189
+ }
1190
+
1191
+ // Moves the iterator by `n` positions backwards. Values of `n` must not
1192
+ // result in going before the `begin` iterator (for a positive `n`) or past
1193
+ // the `end` iterator (for a negative `n`).
1194
+ btree_iterator &operator-=(difference_type n) {
1195
+ assert_valid_generation(node_);
1196
+ if (n == 0) return *this;
1197
+ if (n < 0) return increment_n_slow(-n);
1198
+ return decrement_n_slow(n);
1199
+ }
1200
+
1178
1201
  // Accessors for the key/value the iterator is pointing at.
1179
1202
  reference operator*() const {
1180
1203
  ABSL_HARDENING_ASSERT(node_ != nullptr);
@@ -1277,6 +1300,7 @@ class btree_iterator : private btree_iterator_generation_info {
1277
1300
  increment_slow();
1278
1301
  }
1279
1302
  void increment_slow();
1303
+ btree_iterator &increment_n_slow(difference_type n);
1280
1304
 
1281
1305
  void decrement() {
1282
1306
  assert_valid_generation(node_);
@@ -1286,6 +1310,7 @@ class btree_iterator : private btree_iterator_generation_info {
1286
1310
  decrement_slow();
1287
1311
  }
1288
1312
  void decrement_slow();
1313
+ btree_iterator &decrement_n_slow(difference_type n);
1289
1314
 
1290
1315
  const key_type &key() const {
1291
1316
  return node_->key(static_cast<size_type>(position_));
@@ -2126,50 +2151,128 @@ auto btree_iterator<N, R, P>::distance_slow(const_iterator other) const
2126
2151
 
2127
2152
  template <typename N, typename R, typename P>
2128
2153
  void btree_iterator<N, R, P>::increment_slow() {
2129
- if (node_->is_leaf()) {
2130
- assert(position_ >= node_->finish());
2131
- btree_iterator save(*this);
2132
- while (position_ == node_->finish() && !node_->is_root()) {
2133
- assert(node_->parent()->child(node_->position()) == node_);
2134
- position_ = node_->position();
2135
- node_ = node_->parent();
2154
+ N* node = node_;
2155
+ int position = position_;
2156
+ if (node->is_leaf()) {
2157
+ assert(position >= node->finish());
2158
+ while (position == node->finish() && !node->is_root()) {
2159
+ assert(node->parent()->child(node->position()) == node);
2160
+ position = node->position();
2161
+ node = node->parent();
2136
2162
  }
2137
2163
  // TODO(ezb): assert we aren't incrementing end() instead of handling.
2138
- if (position_ == node_->finish()) {
2139
- *this = save;
2164
+ if (position == node->finish()) {
2165
+ return;
2140
2166
  }
2141
2167
  } else {
2142
- assert(position_ < node_->finish());
2143
- node_ = node_->child(static_cast<field_type>(position_ + 1));
2144
- while (node_->is_internal()) {
2145
- node_ = node_->start_child();
2168
+ assert(position < node->finish());
2169
+ node = node->child(static_cast<field_type>(position + 1));
2170
+ while (node->is_internal()) {
2171
+ node = node->start_child();
2146
2172
  }
2147
- position_ = node_->start();
2173
+ position = node->start();
2148
2174
  }
2175
+ *this = {node, position};
2149
2176
  }
2150
2177
 
2151
2178
  template <typename N, typename R, typename P>
2152
2179
  void btree_iterator<N, R, P>::decrement_slow() {
2153
- if (node_->is_leaf()) {
2154
- assert(position_ <= -1);
2155
- btree_iterator save(*this);
2156
- while (position_ < node_->start() && !node_->is_root()) {
2157
- assert(node_->parent()->child(node_->position()) == node_);
2158
- position_ = node_->position() - 1;
2159
- node_ = node_->parent();
2180
+ N* node = node_;
2181
+ int position = position_;
2182
+ if (node->is_leaf()) {
2183
+ assert(position <= -1);
2184
+ while (position < node->start() && !node->is_root()) {
2185
+ assert(node->parent()->child(node->position()) == node);
2186
+ position = node->position() - 1;
2187
+ node = node->parent();
2160
2188
  }
2161
2189
  // TODO(ezb): assert we aren't decrementing begin() instead of handling.
2162
- if (position_ < node_->start()) {
2163
- *this = save;
2190
+ if (position < node->start()) {
2191
+ return;
2164
2192
  }
2165
2193
  } else {
2166
- assert(position_ >= node_->start());
2167
- node_ = node_->child(static_cast<field_type>(position_));
2168
- while (node_->is_internal()) {
2169
- node_ = node_->child(node_->finish());
2194
+ assert(position >= node->start());
2195
+ node = node->child(static_cast<field_type>(position));
2196
+ while (node->is_internal()) {
2197
+ node = node->child(node->finish());
2170
2198
  }
2171
- position_ = node_->finish() - 1;
2199
+ position = node->finish() - 1;
2172
2200
  }
2201
+ *this = {node, position};
2202
+ }
2203
+
2204
+ template <typename N, typename R, typename P>
2205
+ btree_iterator<N, R, P> &btree_iterator<N, R, P>::increment_n_slow(
2206
+ difference_type n) {
2207
+ N *node = node_;
2208
+ int position = position_;
2209
+ ABSL_ASSUME(n > 0);
2210
+ while (n > 0) {
2211
+ if (node->is_leaf()) {
2212
+ if (position + n < node->finish()) {
2213
+ position += n;
2214
+ break;
2215
+ } else {
2216
+ n -= node->finish() - position;
2217
+ position = node->finish();
2218
+ btree_iterator save = {node, position};
2219
+ while (position == node->finish() && !node->is_root()) {
2220
+ position = node->position();
2221
+ node = node->parent();
2222
+ }
2223
+ if (position == node->finish()) {
2224
+ ABSL_HARDENING_ASSERT(n == 0);
2225
+ return *this = save;
2226
+ }
2227
+ }
2228
+ } else {
2229
+ --n;
2230
+ assert(position < node->finish());
2231
+ node = node->child(static_cast<field_type>(position + 1));
2232
+ while (node->is_internal()) {
2233
+ node = node->start_child();
2234
+ }
2235
+ position = node->start();
2236
+ }
2237
+ }
2238
+ node_ = node;
2239
+ position_ = position;
2240
+ return *this;
2241
+ }
2242
+
2243
+ template <typename N, typename R, typename P>
2244
+ btree_iterator<N, R, P> &btree_iterator<N, R, P>::decrement_n_slow(
2245
+ difference_type n) {
2246
+ N *node = node_;
2247
+ int position = position_;
2248
+ ABSL_ASSUME(n > 0);
2249
+ while (n > 0) {
2250
+ if (node->is_leaf()) {
2251
+ if (position - n >= node->start()) {
2252
+ position -= n;
2253
+ break;
2254
+ } else {
2255
+ n -= 1 + position - node->start();
2256
+ position = node->start() - 1;
2257
+ while (position < node->start() && !node->is_root()) {
2258
+ position = node->position() - 1;
2259
+ node = node->parent();
2260
+ }
2261
+ ABSL_HARDENING_ASSERT(position >= node->start());
2262
+ }
2263
+ } else {
2264
+ --n;
2265
+ assert(position >= node->start());
2266
+ node = node->child(static_cast<field_type>(position));
2267
+ while (node->is_internal()) {
2268
+ node = node->child(node->finish());
2269
+ }
2270
+ position = node->finish() - 1;
2271
+ }
2272
+ }
2273
+ node_ = node;
2274
+ position_ = position;
2275
+ return *this;
2173
2276
  }
2174
2277
 
2175
2278
  ////
@@ -18,12 +18,14 @@
18
18
  #include <algorithm>
19
19
  #include <initializer_list>
20
20
  #include <iterator>
21
+ #include <type_traits>
21
22
  #include <utility>
22
23
 
23
24
  #include "absl/base/attributes.h"
24
25
  #include "absl/base/internal/throw_delegate.h"
25
26
  #include "absl/container/internal/btree.h" // IWYU pragma: export
26
27
  #include "absl/container/internal/common.h"
28
+ #include "absl/hash/internal/weakly_mixed_integer.h"
27
29
  #include "absl/memory/memory.h"
28
30
  #include "absl/meta/type_traits.h"
29
31
 
@@ -266,7 +268,8 @@ class btree_container {
266
268
  for (const auto &v : b) {
267
269
  h = State::combine(std::move(h), v);
268
270
  }
269
- return State::combine(std::move(h), b.size());
271
+ return State::combine(std::move(h),
272
+ hash_internal::WeaklyMixedInteger{b.size()});
270
273
  }
271
274
 
272
275
  protected:
@@ -451,6 +454,29 @@ class btree_map_container : public btree_set_container<Tree> {
451
454
  template <class K>
452
455
  using key_arg = typename super_type::template key_arg<K>;
453
456
 
457
+ // NOTE: The mess here is to shorten the code for the (very repetitive)
458
+ // function overloads, and to allow the lifetime-bound overloads to dispatch
459
+ // to the non-lifetime-bound overloads, to ensure there is a single source of
460
+ // truth for each overload set.
461
+ //
462
+ // Enabled if an assignment from the given type would require the
463
+ // source object to remain alive for the life of the element.
464
+ //
465
+ // TODO(b/402804213): Remove these traits and simplify the overloads whenever
466
+ // we have a better mechanism available to handle lifetime analysis.
467
+ template <class K, bool Value, typename = void>
468
+ using LifetimeBoundK =
469
+ HasValue<Value, type_traits_internal::IsLifetimeBoundAssignment<
470
+ typename Tree::key_type, K>>;
471
+ template <class M, bool Value, typename = void>
472
+ using LifetimeBoundV =
473
+ HasValue<Value, type_traits_internal::IsLifetimeBoundAssignment<
474
+ typename Tree::params_type::mapped_type, M>>;
475
+ template <class K, bool KValue, class M, bool MValue, typename... Dummy>
476
+ using LifetimeBoundKV =
477
+ absl::conjunction<LifetimeBoundK<K, KValue, absl::void_t<Dummy...>>,
478
+ LifetimeBoundV<M, MValue>>;
479
+
454
480
  public:
455
481
  using key_type = typename Tree::key_type;
456
482
  using mapped_type = typename params_type::mapped_type;
@@ -464,85 +490,163 @@ class btree_map_container : public btree_set_container<Tree> {
464
490
  using super_type::super_type;
465
491
  btree_map_container() {}
466
492
 
493
+ // TODO(b/402804213): Remove these macros whenever we have a better mechanism
494
+ // available to handle lifetime analysis.
495
+ #define ABSL_INTERNAL_X(Func, Callee, KQual, MQual, KValue, MValue, ...) \
496
+ template < \
497
+ typename K = key_type, class M, \
498
+ ABSL_INTERNAL_IF_##KValue##_NOR_##MValue( \
499
+ int = (EnableIf<LifetimeBoundKV<K, KValue, M, MValue, \
500
+ IfRRef<int KQual>::AddPtr<K>, \
501
+ IfRRef<int MQual>::AddPtr<M>>>()), \
502
+ ABSL_INTERNAL_SINGLE_ARG( \
503
+ int &..., \
504
+ decltype(EnableIf<LifetimeBoundKV<K, KValue, M, MValue>>()) = \
505
+ 0))> \
506
+ decltype(auto) Func( \
507
+ __VA_ARGS__ key_arg<K> KQual k ABSL_INTERNAL_IF_##KValue( \
508
+ ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)), \
509
+ M MQual obj ABSL_INTERNAL_IF_##MValue( \
510
+ ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))) \
511
+ ABSL_ATTRIBUTE_LIFETIME_BOUND { \
512
+ return ABSL_INTERNAL_IF_##KValue##_OR_##MValue( \
513
+ (this->template Func<K, M, 0>), Callee)( \
514
+ __VA_ARGS__ std::forward<decltype(k)>(k), \
515
+ std::forward<decltype(obj)>(obj)); \
516
+ } \
517
+ friend struct std::enable_if<false> /* just to force a semicolon */
467
518
  // Insertion routines.
468
519
  // Note: the nullptr template arguments and extra `const M&` overloads allow
469
520
  // for supporting bitfield arguments.
470
- template <typename K = key_type, class M>
471
- std::pair<iterator, bool> insert_or_assign(const key_arg<K> &k, const M &obj)
472
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
473
- return insert_or_assign_impl(k, obj);
474
- }
475
- template <typename K = key_type, class M, K * = nullptr>
476
- std::pair<iterator, bool> insert_or_assign(key_arg<K> &&k, const M &obj)
477
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
478
- return insert_or_assign_impl(std::forward<K>(k), obj);
479
- }
480
- template <typename K = key_type, class M, M * = nullptr>
481
- std::pair<iterator, bool> insert_or_assign(const key_arg<K> &k, M &&obj)
482
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
483
- return insert_or_assign_impl(k, std::forward<M>(obj));
484
- }
485
- template <typename K = key_type, class M, K * = nullptr, M * = nullptr>
486
- std::pair<iterator, bool> insert_or_assign(key_arg<K> &&k, M &&obj)
487
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
488
- return insert_or_assign_impl(std::forward<K>(k), std::forward<M>(obj));
489
- }
490
- template <typename K = key_type, class M>
491
- iterator insert_or_assign(const_iterator hint, const key_arg<K> &k,
492
- const M &obj) ABSL_ATTRIBUTE_LIFETIME_BOUND {
493
- return insert_or_assign_hint_impl(hint, k, obj);
494
- }
495
- template <typename K = key_type, class M, K * = nullptr>
496
- iterator insert_or_assign(const_iterator hint, key_arg<K> &&k,
497
- const M &obj) ABSL_ATTRIBUTE_LIFETIME_BOUND {
498
- return insert_or_assign_hint_impl(hint, std::forward<K>(k), obj);
499
- }
500
- template <typename K = key_type, class M, M * = nullptr>
501
- iterator insert_or_assign(const_iterator hint, const key_arg<K> &k,
502
- M &&obj) ABSL_ATTRIBUTE_LIFETIME_BOUND {
503
- return insert_or_assign_hint_impl(hint, k, std::forward<M>(obj));
504
- }
505
- template <typename K = key_type, class M, K * = nullptr, M * = nullptr>
506
- iterator insert_or_assign(const_iterator hint, key_arg<K> &&k,
507
- M &&obj) ABSL_ATTRIBUTE_LIFETIME_BOUND {
508
- return insert_or_assign_hint_impl(hint, std::forward<K>(k),
509
- std::forward<M>(obj));
510
- }
511
-
512
- template <typename K = key_type, typename... Args,
513
- typename absl::enable_if_t<
514
- !std::is_convertible<K, const_iterator>::value, int> = 0>
515
- std::pair<iterator, bool> try_emplace(const key_arg<K> &k, Args &&...args)
516
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
517
- return try_emplace_impl(k, std::forward<Args>(args)...);
518
- }
519
- template <typename K = key_type, typename... Args,
520
- typename absl::enable_if_t<
521
- !std::is_convertible<K, const_iterator>::value, int> = 0>
522
- std::pair<iterator, bool> try_emplace(key_arg<K> &&k, Args &&...args)
523
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
524
- return try_emplace_impl(std::forward<K>(k), std::forward<Args>(args)...);
525
- }
526
- template <typename K = key_type, typename... Args>
527
- iterator try_emplace(const_iterator hint, const key_arg<K> &k,
528
- Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
529
- return try_emplace_hint_impl(hint, k, std::forward<Args>(args)...);
530
- }
531
- template <typename K = key_type, typename... Args>
532
- iterator try_emplace(const_iterator hint, key_arg<K> &&k,
533
- Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND {
534
- return try_emplace_hint_impl(hint, std::forward<K>(k),
535
- std::forward<Args>(args)...);
536
- }
537
-
538
- template <typename K = key_type>
521
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
522
+ false, false);
523
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
524
+ false, true);
525
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
526
+ true, false);
527
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, const &,
528
+ true, true);
529
+
530
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, false,
531
+ false);
532
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, false,
533
+ true);
534
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, true,
535
+ false);
536
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, const &, &&, true,
537
+ true);
538
+
539
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, false,
540
+ false);
541
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, false,
542
+ true);
543
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, true,
544
+ false);
545
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, const &, true,
546
+ true);
547
+
548
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, false,
549
+ false);
550
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, false, true);
551
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, true, false);
552
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_impl, &&, &&, true, true);
553
+
554
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &,
555
+ const &, false, false,
556
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
557
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &,
558
+ const &, false, true,
559
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
560
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &,
561
+ const &, true, false,
562
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
563
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &,
564
+ const &, true, true,
565
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
566
+
567
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &, &&,
568
+ false, false, const_iterator(hint) ABSL_INTERNAL_COMMA);
569
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &, &&,
570
+ false, true, const_iterator(hint) ABSL_INTERNAL_COMMA);
571
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &, &&,
572
+ true, false, const_iterator(hint) ABSL_INTERNAL_COMMA);
573
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, const &, &&,
574
+ true, true, const_iterator(hint) ABSL_INTERNAL_COMMA);
575
+
576
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, const &,
577
+ false, false, const_iterator(hint) ABSL_INTERNAL_COMMA);
578
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, const &,
579
+ false, true, const_iterator(hint) ABSL_INTERNAL_COMMA);
580
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, const &,
581
+ true, false, const_iterator(hint) ABSL_INTERNAL_COMMA);
582
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, const &,
583
+ true, true, const_iterator(hint) ABSL_INTERNAL_COMMA);
584
+
585
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, &&, false,
586
+ false, const_iterator(hint) ABSL_INTERNAL_COMMA);
587
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, &&, false,
588
+ true, const_iterator(hint) ABSL_INTERNAL_COMMA);
589
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, &&, true,
590
+ false, const_iterator(hint) ABSL_INTERNAL_COMMA);
591
+ ABSL_INTERNAL_X(insert_or_assign, insert_or_assign_hint_impl, &&, &&, true,
592
+ true, const_iterator(hint) ABSL_INTERNAL_COMMA);
593
+ #undef ABSL_INTERNAL_X
594
+
595
+ #define ABSL_INTERNAL_X(Func, Callee, KQual, KValue, ...) \
596
+ template < \
597
+ class K = key_type, \
598
+ ABSL_INTERNAL_IF_##KValue( \
599
+ class... Args, \
600
+ int = (EnableIf< \
601
+ LifetimeBoundK<K, KValue, IfRRef<int KQual>::AddPtr<K>>>())), \
602
+ ABSL_INTERNAL_IF_##KValue( \
603
+ decltype(EnableIf<LifetimeBoundK< \
604
+ K, KValue, IfRRef<int KQual>::AddPtr<K>>>()) = 0, \
605
+ class... Args), \
606
+ std::enable_if_t<!std::is_convertible<K, const_iterator>::value, int> = \
607
+ 0> \
608
+ decltype(auto) Func( \
609
+ __VA_ARGS__ key_arg<K> KQual k ABSL_INTERNAL_IF_##KValue( \
610
+ ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this)), \
611
+ Args &&...args) ABSL_ATTRIBUTE_LIFETIME_BOUND { \
612
+ return ABSL_INTERNAL_IF_##KValue((this->template Func<K, 0>), Callee)( \
613
+ __VA_ARGS__ std::forward<decltype(k)>(k), \
614
+ std::forward<decltype(args)>(args)...); \
615
+ } \
616
+ friend struct std::enable_if<false> /* just to force a semicolon */
617
+ ABSL_INTERNAL_X(try_emplace, try_emplace_impl, const &, false);
618
+ ABSL_INTERNAL_X(try_emplace, try_emplace_impl, const &, true);
619
+ ABSL_INTERNAL_X(try_emplace, try_emplace_impl, &&, false);
620
+ ABSL_INTERNAL_X(try_emplace, try_emplace_impl, &&, true);
621
+ ABSL_INTERNAL_X(try_emplace, try_emplace_hint_impl, const &, false,
622
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
623
+ ABSL_INTERNAL_X(try_emplace, try_emplace_hint_impl, const &, true,
624
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
625
+ ABSL_INTERNAL_X(try_emplace, try_emplace_hint_impl, &&, false,
626
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
627
+ ABSL_INTERNAL_X(try_emplace, try_emplace_hint_impl, &&, true,
628
+ const_iterator(hint) ABSL_INTERNAL_COMMA);
629
+ #undef ABSL_INTERNAL_X
630
+
631
+ template <class K = key_type, int = EnableIf<LifetimeBoundK<K, false>>()>
539
632
  mapped_type &operator[](const key_arg<K> &k) ABSL_ATTRIBUTE_LIFETIME_BOUND {
540
633
  return try_emplace(k).first->second;
541
634
  }
542
- template <typename K = key_type>
635
+ template <class K = key_type, int &..., EnableIf<LifetimeBoundK<K, true>> = 0>
636
+ mapped_type &operator[](
637
+ const key_arg<K> &k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
638
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
639
+ return this->template operator[]<K, 0>(k);
640
+ }
641
+ template <class K = key_type, int = EnableIf<LifetimeBoundK<K, false>>()>
543
642
  mapped_type &operator[](key_arg<K> &&k) ABSL_ATTRIBUTE_LIFETIME_BOUND {
544
643
  return try_emplace(std::forward<K>(k)).first->second;
545
644
  }
645
+ template <class K = key_type, int &..., EnableIf<LifetimeBoundK<K, true>> = 0>
646
+ mapped_type &operator[](key_arg<K> &&k ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(
647
+ this)) ABSL_ATTRIBUTE_LIFETIME_BOUND {
648
+ return this->template operator[]<K, 0>(std::forward<K>(k));
649
+ }
546
650
 
547
651
  template <typename K = key_type>
548
652
  mapped_type &at(const key_arg<K> &key) ABSL_ATTRIBUTE_LIFETIME_BOUND {
@@ -21,10 +21,53 @@
21
21
  #include "absl/meta/type_traits.h"
22
22
  #include "absl/types/optional.h"
23
23
 
24
+ // TODO(b/402804213): Clean up these macros when no longer needed.
25
+ #define ABSL_INTERNAL_SINGLE_ARG(...) __VA_ARGS__
26
+
27
+ #define ABSL_INTERNAL_IF_true(if_satisfied, ...) if_satisfied
28
+ #define ABSL_INTERNAL_IF_false(if_satisfied, ...) __VA_ARGS__
29
+
30
+ #define ABSL_INTERNAL_IF_true_AND_true ABSL_INTERNAL_IF_true
31
+ #define ABSL_INTERNAL_IF_false_AND_false ABSL_INTERNAL_IF_false
32
+ #define ABSL_INTERNAL_IF_true_AND_false ABSL_INTERNAL_IF_false_AND_false
33
+ #define ABSL_INTERNAL_IF_false_AND_true ABSL_INTERNAL_IF_false_AND_false
34
+
35
+ #define ABSL_INTERNAL_IF_true_OR_true ABSL_INTERNAL_IF_true
36
+ #define ABSL_INTERNAL_IF_false_OR_false ABSL_INTERNAL_IF_false
37
+ #define ABSL_INTERNAL_IF_true_OR_false ABSL_INTERNAL_IF_true_OR_true
38
+ #define ABSL_INTERNAL_IF_false_OR_true ABSL_INTERNAL_IF_true_OR_true
39
+
40
+ #define ABSL_INTERNAL_IF_true_NOR_true ABSL_INTERNAL_IF_false_AND_false
41
+ #define ABSL_INTERNAL_IF_false_NOR_false ABSL_INTERNAL_IF_true_AND_true
42
+ #define ABSL_INTERNAL_IF_true_NOR_false ABSL_INTERNAL_IF_false_AND_true
43
+ #define ABSL_INTERNAL_IF_false_NOR_true ABSL_INTERNAL_IF_true_AND_false
44
+
45
+ #define ABSL_INTERNAL_COMMA ,
46
+
24
47
  namespace absl {
25
48
  ABSL_NAMESPACE_BEGIN
26
49
  namespace container_internal {
27
50
 
51
+ // TODO(b/402804213): Clean up these traits when no longer needed or
52
+ // deduplicate them with absl::functional_internal::EnableIf.
53
+ template <class Cond>
54
+ using EnableIf = std::enable_if_t<Cond::value, int>;
55
+
56
+ template <bool Value, class T>
57
+ using HasValue = std::conditional_t<Value, T, absl::negation<T>>;
58
+
59
+ template <class T>
60
+ struct IfRRef {
61
+ template <class Other>
62
+ using AddPtr = Other;
63
+ };
64
+
65
+ template <class T>
66
+ struct IfRRef<T&&> {
67
+ template <class Other>
68
+ using AddPtr = Other*;
69
+ };
70
+
28
71
  template <class, class = void>
29
72
  struct IsTransparent : std::false_type {};
30
73
  template <class T>
@@ -119,7 +119,7 @@ struct common_policy_traits {
119
119
  old_slot)) {
120
120
  return P::transfer(alloc, new_slot, old_slot);
121
121
  }
122
- #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
122
+
123
123
  // This overload returns true_type for the trait below.
124
124
  // The conditional_t is to make the enabler type dependent.
125
125
  template <class Alloc,
@@ -135,7 +135,6 @@ struct common_policy_traits {
135
135
  static_cast<const void*>(&element(old_slot)), sizeof(value_type));
136
136
  return {};
137
137
  }
138
- #endif
139
138
 
140
139
  template <class Alloc>
141
140
  static void transfer_impl(Alloc* alloc, slot_type* new_slot,