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
@@ -15,10 +15,10 @@
15
15
  #include <cstdint>
16
16
  #include <vector>
17
17
 
18
- #include "benchmark/benchmark.h"
19
18
  #include "absl/base/optimization.h"
20
19
  #include "absl/numeric/bits.h"
21
20
  #include "absl/random/random.h"
21
+ #include "benchmark/benchmark.h"
22
22
 
23
23
  namespace absl {
24
24
  namespace {
@@ -14,6 +14,7 @@
14
14
 
15
15
  #include "absl/numeric/bits.h"
16
16
 
17
+ #include <cstdint>
17
18
  #include <limits>
18
19
  #include <type_traits>
19
20
 
@@ -25,16 +26,37 @@ namespace absl {
25
26
  ABSL_NAMESPACE_BEGIN
26
27
  namespace {
27
28
 
29
+ template <typename IntT>
30
+ class UnsignedIntegerTypesTest : public ::testing::Test {};
28
31
  template <typename IntT>
29
32
  class IntegerTypesTest : public ::testing::Test {};
30
33
 
34
+ using UnsignedIntegerTypes =
35
+ ::testing::Types<uint8_t, uint16_t, uint32_t, uint64_t>;
31
36
  using OneByteIntegerTypes = ::testing::Types<
32
37
  unsigned char,
33
38
  uint8_t
34
39
  >;
35
40
 
41
+ TYPED_TEST_SUITE(UnsignedIntegerTypesTest, UnsignedIntegerTypes);
36
42
  TYPED_TEST_SUITE(IntegerTypesTest, OneByteIntegerTypes);
37
43
 
44
+ TYPED_TEST(UnsignedIntegerTypesTest, ReturnTypes) {
45
+ using UIntType = TypeParam;
46
+
47
+ static_assert(std::is_same_v<decltype(byteswap(UIntType{0})), UIntType>);
48
+ static_assert(std::is_same_v<decltype(rotl(UIntType{0}, 0)), UIntType>);
49
+ static_assert(std::is_same_v<decltype(rotr(UIntType{0}, 0)), UIntType>);
50
+ static_assert(std::is_same_v<decltype(countl_zero(UIntType{0})), int>);
51
+ static_assert(std::is_same_v<decltype(countl_one(UIntType{0})), int>);
52
+ static_assert(std::is_same_v<decltype(countr_zero(UIntType{0})), int>);
53
+ static_assert(std::is_same_v<decltype(countr_one(UIntType{0})), int>);
54
+ static_assert(std::is_same_v<decltype(popcount(UIntType{0})), int>);
55
+ static_assert(std::is_same_v<decltype(bit_ceil(UIntType{0})), UIntType>);
56
+ static_assert(std::is_same_v<decltype(bit_floor(UIntType{0})), UIntType>);
57
+ static_assert(std::is_same_v<decltype(bit_width(UIntType{0})), int>);
58
+ }
59
+
38
60
  TYPED_TEST(IntegerTypesTest, HandlesTypes) {
39
61
  using UIntType = TypeParam;
40
62
 
@@ -129,6 +151,9 @@ TEST(Rotate, Left) {
129
151
  EXPECT_EQ(rotl(uint32_t{0x12345678UL}, -4), uint32_t{0x81234567UL});
130
152
  EXPECT_EQ(rotl(uint64_t{0x12345678ABCDEF01ULL}, -4),
131
153
  uint64_t{0x112345678ABCDEF0ULL});
154
+
155
+ EXPECT_EQ(rotl(uint32_t{1234}, std::numeric_limits<int>::min()),
156
+ uint32_t{1234});
132
157
  }
133
158
 
134
159
  TEST(Rotate, Right) {
@@ -168,6 +193,9 @@ TEST(Rotate, Right) {
168
193
  EXPECT_EQ(rotr(uint32_t{0x12345678UL}, -4), uint32_t{0x23456781UL});
169
194
  EXPECT_EQ(rotr(uint64_t{0x12345678ABCDEF01ULL}, -4),
170
195
  uint64_t{0x2345678ABCDEF011ULL});
196
+
197
+ EXPECT_EQ(rotl(uint32_t{1234}, std::numeric_limits<int>::min()),
198
+ uint32_t{1234});
171
199
  }
172
200
 
173
201
  TEST(Rotate, Symmetry) {
@@ -636,6 +664,61 @@ static_assert(ABSL_INTERNAL_HAS_CONSTEXPR_CLZ, "clz should be constexpr");
636
664
  static_assert(ABSL_INTERNAL_HAS_CONSTEXPR_CTZ, "ctz should be constexpr");
637
665
  #endif
638
666
 
667
+ TEST(Endian, Comparison) {
668
+ #if defined(ABSL_IS_LITTLE_ENDIAN)
669
+ static_assert(absl::endian::native == absl::endian::little);
670
+ static_assert(absl::endian::native != absl::endian::big);
671
+ #endif
672
+ #if defined(ABSL_IS_BIG_ENDIAN)
673
+ static_assert(absl::endian::native != absl::endian::little);
674
+ static_assert(absl::endian::native == absl::endian::big);
675
+ #endif
676
+ }
677
+
678
+ TEST(Byteswap, Constexpr) {
679
+ static_assert(absl::byteswap<int8_t>(0x12) == 0x12);
680
+ static_assert(absl::byteswap<int16_t>(0x1234) == 0x3412);
681
+ static_assert(absl::byteswap<int32_t>(0x12345678) == 0x78563412);
682
+ static_assert(absl::byteswap<int64_t>(0x123456789abcdef0) ==
683
+ static_cast<int64_t>(0xf0debc9a78563412));
684
+ static_assert(absl::byteswap<uint8_t>(0x21) == 0x21);
685
+ static_assert(absl::byteswap<uint16_t>(0x4321) == 0x2143);
686
+ static_assert(absl::byteswap<uint32_t>(0x87654321) == 0x21436587);
687
+ static_assert(absl::byteswap<uint64_t>(0xfedcba9876543210) ==
688
+ static_cast<uint64_t>(0x1032547698badcfe));
689
+ static_assert(absl::byteswap<int32_t>(static_cast<int32_t>(0xdeadbeef)) ==
690
+ static_cast<int32_t>(0xefbeadde));
691
+ }
692
+
693
+ TEST(Byteswap, NotConstexpr) {
694
+ int8_t a = 0x12;
695
+ int16_t b = 0x1234;
696
+ int32_t c = 0x12345678;
697
+ int64_t d = 0x123456789abcdef0;
698
+ uint8_t e = 0x21;
699
+ uint16_t f = 0x4321;
700
+ uint32_t g = 0x87654321;
701
+ uint64_t h = 0xfedcba9876543210;
702
+ EXPECT_EQ(absl::byteswap<int8_t>(a), 0x12);
703
+ EXPECT_EQ(absl::byteswap<int16_t>(b), 0x3412);
704
+ EXPECT_EQ(absl::byteswap(c), 0x78563412);
705
+ EXPECT_EQ(absl::byteswap(d), 0xf0debc9a78563412);
706
+ EXPECT_EQ(absl::byteswap<uint8_t>(e), 0x21);
707
+ EXPECT_EQ(absl::byteswap<uint16_t>(f), 0x2143);
708
+ EXPECT_EQ(absl::byteswap(g), 0x21436587);
709
+ EXPECT_EQ(absl::byteswap(h), 0x1032547698badcfe);
710
+ EXPECT_EQ(absl::byteswap(absl::byteswap<int8_t>(a)), a);
711
+ EXPECT_EQ(absl::byteswap(absl::byteswap<int16_t>(b)), b);
712
+ EXPECT_EQ(absl::byteswap(absl::byteswap(c)), c);
713
+ EXPECT_EQ(absl::byteswap(absl::byteswap(d)), d);
714
+ EXPECT_EQ(absl::byteswap(absl::byteswap<uint8_t>(e)), e);
715
+ EXPECT_EQ(absl::byteswap(absl::byteswap<uint16_t>(f)), f);
716
+ EXPECT_EQ(absl::byteswap(absl::byteswap(g)), g);
717
+ EXPECT_EQ(absl::byteswap(absl::byteswap(h)), h);
718
+ EXPECT_EQ(absl::byteswap<uint32_t>(0xdeadbeef), 0xefbeadde);
719
+ EXPECT_EQ(absl::byteswap<const uint32_t>(0xdeadbeef), 0xefbeadde);
720
+ }
721
+
639
722
  } // namespace
640
723
  ABSL_NAMESPACE_END
641
724
  } // namespace absl
@@ -342,55 +342,3 @@ std::ostream& operator<<(std::ostream& os, int128 v) {
342
342
 
343
343
  ABSL_NAMESPACE_END
344
344
  } // namespace absl
345
-
346
- #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
347
- namespace std {
348
- constexpr bool numeric_limits<absl::uint128>::is_specialized;
349
- constexpr bool numeric_limits<absl::uint128>::is_signed;
350
- constexpr bool numeric_limits<absl::uint128>::is_integer;
351
- constexpr bool numeric_limits<absl::uint128>::is_exact;
352
- constexpr bool numeric_limits<absl::uint128>::has_infinity;
353
- constexpr bool numeric_limits<absl::uint128>::has_quiet_NaN;
354
- constexpr bool numeric_limits<absl::uint128>::has_signaling_NaN;
355
- constexpr float_denorm_style numeric_limits<absl::uint128>::has_denorm;
356
- constexpr bool numeric_limits<absl::uint128>::has_denorm_loss;
357
- constexpr float_round_style numeric_limits<absl::uint128>::round_style;
358
- constexpr bool numeric_limits<absl::uint128>::is_iec559;
359
- constexpr bool numeric_limits<absl::uint128>::is_bounded;
360
- constexpr bool numeric_limits<absl::uint128>::is_modulo;
361
- constexpr int numeric_limits<absl::uint128>::digits;
362
- constexpr int numeric_limits<absl::uint128>::digits10;
363
- constexpr int numeric_limits<absl::uint128>::max_digits10;
364
- constexpr int numeric_limits<absl::uint128>::radix;
365
- constexpr int numeric_limits<absl::uint128>::min_exponent;
366
- constexpr int numeric_limits<absl::uint128>::min_exponent10;
367
- constexpr int numeric_limits<absl::uint128>::max_exponent;
368
- constexpr int numeric_limits<absl::uint128>::max_exponent10;
369
- constexpr bool numeric_limits<absl::uint128>::traps;
370
- constexpr bool numeric_limits<absl::uint128>::tinyness_before;
371
-
372
- constexpr bool numeric_limits<absl::int128>::is_specialized;
373
- constexpr bool numeric_limits<absl::int128>::is_signed;
374
- constexpr bool numeric_limits<absl::int128>::is_integer;
375
- constexpr bool numeric_limits<absl::int128>::is_exact;
376
- constexpr bool numeric_limits<absl::int128>::has_infinity;
377
- constexpr bool numeric_limits<absl::int128>::has_quiet_NaN;
378
- constexpr bool numeric_limits<absl::int128>::has_signaling_NaN;
379
- constexpr float_denorm_style numeric_limits<absl::int128>::has_denorm;
380
- constexpr bool numeric_limits<absl::int128>::has_denorm_loss;
381
- constexpr float_round_style numeric_limits<absl::int128>::round_style;
382
- constexpr bool numeric_limits<absl::int128>::is_iec559;
383
- constexpr bool numeric_limits<absl::int128>::is_bounded;
384
- constexpr bool numeric_limits<absl::int128>::is_modulo;
385
- constexpr int numeric_limits<absl::int128>::digits;
386
- constexpr int numeric_limits<absl::int128>::digits10;
387
- constexpr int numeric_limits<absl::int128>::max_digits10;
388
- constexpr int numeric_limits<absl::int128>::radix;
389
- constexpr int numeric_limits<absl::int128>::min_exponent;
390
- constexpr int numeric_limits<absl::int128>::min_exponent10;
391
- constexpr int numeric_limits<absl::int128>::max_exponent;
392
- constexpr int numeric_limits<absl::int128>::max_exponent10;
393
- constexpr bool numeric_limits<absl::int128>::traps;
394
- constexpr bool numeric_limits<absl::int128>::tinyness_before;
395
- } // namespace std
396
- #endif
@@ -13,31 +13,29 @@
13
13
  // limitations under the License.
14
14
 
15
15
  #include <algorithm>
16
+ #include <cstddef>
16
17
  #include <cstdint>
17
18
  #include <limits>
18
19
  #include <random>
20
+ #include <type_traits>
21
+ #include <utility>
19
22
  #include <vector>
20
23
 
21
- #include "benchmark/benchmark.h"
22
24
  #include "absl/base/config.h"
23
25
  #include "absl/numeric/int128.h"
26
+ #include "absl/random/random.h"
27
+ #include "benchmark/benchmark.h"
24
28
 
25
29
  namespace {
26
30
 
27
31
  constexpr size_t kSampleSize = 1000000;
28
32
 
29
- std::mt19937 MakeRandomEngine() {
30
- std::random_device r;
31
- std::seed_seq seed({r(), r(), r(), r(), r(), r(), r(), r()});
32
- return std::mt19937(seed);
33
- }
34
-
35
33
  template <typename T,
36
34
  typename H = typename std::conditional<
37
35
  std::numeric_limits<T>::is_signed, int64_t, uint64_t>::type>
38
36
  std::vector<std::pair<T, T>> GetRandomClass128SampleUniformDivisor() {
39
37
  std::vector<std::pair<T, T>> values;
40
- std::mt19937 random = MakeRandomEngine();
38
+ absl::InsecureBitGen random;
41
39
  std::uniform_int_distribution<H> uniform_h;
42
40
  values.reserve(kSampleSize);
43
41
  for (size_t i = 0; i < kSampleSize; ++i) {
@@ -77,7 +75,7 @@ template <typename T,
77
75
  std::numeric_limits<T>::is_signed, int64_t, uint64_t>::type>
78
76
  std::vector<std::pair<T, H>> GetRandomClass128SampleSmallDivisor() {
79
77
  std::vector<std::pair<T, H>> values;
80
- std::mt19937 random = MakeRandomEngine();
78
+ absl::InsecureBitGen random;
81
79
  std::uniform_int_distribution<H> uniform_h;
82
80
  values.reserve(kSampleSize);
83
81
  for (size_t i = 0; i < kSampleSize; ++i) {
@@ -114,7 +112,7 @@ BENCHMARK_TEMPLATE(BM_RemainderClass128SmallDivisor, absl::int128);
114
112
 
115
113
  std::vector<std::pair<absl::uint128, absl::uint128>> GetRandomClass128Sample() {
116
114
  std::vector<std::pair<absl::uint128, absl::uint128>> values;
117
- std::mt19937 random = MakeRandomEngine();
115
+ absl::InsecureBitGen random;
118
116
  std::uniform_int_distribution<uint64_t> uniform_uint64;
119
117
  values.reserve(kSampleSize);
120
118
  for (size_t i = 0; i < kSampleSize; ++i) {
@@ -155,7 +153,8 @@ template <typename T,
155
153
  class UniformIntDistribution128 {
156
154
  public:
157
155
  // NOLINTNEXTLINE: mimicking std::uniform_int_distribution API
158
- T operator()(std::mt19937& generator) {
156
+ template <class URBG>
157
+ T operator()(URBG& generator) {
159
158
  return (static_cast<T>(dist64_(generator)) << 64) | dist64_(generator);
160
159
  }
161
160
 
@@ -168,7 +167,7 @@ template <typename T,
168
167
  std::is_same<T, __int128>::value, int64_t, uint64_t>::type>
169
168
  std::vector<std::pair<T, T>> GetRandomIntrinsic128SampleUniformDivisor() {
170
169
  std::vector<std::pair<T, T>> values;
171
- std::mt19937 random = MakeRandomEngine();
170
+ absl::InsecureBitGen random;
172
171
  UniformIntDistribution128<T> uniform_128;
173
172
  values.reserve(kSampleSize);
174
173
  for (size_t i = 0; i < kSampleSize; ++i) {
@@ -209,7 +208,7 @@ template <typename T,
209
208
  std::is_same<T, __int128>::value, int64_t, uint64_t>::type>
210
209
  std::vector<std::pair<T, H>> GetRandomIntrinsic128SampleSmallDivisor() {
211
210
  std::vector<std::pair<T, H>> values;
212
- std::mt19937 random = MakeRandomEngine();
211
+ absl::InsecureBitGen random;
213
212
  UniformIntDistribution128<T> uniform_int128;
214
213
  std::uniform_int_distribution<H> uniform_int64;
215
214
  values.reserve(kSampleSize);
@@ -246,9 +245,9 @@ BENCHMARK_TEMPLATE(BM_RemainderIntrinsic128SmallDivisor, unsigned __int128);
246
245
  BENCHMARK_TEMPLATE(BM_RemainderIntrinsic128SmallDivisor, __int128);
247
246
 
248
247
  std::vector<std::pair<unsigned __int128, unsigned __int128>>
249
- GetRandomIntrinsic128Sample() {
248
+ GetRandomIntrinsic128Sample() {
250
249
  std::vector<std::pair<unsigned __int128, unsigned __int128>> values;
251
- std::mt19937 random = MakeRandomEngine();
250
+ absl::InsecureBitGen random;
252
251
  UniformIntDistribution128<unsigned __int128> uniform_uint128;
253
252
  values.reserve(kSampleSize);
254
253
  for (size_t i = 0; i < kSampleSize; ++i) {
@@ -1273,19 +1273,24 @@ TEST(Int128, BitwiseShiftTest) {
1273
1273
  }
1274
1274
  }
1275
1275
 
1276
+ // Signed integer overflow is undefined behavior, so in these cases enough
1277
+ // high bits must be zero to avoid over-shifting.
1278
+ EXPECT_EQ(MAKE_INT128(0x0, 0x123456789abcdef0) << 63,
1279
+ MAKE_INT128(0x91a2b3c4d5e6f78, 0x0));
1280
+ EXPECT_EQ(MAKE_INT128(0x0, 0x123456789abcdef0) << 64,
1281
+ MAKE_INT128(0x123456789abcdef0, 0x0));
1282
+ EXPECT_EQ(MAKE_INT128(0x1, 0xfedcba0987654321) << 63,
1283
+ MAKE_INT128(0xff6e5d04c3b2a190, 0x8000000000000000));
1284
+ EXPECT_EQ(MAKE_INT128(0x0, 0xfedcba0987654321) << 64,
1285
+ MAKE_INT128(0xfedcba0987654321, 0x0));
1286
+ EXPECT_EQ(MAKE_INT128(0x0, 0x0) << 126, MAKE_INT128(0x0, 0x0));
1287
+ EXPECT_EQ(MAKE_INT128(0x0, 0x1) << 126, MAKE_INT128(0x4000000000000000, 0x0));
1288
+
1276
1289
  // Manually calculated cases with shift count for positive (val1) and negative
1277
1290
  // (val2) values
1278
1291
  absl::int128 val1 = MAKE_INT128(0x123456789abcdef0, 0x123456789abcdef0);
1279
1292
  absl::int128 val2 = MAKE_INT128(0xfedcba0987654321, 0xfedcba0987654321);
1280
1293
 
1281
- EXPECT_EQ(val1 << 63, MAKE_INT128(0x91a2b3c4d5e6f78, 0x0));
1282
- EXPECT_EQ(val1 << 64, MAKE_INT128(0x123456789abcdef0, 0x0));
1283
- EXPECT_EQ(val2 << 63, MAKE_INT128(0xff6e5d04c3b2a190, 0x8000000000000000));
1284
- EXPECT_EQ(val2 << 64, MAKE_INT128(0xfedcba0987654321, 0x0));
1285
-
1286
- EXPECT_EQ(val1 << 126, MAKE_INT128(0x0, 0x0));
1287
- EXPECT_EQ(val2 << 126, MAKE_INT128(0x4000000000000000, 0x0));
1288
-
1289
1294
  EXPECT_EQ(val1 >> 63, MAKE_INT128(0x0, 0x2468acf13579bde0));
1290
1295
  EXPECT_EQ(val1 >> 64, MAKE_INT128(0x0, 0x123456789abcdef0));
1291
1296
  EXPECT_EQ(val2 >> 63, MAKE_INT128(0xffffffffffffffff, 0xfdb974130eca8643));
@@ -71,25 +71,53 @@ constexpr bool IsPowerOf2(unsigned int x) noexcept {
71
71
  }
72
72
 
73
73
  template <class T>
74
- ABSL_MUST_USE_RESULT ABSL_ATTRIBUTE_ALWAYS_INLINE constexpr T RotateRight(
74
+ [[nodiscard]] ABSL_ATTRIBUTE_ALWAYS_INLINE constexpr T RotateRight(
75
75
  T x, int s) noexcept {
76
76
  static_assert(std::is_unsigned<T>::value, "T must be unsigned");
77
77
  static_assert(IsPowerOf2(std::numeric_limits<T>::digits),
78
78
  "T must have a power-of-2 size");
79
79
 
80
- return static_cast<T>(x >> (s & (std::numeric_limits<T>::digits - 1))) |
81
- static_cast<T>(x << ((-s) & (std::numeric_limits<T>::digits - 1)));
80
+ // Rotate by s mod the number of digits to avoid unnecessary rotations.
81
+ //
82
+ // A negative s represents a left rotation instead of a right rotation.
83
+ // We compute it as an equivalent complementary right rotation by leveraging
84
+ // its two's complement representation.
85
+ //
86
+ // For example, suppose we rotate a 3-bit number by -2.
87
+ // In that case:
88
+ // * s = 0b11111111111111111111111111111110
89
+ // * n = 8
90
+ // * r = (0b11111111111111111111111111111110 & 0b111) = 0b110
91
+ //
92
+ // Instead of rotating by 2 to the left, we rotate by 6 to the right, which
93
+ // is equivalent.
94
+ const int n = std::numeric_limits<T>::digits;
95
+ const int r = s & (n - 1);
96
+
97
+ if (r == 0) {
98
+ return x;
99
+ } else {
100
+ return (x >> r) | (x << (n - r));
101
+ }
82
102
  }
83
103
 
84
104
  template <class T>
85
- ABSL_MUST_USE_RESULT ABSL_ATTRIBUTE_ALWAYS_INLINE constexpr T RotateLeft(
105
+ [[nodiscard]] ABSL_ATTRIBUTE_ALWAYS_INLINE constexpr T RotateLeft(
86
106
  T x, int s) noexcept {
87
107
  static_assert(std::is_unsigned<T>::value, "T must be unsigned");
88
108
  static_assert(IsPowerOf2(std::numeric_limits<T>::digits),
89
109
  "T must have a power-of-2 size");
90
110
 
91
- return static_cast<T>(x << (s & (std::numeric_limits<T>::digits - 1))) |
92
- static_cast<T>(x >> ((-s) & (std::numeric_limits<T>::digits - 1)));
111
+ // Rotate by s mod the number of digits to avoid unnecessary rotations.
112
+ // See comment in RotateRight for a detailed explanation of the logic below.
113
+ const int n = std::numeric_limits<T>::digits;
114
+ const int r = s & (n - 1);
115
+
116
+ if (r == 0) {
117
+ return x;
118
+ } else {
119
+ return (x << r) | (x >> (n - r));
120
+ }
93
121
  }
94
122
 
95
123
  ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_POPCOUNT inline int
@@ -126,7 +154,11 @@ Popcount(T x) noexcept {
126
154
  static_assert(IsPowerOf2(std::numeric_limits<T>::digits),
127
155
  "T must have a power-of-2 size");
128
156
  static_assert(sizeof(x) <= sizeof(uint64_t), "T is too large");
129
- return sizeof(x) <= sizeof(uint32_t) ? Popcount32(x) : Popcount64(x);
157
+ if constexpr (sizeof(x) <= sizeof(uint32_t)) {
158
+ return Popcount32(x);
159
+ } else {
160
+ return Popcount64(x);
161
+ }
130
162
  }
131
163
 
132
164
  ABSL_ATTRIBUTE_ALWAYS_INLINE ABSL_INTERNAL_CONSTEXPR_CLZ inline int
@@ -12,6 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
16
+ load("@rules_cc//cc:cc_library.bzl", "cc_library")
17
+ load("@rules_cc//cc:cc_test.bzl", "cc_test")
15
18
  load(
16
19
  "//absl:copts/configure_copts.bzl",
17
20
  "ABSL_DEFAULT_COPTS",
@@ -49,6 +52,7 @@ cc_library(
49
52
  cc_test(
50
53
  name = "sample_recorder_test",
51
54
  srcs = ["internal/sample_recorder_test.cc"],
55
+ copts = ABSL_TEST_COPTS,
52
56
  linkopts = ABSL_DEFAULT_LINKOPTS,
53
57
  tags = [
54
58
  "no_test_wasm",
@@ -56,6 +60,7 @@ cc_test(
56
60
  deps = [
57
61
  ":sample_recorder",
58
62
  "//absl/base:core_headers",
63
+ "//absl/random",
59
64
  "//absl/synchronization",
60
65
  "//absl/synchronization:thread_pool",
61
66
  "//absl/time",
@@ -68,6 +73,7 @@ cc_library(
68
73
  name = "exponential_biased",
69
74
  srcs = ["internal/exponential_biased.cc"],
70
75
  hdrs = ["internal/exponential_biased.h"],
76
+ copts = ABSL_DEFAULT_COPTS,
71
77
  linkopts = ABSL_DEFAULT_LINKOPTS,
72
78
  visibility = [
73
79
  "//absl:__subpackages__",
@@ -138,3 +144,44 @@ cc_binary(
138
144
  "@google_benchmark//:benchmark_main",
139
145
  ],
140
146
  )
147
+
148
+ cc_library(
149
+ name = "profile_builder",
150
+ srcs = ["internal/profile_builder.cc"],
151
+ hdrs = ["internal/profile_builder.h"],
152
+ copts = ABSL_DEFAULT_COPTS,
153
+ linkopts = ABSL_DEFAULT_LINKOPTS,
154
+ visibility = [
155
+ "//absl:__subpackages__",
156
+ ],
157
+ deps = [
158
+ "//absl/base",
159
+ "//absl/base:config",
160
+ "//absl/base:raw_logging_internal",
161
+ "//absl/container:btree",
162
+ "//absl/container:flat_hash_map",
163
+ "//absl/strings",
164
+ "//absl/types:span",
165
+ ],
166
+ )
167
+
168
+ cc_library(
169
+ name = "hashtable",
170
+ srcs = ["hashtable.cc"],
171
+ hdrs = ["hashtable.h"],
172
+ copts = ABSL_DEFAULT_COPTS,
173
+ linkopts = ABSL_DEFAULT_LINKOPTS,
174
+ visibility = [
175
+ "//absl:__subpackages__",
176
+ ],
177
+ deps = [
178
+ ":profile_builder",
179
+ "//absl/base:config",
180
+ "//absl/container:hashtablez_sampler",
181
+ "//absl/status:statusor",
182
+ "//absl/strings",
183
+ "//absl/strings:string_view",
184
+ "//absl/time",
185
+ "//absl/types:span",
186
+ ],
187
+ )
@@ -32,6 +32,7 @@ absl_cc_test(
32
32
  COPTS
33
33
  ${ABSL_TEST_COPTS}
34
34
  DEPS
35
+ absl::random_random
35
36
  absl::sample_recorder
36
37
  absl::time
37
38
  GTest::gmock_main
@@ -91,3 +92,40 @@ absl_cc_test(
91
92
  GTest::gmock_main
92
93
  )
93
94
 
95
+ # Internal-only target, do not depend on directly
96
+ absl_cc_library(
97
+ NAME
98
+ profile_builder
99
+ HDRS
100
+ "internal/profile_builder.h"
101
+ SRCS
102
+ "internal/profile_builder.cc"
103
+ COPTS
104
+ ${ABSL_DEFAULT_COPTS}
105
+ DEPS
106
+ absl::config
107
+ absl::core_headers
108
+ absl::raw_logging_internal
109
+ absl::flat_hash_map
110
+ absl::btree
111
+ absl::strings
112
+ absl::span
113
+ )
114
+
115
+ absl_cc_library(
116
+ NAME
117
+ hashtable_profiler
118
+ HDRS
119
+ "hashtable.h"
120
+ SRCS
121
+ "hashtable.cc"
122
+ COPTS
123
+ ${ABSL_DEFAULT_COPTS}
124
+ DEPS
125
+ absl::profile_builder
126
+ absl::config
127
+ absl::core_headers
128
+ absl::strings
129
+ absl::span
130
+ absl::hashtablez_sampler
131
+ )
@@ -0,0 +1,124 @@
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
6
+ // obtain a copy of the License at
7
+ //
8
+ // https://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+
16
+ #include "absl/profiling/hashtable.h"
17
+
18
+ #include <atomic>
19
+ #include <cstddef>
20
+ #include <cstdint>
21
+ #include <string>
22
+ #include <utility>
23
+ #include <vector>
24
+
25
+ #include "absl/base/config.h"
26
+ #include "absl/container/internal/hashtablez_sampler.h"
27
+ #include "absl/profiling/internal/profile_builder.h"
28
+ #include "absl/status/statusor.h"
29
+ #include "absl/strings/str_cat.h"
30
+ #include "absl/strings/string_view.h"
31
+ #include "absl/time/clock.h"
32
+ #include "absl/time/time.h"
33
+ #include "absl/types/span.h"
34
+
35
+ namespace absl {
36
+ ABSL_NAMESPACE_BEGIN
37
+
38
+ StatusOr<std::string> MarshalHashtableProfile() {
39
+ return debugging_internal::MarshalHashtableProfile(
40
+ container_internal::GlobalHashtablezSampler(), Now());
41
+ }
42
+
43
+ namespace debugging_internal {
44
+
45
+ StatusOr<std::string> MarshalHashtableProfile(
46
+ container_internal::HashtablezSampler& sampler, Time now) {
47
+ static constexpr absl::string_view kDropFrames =
48
+ "(::)?absl::container_internal::.*|"
49
+ "(::)?absl::(flat|node)_hash_(map|set).*";
50
+
51
+ ProfileBuilder builder;
52
+ StringId drop_frames_id = builder.InternString(kDropFrames);
53
+ builder.set_drop_frames_id(drop_frames_id);
54
+ builder.AddSampleType(builder.InternString("capacity"),
55
+ builder.InternString("count"));
56
+ builder.set_default_sample_type_id(builder.InternString("capacity"));
57
+
58
+ const auto capacity_id = builder.InternString("capacity");
59
+ const auto size_id = builder.InternString("size");
60
+ const auto num_erases_id = builder.InternString("num_erases");
61
+ const auto num_rehashes_id = builder.InternString("num_rehashes");
62
+ const auto max_probe_length_id = builder.InternString("max_probe_length");
63
+ const auto total_probe_length_id = builder.InternString("total_probe_length");
64
+ const auto stuck_bits_id = builder.InternString("stuck_bits");
65
+ const auto inline_element_size_id =
66
+ builder.InternString("inline_element_size");
67
+ const auto key_size_id = builder.InternString("key_size");
68
+ const auto value_size_id = builder.InternString("value_size");
69
+ const auto soo_capacity_id = builder.InternString("soo_capacity");
70
+ const auto checksum_id = builder.InternString("checksum");
71
+ const auto table_age_id = builder.InternString("table_age");
72
+ const auto max_reserve_id = builder.InternString("max_reserve");
73
+
74
+ size_t dropped =
75
+ sampler.Iterate([&](const container_internal::HashtablezInfo& info) {
76
+ const size_t capacity = info.capacity.load(std::memory_order_relaxed);
77
+ std::vector<std::pair<StringId, int64_t>> labels;
78
+
79
+ auto add_label = [&](StringId tag, uint64_t value) {
80
+ if (value == 0) {
81
+ return;
82
+ }
83
+ labels.emplace_back(tag, static_cast<int64_t>(value));
84
+ };
85
+
86
+ add_label(capacity_id, capacity);
87
+ add_label(size_id, info.size.load(std::memory_order_relaxed));
88
+ add_label(num_erases_id,
89
+ info.num_erases.load(std::memory_order_relaxed));
90
+ add_label(num_rehashes_id,
91
+ info.num_rehashes.load(std::memory_order_relaxed));
92
+ add_label(max_probe_length_id,
93
+ info.max_probe_length.load(std::memory_order_relaxed));
94
+ add_label(total_probe_length_id,
95
+ info.total_probe_length.load(std::memory_order_relaxed));
96
+ add_label(stuck_bits_id,
97
+ (info.hashes_bitwise_and.load(std::memory_order_relaxed) |
98
+ ~info.hashes_bitwise_or.load(std::memory_order_relaxed)));
99
+ add_label(inline_element_size_id, info.inline_element_size);
100
+ add_label(key_size_id, info.key_size);
101
+ add_label(value_size_id, info.value_size);
102
+ add_label(soo_capacity_id, info.soo_capacity);
103
+ add_label(checksum_id,
104
+ info.hashes_bitwise_xor.load(std::memory_order_relaxed));
105
+ add_label(
106
+ table_age_id,
107
+ static_cast<uint64_t>(ToInt64Microseconds(now - info.create_time)));
108
+ add_label(max_reserve_id,
109
+ info.max_reserve.load(std::memory_order_relaxed));
110
+ builder.AddSample(static_cast<int64_t>(capacity) * info.weight,
111
+ MakeSpan(info.stack, info.depth), labels);
112
+ });
113
+
114
+ // TODO(b/262310142): Make this more structured data.
115
+ StringId comment_id =
116
+ builder.InternString(StrCat("dropped_samples: ", dropped));
117
+ builder.set_comment_id(comment_id);
118
+ builder.AddCurrentMappings();
119
+ return std::move(builder).Emit();
120
+ }
121
+
122
+ } // namespace debugging_internal
123
+ ABSL_NAMESPACE_END
124
+ } // namespace absl