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
@@ -0,0 +1,259 @@
1
+ // Copyright 2025 The Abseil Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/container/internal/hashtable_control_bytes.h"
16
+
17
+ #include <array>
18
+ #include <cstddef>
19
+ #include <cstdint>
20
+ #include <vector>
21
+
22
+ #include "gmock/gmock.h"
23
+ #include "gtest/gtest.h"
24
+ #include "absl/base/config.h"
25
+
26
+ namespace absl {
27
+ ABSL_NAMESPACE_BEGIN
28
+ namespace container_internal {
29
+ namespace {
30
+
31
+ using ::testing::ElementsAre;
32
+ using ::testing::ElementsAreArray;
33
+
34
+ // Convenience function to static cast to ctrl_t.
35
+ ctrl_t CtrlT(int i) { return static_cast<ctrl_t>(i); }
36
+
37
+ TEST(BitMask, Smoke) {
38
+ EXPECT_FALSE((BitMask<uint8_t, 8>(0)));
39
+ EXPECT_TRUE((BitMask<uint8_t, 8>(5)));
40
+
41
+ EXPECT_THAT((BitMask<uint8_t, 8>(0)), ElementsAre());
42
+ EXPECT_THAT((BitMask<uint8_t, 8>(0x1)), ElementsAre(0));
43
+ EXPECT_THAT((BitMask<uint8_t, 8>(0x2)), ElementsAre(1));
44
+ EXPECT_THAT((BitMask<uint8_t, 8>(0x3)), ElementsAre(0, 1));
45
+ EXPECT_THAT((BitMask<uint8_t, 8>(0x4)), ElementsAre(2));
46
+ EXPECT_THAT((BitMask<uint8_t, 8>(0x5)), ElementsAre(0, 2));
47
+ EXPECT_THAT((BitMask<uint8_t, 8>(0x55)), ElementsAre(0, 2, 4, 6));
48
+ EXPECT_THAT((BitMask<uint8_t, 8>(0xAA)), ElementsAre(1, 3, 5, 7));
49
+ }
50
+
51
+ TEST(BitMask, WithShift_MatchPortable) {
52
+ // See the non-SSE version of Group for details on what this math is for.
53
+ uint64_t ctrl = 0x1716151413121110;
54
+ uint64_t hash = 0x12;
55
+ constexpr uint64_t lsbs = 0x0101010101010101ULL;
56
+ auto x = ctrl ^ (lsbs * hash);
57
+ uint64_t mask = (x - lsbs) & ~x & kMsbs8Bytes;
58
+ EXPECT_EQ(0x0000000080800000, mask);
59
+
60
+ BitMask<uint64_t, 8, 3> b(mask);
61
+ EXPECT_EQ(*b, 2);
62
+ }
63
+
64
+ constexpr uint64_t kSome8BytesMask = /* */ 0x8000808080008000ULL;
65
+ constexpr uint64_t kSome8BytesMaskAllOnes = 0xff00ffffff00ff00ULL;
66
+ constexpr auto kSome8BytesMaskBits = std::array<int, 5>{1, 3, 4, 5, 7};
67
+
68
+ TEST(BitMask, WithShift_FullMask) {
69
+ EXPECT_THAT((BitMask<uint64_t, 8, 3>(kMsbs8Bytes)),
70
+ ElementsAre(0, 1, 2, 3, 4, 5, 6, 7));
71
+ EXPECT_THAT(
72
+ (BitMask<uint64_t, 8, 3, /*NullifyBitsOnIteration=*/true>(kMsbs8Bytes)),
73
+ ElementsAre(0, 1, 2, 3, 4, 5, 6, 7));
74
+ EXPECT_THAT(
75
+ (BitMask<uint64_t, 8, 3, /*NullifyBitsOnIteration=*/true>(~uint64_t{0})),
76
+ ElementsAre(0, 1, 2, 3, 4, 5, 6, 7));
77
+ }
78
+
79
+ TEST(BitMask, WithShift_EmptyMask) {
80
+ EXPECT_THAT((BitMask<uint64_t, 8, 3>(0)), ElementsAre());
81
+ EXPECT_THAT((BitMask<uint64_t, 8, 3, /*NullifyBitsOnIteration=*/true>(0)),
82
+ ElementsAre());
83
+ }
84
+
85
+ TEST(BitMask, WithShift_SomeMask) {
86
+ EXPECT_THAT((BitMask<uint64_t, 8, 3>(kSome8BytesMask)),
87
+ ElementsAreArray(kSome8BytesMaskBits));
88
+ EXPECT_THAT((BitMask<uint64_t, 8, 3, /*NullifyBitsOnIteration=*/true>(
89
+ kSome8BytesMask)),
90
+ ElementsAreArray(kSome8BytesMaskBits));
91
+ EXPECT_THAT((BitMask<uint64_t, 8, 3, /*NullifyBitsOnIteration=*/true>(
92
+ kSome8BytesMaskAllOnes)),
93
+ ElementsAreArray(kSome8BytesMaskBits));
94
+ }
95
+
96
+ TEST(BitMask, WithShift_SomeMaskExtraBitsForNullify) {
97
+ // Verify that adding extra bits into non zero bytes is fine.
98
+ uint64_t extra_bits = 77;
99
+ for (int i = 0; i < 100; ++i) {
100
+ // Add extra bits, but keep zero bytes untouched.
101
+ uint64_t extra_mask = extra_bits & kSome8BytesMaskAllOnes;
102
+ EXPECT_THAT((BitMask<uint64_t, 8, 3, /*NullifyBitsOnIteration=*/true>(
103
+ kSome8BytesMask | extra_mask)),
104
+ ElementsAreArray(kSome8BytesMaskBits))
105
+ << i << " " << extra_mask;
106
+ extra_bits = (extra_bits + 1) * 3;
107
+ }
108
+ }
109
+
110
+ TEST(BitMask, LeadingTrailing) {
111
+ EXPECT_EQ((BitMask<uint32_t, 16>(0x00001a40).LeadingZeros()), 3);
112
+ EXPECT_EQ((BitMask<uint32_t, 16>(0x00001a40).TrailingZeros()), 6);
113
+
114
+ EXPECT_EQ((BitMask<uint32_t, 16>(0x00000001).LeadingZeros()), 15);
115
+ EXPECT_EQ((BitMask<uint32_t, 16>(0x00000001).TrailingZeros()), 0);
116
+
117
+ EXPECT_EQ((BitMask<uint32_t, 16>(0x00008000).LeadingZeros()), 0);
118
+ EXPECT_EQ((BitMask<uint32_t, 16>(0x00008000).TrailingZeros()), 15);
119
+
120
+ EXPECT_EQ((BitMask<uint64_t, 8, 3>(0x0000008080808000).LeadingZeros()), 3);
121
+ EXPECT_EQ((BitMask<uint64_t, 8, 3>(0x0000008080808000).TrailingZeros()), 1);
122
+
123
+ EXPECT_EQ((BitMask<uint64_t, 8, 3>(0x0000000000000080).LeadingZeros()), 7);
124
+ EXPECT_EQ((BitMask<uint64_t, 8, 3>(0x0000000000000080).TrailingZeros()), 0);
125
+
126
+ EXPECT_EQ((BitMask<uint64_t, 8, 3>(0x8000000000000000).LeadingZeros()), 0);
127
+ EXPECT_EQ((BitMask<uint64_t, 8, 3>(0x8000000000000000).TrailingZeros()), 7);
128
+ }
129
+
130
+ template <class GroupTypeParam>
131
+ class GroupTest : public testing::Test {};
132
+ using GroupTypes =
133
+ ::testing::Types<Group, GroupPortableImpl, GroupFullEmptyOrDeleted>;
134
+ TYPED_TEST_SUITE(GroupTest, GroupTypes);
135
+
136
+ TYPED_TEST(GroupTest, Match) {
137
+ using GroupType = TypeParam;
138
+ if (GroupType::kWidth == 16) {
139
+ ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted, CtrlT(3),
140
+ ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7),
141
+ CtrlT(7), CtrlT(5), CtrlT(3), CtrlT(1),
142
+ CtrlT(1), CtrlT(1), CtrlT(1), CtrlT(1)};
143
+ EXPECT_THAT(GroupType{group}.Match(0), ElementsAre());
144
+ EXPECT_THAT(GroupType{group}.Match(1), ElementsAre(1, 11, 12, 13, 14, 15));
145
+ EXPECT_THAT(GroupType{group}.Match(3), ElementsAre(3, 10));
146
+ EXPECT_THAT(GroupType{group}.Match(5), ElementsAre(5, 9));
147
+ EXPECT_THAT(GroupType{group}.Match(7), ElementsAre(7, 8));
148
+ } else if (GroupType::kWidth == 8) {
149
+ ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), CtrlT(2),
150
+ ctrl_t::kDeleted, CtrlT(2), CtrlT(1),
151
+ ctrl_t::kSentinel, CtrlT(1)};
152
+ EXPECT_THAT(GroupType{group}.Match(0), ElementsAre());
153
+ EXPECT_THAT(GroupType{group}.Match(1), ElementsAre(1, 5, 7));
154
+ EXPECT_THAT(GroupType{group}.Match(2), ElementsAre(2, 4));
155
+ } else {
156
+ FAIL() << "No test coverage for Group::kWidth==" << GroupType::kWidth;
157
+ }
158
+ }
159
+
160
+ TYPED_TEST(GroupTest, MaskEmpty) {
161
+ using GroupType = TypeParam;
162
+ if (GroupType::kWidth == 16) {
163
+ ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted, CtrlT(3),
164
+ ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7),
165
+ CtrlT(7), CtrlT(5), CtrlT(3), CtrlT(1),
166
+ CtrlT(1), CtrlT(1), CtrlT(1), CtrlT(1)};
167
+ EXPECT_THAT(GroupType{group}.MaskEmpty().LowestBitSet(), 0);
168
+ } else if (GroupType::kWidth == 8) {
169
+ ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), CtrlT(2),
170
+ ctrl_t::kDeleted, CtrlT(2), CtrlT(1),
171
+ ctrl_t::kSentinel, CtrlT(1)};
172
+ EXPECT_THAT(GroupType{group}.MaskEmpty().LowestBitSet(), 0);
173
+ } else {
174
+ FAIL() << "No test coverage for Group::kWidth==" << GroupType::kWidth;
175
+ }
176
+ }
177
+
178
+ TYPED_TEST(GroupTest, MaskFull) {
179
+ using GroupType = TypeParam;
180
+ if (GroupType::kWidth == 16) {
181
+ ctrl_t group[] = {
182
+ ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted, CtrlT(3),
183
+ ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7),
184
+ CtrlT(7), CtrlT(5), ctrl_t::kDeleted, CtrlT(1),
185
+ CtrlT(1), ctrl_t::kSentinel, ctrl_t::kEmpty, CtrlT(1)};
186
+ EXPECT_THAT(GroupType{group}.MaskFull(),
187
+ ElementsAre(1, 3, 5, 7, 8, 9, 11, 12, 15));
188
+ } else if (GroupType::kWidth == 8) {
189
+ ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kEmpty,
190
+ ctrl_t::kDeleted, CtrlT(2), ctrl_t::kSentinel,
191
+ ctrl_t::kSentinel, CtrlT(1)};
192
+ EXPECT_THAT(GroupType{group}.MaskFull(), ElementsAre(1, 4, 7));
193
+ } else {
194
+ FAIL() << "No test coverage for Group::kWidth==" << GroupType::kWidth;
195
+ }
196
+ }
197
+
198
+ TYPED_TEST(GroupTest, MaskNonFull) {
199
+ using GroupType = TypeParam;
200
+ if (GroupType::kWidth == 16) {
201
+ ctrl_t group[] = {
202
+ ctrl_t::kEmpty, CtrlT(1), ctrl_t::kDeleted, CtrlT(3),
203
+ ctrl_t::kEmpty, CtrlT(5), ctrl_t::kSentinel, CtrlT(7),
204
+ CtrlT(7), CtrlT(5), ctrl_t::kDeleted, CtrlT(1),
205
+ CtrlT(1), ctrl_t::kSentinel, ctrl_t::kEmpty, CtrlT(1)};
206
+ EXPECT_THAT(GroupType{group}.MaskNonFull(),
207
+ ElementsAre(0, 2, 4, 6, 10, 13, 14));
208
+ } else if (GroupType::kWidth == 8) {
209
+ ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kEmpty,
210
+ ctrl_t::kDeleted, CtrlT(2), ctrl_t::kSentinel,
211
+ ctrl_t::kSentinel, CtrlT(1)};
212
+ EXPECT_THAT(GroupType{group}.MaskNonFull(), ElementsAre(0, 2, 3, 5, 6));
213
+ } else {
214
+ FAIL() << "No test coverage for Group::kWidth==" << GroupType::kWidth;
215
+ }
216
+ }
217
+
218
+ TYPED_TEST(GroupTest, MaskEmptyOrDeleted) {
219
+ using GroupType = TypeParam;
220
+ if (GroupType::kWidth == 16) {
221
+ ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), ctrl_t::kEmpty, CtrlT(3),
222
+ ctrl_t::kDeleted, CtrlT(5), ctrl_t::kSentinel, CtrlT(7),
223
+ CtrlT(7), CtrlT(5), CtrlT(3), CtrlT(1),
224
+ CtrlT(1), CtrlT(1), CtrlT(1), CtrlT(1)};
225
+ EXPECT_THAT(GroupType{group}.MaskEmptyOrDeleted().LowestBitSet(), 0);
226
+ } else if (GroupType::kWidth == 8) {
227
+ ctrl_t group[] = {ctrl_t::kEmpty, CtrlT(1), CtrlT(2),
228
+ ctrl_t::kDeleted, CtrlT(2), CtrlT(1),
229
+ ctrl_t::kSentinel, CtrlT(1)};
230
+ EXPECT_THAT(GroupType{group}.MaskEmptyOrDeleted().LowestBitSet(), 0);
231
+ } else {
232
+ FAIL() << "No test coverage for Group::kWidth==" << GroupType::kWidth;
233
+ }
234
+ }
235
+
236
+ TYPED_TEST(GroupTest, MaskFullOrSentinel) {
237
+ using GroupType = TypeParam;
238
+ if (GroupType::kWidth == 16) {
239
+ ctrl_t group[] = {
240
+ ctrl_t::kEmpty, ctrl_t::kDeleted, ctrl_t::kEmpty, CtrlT(3),
241
+ ctrl_t::kDeleted, CtrlT(5), ctrl_t::kSentinel, ctrl_t::kEmpty,
242
+ ctrl_t::kEmpty, ctrl_t::kDeleted, ctrl_t::kDeleted, ctrl_t::kDeleted,
243
+ ctrl_t::kEmpty, ctrl_t::kDeleted, ctrl_t::kDeleted, ctrl_t::kDeleted,
244
+ };
245
+ EXPECT_THAT(GroupType{group}.MaskFullOrSentinel().LowestBitSet(), 3);
246
+ } else if (GroupType::kWidth == 8) {
247
+ ctrl_t group[] = {ctrl_t::kEmpty, ctrl_t::kDeleted, CtrlT(2),
248
+ ctrl_t::kDeleted, CtrlT(2), ctrl_t::kSentinel,
249
+ ctrl_t::kDeleted, ctrl_t::kEmpty};
250
+ EXPECT_THAT(GroupType{group}.MaskFullOrSentinel().LowestBitSet(), 2);
251
+ } else {
252
+ FAIL() << "No test coverage for Group::kWidth==" << GroupType::kWidth;
253
+ }
254
+ }
255
+
256
+ } // namespace
257
+ } // namespace container_internal
258
+ ABSL_NAMESPACE_END
259
+ } // namespace absl
@@ -42,10 +42,6 @@ namespace absl {
42
42
  ABSL_NAMESPACE_BEGIN
43
43
  namespace container_internal {
44
44
 
45
- #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
46
- constexpr int HashtablezInfo::kMaxStackDepth;
47
- #endif
48
-
49
45
  namespace {
50
46
  ABSL_CONST_INIT std::atomic<bool> g_hashtablez_enabled{
51
47
  false
@@ -98,8 +94,9 @@ void HashtablezInfo::PrepareForSampling(int64_t stride,
98
94
  // The inliner makes hardcoded skip_count difficult (especially when combined
99
95
  // with LTO). We use the ability to exclude stacks by regex when encoding
100
96
  // instead.
101
- depth = absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth,
102
- /* skip_count= */ 0);
97
+ depth = static_cast<unsigned>(
98
+ absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth,
99
+ /* skip_count= */ 0));
103
100
  inline_element_size = inline_element_size_value;
104
101
  key_size = key_size_value;
105
102
  value_size = value_size_value;
@@ -126,6 +123,26 @@ static bool ShouldForceSampling() {
126
123
  return state == kForce;
127
124
  }
128
125
 
126
+ #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
127
+ HashtablezInfoHandle ForcedTrySample(size_t inline_element_size,
128
+ size_t key_size, size_t value_size,
129
+ uint16_t soo_capacity) {
130
+ return HashtablezInfoHandle(SampleSlow(global_next_sample,
131
+ inline_element_size, key_size,
132
+ value_size, soo_capacity));
133
+ }
134
+ void TestOnlyRefreshSamplingStateForCurrentThread() {
135
+ global_next_sample.next_sample =
136
+ g_hashtablez_sample_parameter.load(std::memory_order_relaxed);
137
+ global_next_sample.sample_stride = global_next_sample.next_sample;
138
+ }
139
+ #else
140
+ HashtablezInfoHandle ForcedTrySample(size_t, size_t, size_t, uint16_t) {
141
+ return HashtablezInfoHandle{nullptr};
142
+ }
143
+ void TestOnlyRefreshSamplingStateForCurrentThread() {}
144
+ #endif // ABSL_INTERNAL_HASHTABLEZ_SAMPLE
145
+
129
146
  HashtablezInfo* SampleSlow(SamplingState& next_sample,
130
147
  size_t inline_element_size, size_t key_size,
131
148
  size_t value_size, uint16_t soo_capacity) {
@@ -97,7 +97,7 @@ struct HashtablezInfo : public profiling_internal::Sample<HashtablezInfo> {
97
97
  // the lock.
98
98
  static constexpr int kMaxStackDepth = 64;
99
99
  absl::Time create_time;
100
- int32_t depth;
100
+ uint32_t depth;
101
101
  // The SOO capacity for this table in elements (not bytes). Note that sampled
102
102
  // tables are never SOO because we need to store the infoz handle on the heap.
103
103
  // Tables that would be SOO if not sampled should have: soo_capacity > 0 &&
@@ -219,22 +219,41 @@ class HashtablezInfoHandle {
219
219
  extern ABSL_PER_THREAD_TLS_KEYWORD SamplingState global_next_sample;
220
220
  #endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
221
221
 
222
- // Returns a sampling handle.
223
- inline HashtablezInfoHandle Sample(
224
- ABSL_ATTRIBUTE_UNUSED size_t inline_element_size,
225
- ABSL_ATTRIBUTE_UNUSED size_t key_size,
226
- ABSL_ATTRIBUTE_UNUSED size_t value_size,
227
- ABSL_ATTRIBUTE_UNUSED uint16_t soo_capacity) {
222
+ // Returns true if the next table should be sampled.
223
+ // This function updates the global state.
224
+ // If the function returns true, actual sampling should be done by calling
225
+ // ForcedTrySample().
226
+ inline bool ShouldSampleNextTable() {
228
227
  #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
229
228
  if (ABSL_PREDICT_TRUE(--global_next_sample.next_sample > 0)) {
230
- return HashtablezInfoHandle(nullptr);
229
+ return false;
231
230
  }
232
- return HashtablezInfoHandle(SampleSlow(global_next_sample,
233
- inline_element_size, key_size,
234
- value_size, soo_capacity));
231
+ return true;
235
232
  #else
236
- return HashtablezInfoHandle(nullptr);
237
- #endif // !ABSL_PER_THREAD_TLS
233
+ return false;
234
+ #endif // ABSL_INTERNAL_HASHTABLEZ_SAMPLE
235
+ }
236
+
237
+ // Returns a sampling handle.
238
+ // Must be called only if HashSetShouldBeSampled() returned true.
239
+ // Returned handle still can be unsampled if sampling is not possible.
240
+ HashtablezInfoHandle ForcedTrySample(size_t inline_element_size,
241
+ size_t key_size, size_t value_size,
242
+ uint16_t soo_capacity);
243
+
244
+ // In case sampling needs to be disabled and re-enabled in tests, this function
245
+ // can be used to reset the sampling state for the current thread.
246
+ // It is useful to avoid sampling attempts and sampling delays in tests.
247
+ void TestOnlyRefreshSamplingStateForCurrentThread();
248
+
249
+ // Returns a sampling handle.
250
+ inline HashtablezInfoHandle Sample(size_t inline_element_size, size_t key_size,
251
+ size_t value_size, uint16_t soo_capacity) {
252
+ if (ABSL_PREDICT_TRUE(!ShouldSampleNextTable())) {
253
+ return HashtablezInfoHandle(nullptr);
254
+ }
255
+ return ForcedTrySample(inline_element_size, key_size, value_size,
256
+ soo_capacity);
238
257
  }
239
258
 
240
259
  using HashtablezSampler =
@@ -27,6 +27,7 @@
27
27
  #include "absl/base/attributes.h"
28
28
  #include "absl/base/config.h"
29
29
  #include "absl/profiling/internal/sample_recorder.h"
30
+ #include "absl/random/random.h"
30
31
  #include "absl/synchronization/blocking_counter.h"
31
32
  #include "absl/synchronization/internal/thread_pool.h"
32
33
  #include "absl/synchronization/mutex.h"
@@ -89,7 +90,7 @@ TEST(HashtablezInfoTest, PrepareForSampling) {
89
90
  const size_t test_value_size = 13;
90
91
 
91
92
  HashtablezInfo info;
92
- absl::MutexLock l(&info.init_mu);
93
+ absl::MutexLock l(info.init_mu);
93
94
  info.PrepareForSampling(test_stride, test_element_size,
94
95
  /*key_size=*/test_key_size,
95
96
  /*value_size=*/test_value_size,
@@ -147,7 +148,7 @@ TEST(HashtablezInfoTest, PrepareForSampling) {
147
148
 
148
149
  TEST(HashtablezInfoTest, RecordStorageChanged) {
149
150
  HashtablezInfo info;
150
- absl::MutexLock l(&info.init_mu);
151
+ absl::MutexLock l(info.init_mu);
151
152
  const int64_t test_stride = 21;
152
153
  const size_t test_element_size = 19;
153
154
  const size_t test_key_size = 17;
@@ -167,7 +168,7 @@ TEST(HashtablezInfoTest, RecordStorageChanged) {
167
168
 
168
169
  TEST(HashtablezInfoTest, RecordInsert) {
169
170
  HashtablezInfo info;
170
- absl::MutexLock l(&info.init_mu);
171
+ absl::MutexLock l(info.init_mu);
171
172
  const int64_t test_stride = 25;
172
173
  const size_t test_element_size = 23;
173
174
  const size_t test_key_size = 21;
@@ -202,7 +203,7 @@ TEST(HashtablezInfoTest, RecordErase) {
202
203
  const size_t test_value_size = 25;
203
204
 
204
205
  HashtablezInfo info;
205
- absl::MutexLock l(&info.init_mu);
206
+ absl::MutexLock l(info.init_mu);
206
207
  info.PrepareForSampling(test_stride, test_element_size,
207
208
  /*key_size=*/test_key_size,
208
209
  /*value_size=*/test_value_size,
@@ -226,7 +227,7 @@ TEST(HashtablezInfoTest, RecordRehash) {
226
227
  const size_t test_key_size = 29;
227
228
  const size_t test_value_size = 27;
228
229
  HashtablezInfo info;
229
- absl::MutexLock l(&info.init_mu);
230
+ absl::MutexLock l(info.init_mu);
230
231
  info.PrepareForSampling(test_stride, test_element_size,
231
232
  /*key_size=*/test_key_size,
232
233
  /*value_size=*/test_value_size,
@@ -258,7 +259,7 @@ TEST(HashtablezInfoTest, RecordRehash) {
258
259
 
259
260
  TEST(HashtablezInfoTest, RecordReservation) {
260
261
  HashtablezInfo info;
261
- absl::MutexLock l(&info.init_mu);
262
+ absl::MutexLock l(info.init_mu);
262
263
  const int64_t test_stride = 35;
263
264
  const size_t test_element_size = 33;
264
265
  const size_t test_key_size = 31;
@@ -439,8 +440,7 @@ TEST(HashtablezSamplerTest, MultiThreaded) {
439
440
  const size_t value_size = 13 + i % 5;
440
441
  pool.Schedule([&sampler, &stop, sampling_stride, elt_size, key_size,
441
442
  value_size]() {
442
- std::random_device rd;
443
- std::mt19937 gen(rd());
443
+ absl::InsecureBitGen gen;
444
444
 
445
445
  std::vector<HashtablezInfo*> infoz;
446
446
  while (!stop.HasBeenNotified()) {
@@ -73,11 +73,6 @@ using ConstReverseIterator = typename std::reverse_iterator<ConstIterator<A>>;
73
73
  template <typename A>
74
74
  using MoveIterator = typename std::move_iterator<Iterator<A>>;
75
75
 
76
- template <typename Iterator>
77
- using IsAtLeastForwardIterator = std::is_convertible<
78
- typename std::iterator_traits<Iterator>::iterator_category,
79
- std::forward_iterator_tag>;
80
-
81
76
  template <typename A>
82
77
  using IsMoveAssignOk = std::is_move_assignable<ValueType<A>>;
83
78
  template <typename A>
@@ -234,7 +229,7 @@ class AllocationTransaction {
234
229
  return result.data;
235
230
  }
236
231
 
237
- ABSL_MUST_USE_RESULT Allocation<A> Release() && {
232
+ [[nodiscard]] Allocation<A> Release() && {
238
233
  Allocation<A> result = {GetData(), GetCapacity()};
239
234
  Reset();
240
235
  return result;
@@ -548,7 +543,7 @@ class Storage {
548
543
  (std::max)(N, sizeof(Allocated) / sizeof(ValueType<A>));
549
544
 
550
545
  struct Inlined {
551
- alignas(ValueType<A>) char inlined_data[sizeof(
546
+ alignas(ValueType<A>) unsigned char inlined_data[sizeof(
552
547
  ValueType<A>[kOptimalInlinedSize])];
553
548
  };
554
549
 
@@ -192,7 +192,6 @@
192
192
  #include <typeinfo>
193
193
  #include <utility>
194
194
 
195
- #include "absl/base/attributes.h"
196
195
  #include "absl/base/config.h"
197
196
  #include "absl/debugging/internal/demangle.h"
198
197
  #include "absl/meta/type_traits.h"
@@ -316,9 +315,6 @@ std::string TypeName() {
316
315
 
317
316
  } // namespace adl_barrier
318
317
 
319
- template <bool C>
320
- using EnableIf = typename std::enable_if<C, int>::type;
321
-
322
318
  // Can `T` be a template argument of `Layout`?
323
319
  template <class T>
324
320
  using IsLegalElementType = std::integral_constant<
@@ -418,17 +414,16 @@ class LayoutImpl<
418
414
  // assert(x.Offset<1>() == 16); // The doubles starts from 16.
419
415
  //
420
416
  // Requires: `N <= NumSizes && N < sizeof...(Ts)`.
421
- template <size_t N, EnableIf<N == 0> = 0>
422
- constexpr size_t Offset() const {
423
- return 0;
424
- }
425
-
426
- template <size_t N, EnableIf<N != 0> = 0>
417
+ template <size_t N>
427
418
  constexpr size_t Offset() const {
428
- static_assert(N < NumOffsets, "Index out of bounds");
429
- return adl_barrier::Align(
430
- Offset<N - 1>() + SizeOf<ElementType<N - 1>>::value * Size<N - 1>(),
431
- ElementAlignment<N>::value);
419
+ if constexpr (N == 0) {
420
+ return 0;
421
+ } else {
422
+ static_assert(N < NumOffsets, "Index out of bounds");
423
+ return adl_barrier::Align(
424
+ Offset<N - 1>() + SizeOf<ElementType<N - 1>>::value * Size<N - 1>(),
425
+ ElementAlignment<N>::value);
426
+ }
432
427
  }
433
428
 
434
429
  // Offset in bytes of the array with the specified element type. There must
@@ -457,15 +452,14 @@ class LayoutImpl<
457
452
  // assert(x.Size<1>() == 4);
458
453
  //
459
454
  // Requires: `N < NumSizes`.
460
- template <size_t N, EnableIf<(N < NumStaticSizes)> = 0>
461
- constexpr size_t Size() const {
462
- return kStaticSizes[N];
463
- }
464
-
465
- template <size_t N, EnableIf<(N >= NumStaticSizes)> = 0>
455
+ template <size_t N>
466
456
  constexpr size_t Size() const {
467
- static_assert(N < NumSizes, "Index out of bounds");
468
- return size_[N - NumStaticSizes];
457
+ if constexpr (N < NumStaticSizes) {
458
+ return kStaticSizes[N];
459
+ } else {
460
+ static_assert(N < NumSizes, "Index out of bounds");
461
+ return size_[N - NumStaticSizes];
462
+ }
469
463
  }
470
464
 
471
465
  // The number of elements in the array with the specified element type.
@@ -596,10 +590,10 @@ class LayoutImpl<
596
590
  //
597
591
  // Requires: `p` is aligned to `Alignment()`.
598
592
  //
599
- // Note: We mark the parameter as unused because GCC detects it is not used
600
- // when `SizeSeq` is empty [-Werror=unused-but-set-parameter].
593
+ // Note: We mark the parameter as maybe_unused because GCC detects it is not
594
+ // used when `SizeSeq` is empty [-Werror=unused-but-set-parameter].
601
595
  template <class Char>
602
- auto Slices(ABSL_ATTRIBUTE_UNUSED Char* p) const {
596
+ auto Slices([[maybe_unused]] Char* p) const {
603
597
  return std::tuple<SliceType<CopyConst<Char, ElementType<SizeSeq>>>...>(
604
598
  Slice<SizeSeq>(p)...);
605
599
  }
@@ -624,15 +618,13 @@ class LayoutImpl<
624
618
  // `Char` must be `[const] [signed|unsigned] char`.
625
619
  //
626
620
  // Requires: `p` is aligned to `Alignment()`.
627
- template <class Char, size_t N = NumOffsets - 1, EnableIf<N == 0> = 0>
628
- void PoisonPadding(const Char* p) const {
629
- Pointer<0>(p); // verify the requirements on `Char` and `p`
630
- }
631
-
632
- template <class Char, size_t N = NumOffsets - 1, EnableIf<N != 0> = 0>
621
+ template <class Char, size_t N = NumOffsets - 1>
633
622
  void PoisonPadding(const Char* p) const {
634
- static_assert(N < NumOffsets, "Index out of bounds");
635
- (void)p;
623
+ if constexpr (N == 0) {
624
+ Pointer<0>(p); // verify the requirements on `Char` and `p`
625
+ } else {
626
+ static_assert(N < NumOffsets, "Index out of bounds");
627
+ (void)p;
636
628
  #ifdef ABSL_HAVE_ADDRESS_SANITIZER
637
629
  PoisonPadding<Char, N - 1>(p);
638
630
  // The `if` is an optimization. It doesn't affect the observable behaviour.
@@ -642,6 +634,7 @@ class LayoutImpl<
642
634
  ASAN_POISON_MEMORY_REGION(p + start, Offset<N>() - start);
643
635
  }
644
636
  #endif
637
+ }
645
638
  }
646
639
 
647
640
  // Human-readable description of the memory layout. Useful for debugging.
@@ -692,15 +685,6 @@ class LayoutImpl<
692
685
  size_t size_[NumRuntimeSizes > 0 ? NumRuntimeSizes : 1];
693
686
  };
694
687
 
695
- // Defining a constexpr static class member variable is redundant and deprecated
696
- // in C++17, but required in C++14.
697
- template <class... Elements, size_t... StaticSizeSeq, size_t... RuntimeSizeSeq,
698
- size_t... SizeSeq, size_t... OffsetSeq>
699
- constexpr std::array<size_t, sizeof...(StaticSizeSeq)> LayoutImpl<
700
- std::tuple<Elements...>, absl::index_sequence<StaticSizeSeq...>,
701
- absl::index_sequence<RuntimeSizeSeq...>, absl::index_sequence<SizeSeq...>,
702
- absl::index_sequence<OffsetSeq...>>::kStaticSizes;
703
-
704
688
  template <class StaticSizeSeq, size_t NumRuntimeSizes, class... Ts>
705
689
  using LayoutType = LayoutImpl<
706
690
  std::tuple<Ts...>, StaticSizeSeq,