re2 1.24.0 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/LICENSE +15 -20
  2. package/README.md +63 -4
  3. package/binding.gyp +1 -2
  4. package/lib/addon.cc +9 -5
  5. package/lib/exec.cc +4 -4
  6. package/lib/match.cc +4 -4
  7. package/lib/new.cc +6 -6
  8. package/lib/pattern.cc +148 -1
  9. package/lib/replace.cc +5 -4
  10. package/lib/search.cc +1 -1
  11. package/lib/set.cc +85 -10
  12. package/lib/test.cc +1 -1
  13. package/lib/unicode_properties.h +15840 -0
  14. package/lib/wrapped_re2.h +40 -4
  15. package/lib/wrapped_re2_set.h +3 -1
  16. package/llms-full.txt +497 -0
  17. package/llms.txt +135 -0
  18. package/package.json +19 -11
  19. package/re2.d.ts +2 -0
  20. package/re2.js +1 -0
  21. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +87 -74
  22. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  23. package/vendor/abseil-cpp/FAQ.md +130 -79
  24. package/vendor/abseil-cpp/MODULE.bazel +6 -7
  25. package/vendor/abseil-cpp/absl/BUILD.bazel +6 -0
  26. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +4 -0
  27. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +4 -0
  28. package/vendor/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  29. package/vendor/abseil-cpp/absl/algorithm/container.h +164 -17
  30. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +390 -13
  31. package/vendor/abseil-cpp/absl/base/BUILD.bazel +53 -6
  32. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +28 -4
  33. package/vendor/abseil-cpp/absl/base/attributes.h +61 -42
  34. package/vendor/abseil-cpp/absl/base/call_once.h +1 -0
  35. package/vendor/abseil-cpp/absl/base/casts.h +8 -1
  36. package/vendor/abseil-cpp/absl/base/casts_test.cc +3 -6
  37. package/vendor/abseil-cpp/absl/base/config.h +53 -9
  38. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +9 -9
  39. package/vendor/abseil-cpp/absl/base/fast_type_id.h +30 -2
  40. package/vendor/abseil-cpp/absl/base/fast_type_id_test.cc +3 -0
  41. package/vendor/abseil-cpp/absl/base/internal/exception_safety_testing.h +15 -12
  42. package/vendor/abseil-cpp/absl/base/internal/hardening.h +136 -0
  43. package/vendor/abseil-cpp/absl/base/internal/hardening_test.cc +168 -0
  44. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +2 -2
  45. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -0
  46. package/vendor/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  47. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +1 -2
  48. package/vendor/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  49. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  50. package/vendor/abseil-cpp/absl/base/macros.h +36 -20
  51. package/vendor/abseil-cpp/absl/base/nullability.h +4 -3
  52. package/vendor/abseil-cpp/absl/base/optimization.h +3 -2
  53. package/vendor/abseil-cpp/absl/base/optimization_test.cc +4 -3
  54. package/vendor/abseil-cpp/absl/base/options.h +55 -1
  55. package/vendor/abseil-cpp/absl/base/policy_checks.h +5 -5
  56. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  57. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  58. package/vendor/abseil-cpp/absl/base/throw_delegate_test.cc +19 -28
  59. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -0
  60. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +2 -0
  61. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +3 -2
  62. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  63. package/vendor/abseil-cpp/absl/container/BUILD.bazel +19 -7
  64. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +6 -5
  65. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +3 -5
  66. package/vendor/abseil-cpp/absl/container/btree_set.h +5 -5
  67. package/vendor/abseil-cpp/absl/container/btree_test.cc +11 -14
  68. package/vendor/abseil-cpp/absl/container/chunked_queue.h +8 -6
  69. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +5 -5
  70. package/vendor/abseil-cpp/absl/container/fixed_array.h +14 -13
  71. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +3 -3
  72. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +18 -6
  73. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +34 -1
  74. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +21 -7
  75. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +39 -7
  76. package/vendor/abseil-cpp/absl/container/inlined_vector.h +29 -29
  77. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +2 -2
  78. package/vendor/abseil-cpp/absl/container/internal/btree.h +32 -24
  79. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +16 -17
  80. package/vendor/abseil-cpp/absl/container/internal/common.h +6 -5
  81. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  82. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +16 -16
  83. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +13 -13
  84. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +41 -31
  85. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +2 -2
  86. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +4 -4
  87. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +3 -3
  88. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +27 -19
  89. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -2
  90. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +0 -17
  91. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +12 -30
  92. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +28 -28
  93. package/vendor/abseil-cpp/absl/container/internal/layout.h +13 -13
  94. package/vendor/abseil-cpp/absl/container/internal/layout_test.cc +3 -2
  95. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +60 -62
  96. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +59 -39
  97. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +619 -326
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +25 -2
  99. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +4 -4
  100. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +575 -159
  101. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +2 -2
  102. package/vendor/abseil-cpp/absl/container/node_hash_map.h +27 -15
  103. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +34 -0
  104. package/vendor/abseil-cpp/absl/container/node_hash_set.h +25 -11
  105. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +39 -7
  106. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +7 -4
  107. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +0 -1
  108. package/vendor/abseil-cpp/absl/crc/CMakeLists.txt +2 -3
  109. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +2 -1
  110. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +6 -6
  111. package/vendor/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  112. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  113. package/vendor/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  114. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +143 -81
  115. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +9 -31
  116. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +3 -33
  117. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  118. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +2 -1
  119. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +12 -2
  120. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +2 -3
  121. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -0
  122. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -4
  123. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  124. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +4 -0
  125. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +46 -36
  126. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +18 -58
  127. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +5 -48
  128. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +10 -124
  129. package/vendor/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  130. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +58 -106
  131. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +37 -36
  132. package/vendor/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  133. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -3
  134. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +1 -1
  135. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  136. package/vendor/abseil-cpp/absl/flags/commandlineflag_test.cc +1 -1
  137. package/vendor/abseil-cpp/absl/flags/flag_benchmark.cc +5 -5
  138. package/vendor/abseil-cpp/absl/flags/flag_test.cc +30 -30
  139. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +4 -4
  140. package/vendor/abseil-cpp/absl/flags/internal/flag.h +6 -6
  141. package/vendor/abseil-cpp/absl/flags/marshalling.h +2 -28
  142. package/vendor/abseil-cpp/absl/flags/marshalling_test.cc +12 -11
  143. package/vendor/abseil-cpp/absl/flags/reflection_test.cc +1 -1
  144. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +26 -1
  145. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +29 -1
  146. package/vendor/abseil-cpp/absl/functional/any_invocable.h +13 -14
  147. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +46 -47
  148. package/vendor/abseil-cpp/absl/functional/bind_back.h +79 -0
  149. package/vendor/abseil-cpp/absl/functional/bind_back_test.cc +237 -0
  150. package/vendor/abseil-cpp/absl/functional/bind_front.h +7 -1
  151. package/vendor/abseil-cpp/absl/functional/bind_front_test.cc +4 -4
  152. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +2 -2
  153. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +28 -28
  154. package/vendor/abseil-cpp/absl/functional/internal/back_binder.h +95 -0
  155. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  156. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  157. package/vendor/abseil-cpp/absl/functional/overload_test.cc +13 -13
  158. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +1 -2
  159. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +1 -2
  160. package/vendor/abseil-cpp/absl/hash/hash.h +1 -1
  161. package/vendor/abseil-cpp/absl/hash/hash_test.cc +14 -20
  162. package/vendor/abseil-cpp/absl/hash/hash_testing.h +11 -9
  163. package/vendor/abseil-cpp/absl/hash/internal/city.cc +39 -51
  164. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +165 -47
  165. package/vendor/abseil-cpp/absl/hash/internal/hash.h +86 -27
  166. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +36 -1
  167. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +8 -5
  168. package/vendor/abseil-cpp/absl/log/BUILD.bazel +5 -2
  169. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +5 -3
  170. package/vendor/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  171. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +15 -1
  172. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -4
  173. package/vendor/abseil-cpp/absl/log/internal/log_message.h +14 -0
  174. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  175. package/vendor/abseil-cpp/absl/log/internal/proto.cc +13 -0
  176. package/vendor/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  177. package/vendor/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  178. package/vendor/abseil-cpp/absl/log/internal/structured_proto_test.cc +3 -3
  179. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +2 -2
  180. package/vendor/abseil-cpp/absl/log/internal/vlog_config_benchmark.cc +3 -3
  181. package/vendor/abseil-cpp/absl/log/log_format_test.cc +19 -2
  182. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +18 -0
  183. package/vendor/abseil-cpp/absl/log/log_streamer.h +29 -2
  184. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +18 -0
  185. package/vendor/abseil-cpp/absl/log/scoped_mock_log_test.cc +1 -1
  186. package/vendor/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  187. package/vendor/abseil-cpp/absl/log/vlog_is_on_test.cc +6 -5
  188. package/vendor/abseil-cpp/absl/memory/memory.h +55 -5
  189. package/vendor/abseil-cpp/absl/memory/memory_test.cc +55 -1
  190. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  191. package/vendor/abseil-cpp/absl/meta/internal/requires.h +1 -1
  192. package/vendor/abseil-cpp/absl/meta/type_traits.h +119 -55
  193. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +7 -7
  194. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +6 -6
  195. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +3 -1
  196. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +0 -4
  197. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +32 -33
  198. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +25 -2
  199. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +8 -5
  200. package/vendor/abseil-cpp/absl/random/BUILD.bazel +13 -1
  201. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +23 -2
  202. package/vendor/abseil-cpp/absl/random/benchmarks.cc +1 -1
  203. package/vendor/abseil-cpp/absl/random/beta_distribution.h +2 -2
  204. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  205. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +43 -0
  206. package/vendor/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  207. package/vendor/abseil-cpp/absl/random/distributions.h +17 -17
  208. package/vendor/abseil-cpp/absl/random/distributions_test.cc +4 -4
  209. package/vendor/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  210. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +4 -2
  211. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  212. package/vendor/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  213. package/vendor/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  214. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  215. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc +3 -2
  216. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +14 -40
  217. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  218. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +2 -2
  219. package/vendor/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  220. package/vendor/abseil-cpp/absl/random/internal/pcg_engine_test.cc +3 -2
  221. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  222. package/vendor/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  223. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +3 -2
  224. package/vendor/abseil-cpp/absl/random/internal/randen_test.cc +3 -2
  225. package/vendor/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  226. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +4 -4
  227. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  228. package/vendor/abseil-cpp/absl/random/internal/traits.h +21 -0
  229. package/vendor/abseil-cpp/absl/random/internal/traits_test.cc +5 -0
  230. package/vendor/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  231. package/vendor/abseil-cpp/absl/random/internal/uniform_helper_test.cc +2 -1
  232. package/vendor/abseil-cpp/absl/random/mocking_access.h +74 -0
  233. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +9 -19
  234. package/vendor/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  235. package/vendor/abseil-cpp/absl/status/BUILD.bazel +81 -0
  236. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +91 -0
  237. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  238. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +26 -2
  239. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +22 -8
  240. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +43 -43
  241. package/vendor/abseil-cpp/absl/status/status.cc +62 -70
  242. package/vendor/abseil-cpp/absl/status/status.h +249 -23
  243. package/vendor/abseil-cpp/absl/status/status_benchmark.cc +12 -0
  244. package/vendor/abseil-cpp/absl/status/status_builder.cc +196 -0
  245. package/vendor/abseil-cpp/absl/status/status_builder.h +978 -0
  246. package/vendor/abseil-cpp/absl/status/status_builder_test.cc +380 -0
  247. package/vendor/abseil-cpp/absl/status/status_macros.h +484 -0
  248. package/vendor/abseil-cpp/absl/status/status_macros_test.cc +634 -0
  249. package/vendor/abseil-cpp/absl/status/status_matchers.h +2 -1
  250. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +3 -4
  251. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  252. package/vendor/abseil-cpp/absl/status/status_test.cc +443 -13
  253. package/vendor/abseil-cpp/absl/status/statusor.h +69 -36
  254. package/vendor/abseil-cpp/absl/status/statusor_test.cc +132 -35
  255. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +42 -7
  256. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +33 -4
  257. package/vendor/abseil-cpp/absl/strings/ascii.h +1 -2
  258. package/vendor/abseil-cpp/absl/strings/atod_manual_test.cc +5 -5
  259. package/vendor/abseil-cpp/absl/strings/cord.cc +26 -7
  260. package/vendor/abseil-cpp/absl/strings/cord.h +23 -13
  261. package/vendor/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  262. package/vendor/abseil-cpp/absl/strings/cord_test.cc +85 -9
  263. package/vendor/abseil-cpp/absl/strings/escaping.cc +183 -35
  264. package/vendor/abseil-cpp/absl/strings/escaping.h +12 -2
  265. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +1 -3
  266. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +22 -18
  267. package/vendor/abseil-cpp/absl/strings/has_absl_stringify_test.cc +2 -2
  268. package/vendor/abseil-cpp/absl/strings/has_ostream_operator_test.cc +2 -2
  269. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +10 -10
  270. package/vendor/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc +1 -1
  271. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  272. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  273. package/vendor/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  274. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +2 -26
  275. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +23 -2
  276. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +6 -2
  277. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -24
  278. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized_test.cc +16 -41
  279. package/vendor/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  280. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  281. package/vendor/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  282. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +12 -20
  283. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +510 -307
  284. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +0 -1
  285. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +9 -10
  286. package/vendor/abseil-cpp/absl/strings/internal/string_constant_test.cc +6 -5
  287. package/vendor/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  288. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream.h +119 -0
  289. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream_test.cc +111 -0
  290. package/vendor/abseil-cpp/absl/strings/numbers.cc +406 -0
  291. package/vendor/abseil-cpp/absl/strings/numbers.h +4 -0
  292. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +33 -0
  293. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +10 -6
  294. package/vendor/abseil-cpp/absl/strings/str_cat.h +36 -1
  295. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +1 -2
  296. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +28 -0
  297. package/vendor/abseil-cpp/absl/strings/str_join_test.cc +4 -4
  298. package/vendor/abseil-cpp/absl/strings/str_split.h +11 -6
  299. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +13 -0
  300. package/vendor/abseil-cpp/absl/strings/substitute.h +2 -2
  301. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +3 -0
  302. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +21 -0
  303. package/vendor/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  304. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +13 -0
  305. package/vendor/abseil-cpp/absl/synchronization/mutex.h +32 -2
  306. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +17 -3
  307. package/vendor/abseil-cpp/absl/time/BUILD.bazel +80 -0
  308. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +73 -0
  309. package/vendor/abseil-cpp/absl/time/clock.h +3 -0
  310. package/vendor/abseil-cpp/absl/time/clock_interface.cc +71 -0
  311. package/vendor/abseil-cpp/absl/time/clock_interface.h +93 -0
  312. package/vendor/abseil-cpp/absl/time/clock_interface_test.cc +128 -0
  313. package/vendor/abseil-cpp/absl/time/format.cc +3 -10
  314. package/vendor/abseil-cpp/absl/time/format_test.cc +12 -0
  315. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +90 -89
  316. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +80 -5
  317. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +1 -2
  318. package/vendor/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  319. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  320. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver +0 -0
  321. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
  322. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh +0 -0
  323. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon +0 -0
  324. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi +0 -0
  325. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane +0 -0
  326. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific +0 -0
  327. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau +0 -0
  328. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol +0 -0
  329. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +1 -1
  330. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +3 -3
  331. package/vendor/abseil-cpp/absl/time/simulated_clock.cc +225 -0
  332. package/vendor/abseil-cpp/absl/time/simulated_clock.h +109 -0
  333. package/vendor/abseil-cpp/absl/time/simulated_clock_test.cc +614 -0
  334. package/vendor/abseil-cpp/absl/types/BUILD.bazel +116 -0
  335. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +100 -0
  336. package/vendor/abseil-cpp/absl/types/any.h +26 -4
  337. package/vendor/abseil-cpp/absl/types/any_span.h +1067 -0
  338. package/vendor/abseil-cpp/absl/types/any_span_benchmark.cc +258 -0
  339. package/vendor/abseil-cpp/absl/types/any_span_test.cc +1210 -0
  340. package/vendor/abseil-cpp/absl/types/compare.h +4 -4
  341. package/vendor/abseil-cpp/absl/types/internal/any_span.h +477 -0
  342. package/vendor/abseil-cpp/absl/types/internal/span.h +5 -6
  343. package/vendor/abseil-cpp/absl/types/optional.h +30 -3
  344. package/vendor/abseil-cpp/absl/types/optional_ref.h +295 -0
  345. package/vendor/abseil-cpp/absl/types/optional_ref_test.cc +370 -0
  346. package/vendor/abseil-cpp/absl/types/source_location.cc +18 -0
  347. package/vendor/abseil-cpp/absl/types/source_location.h +172 -0
  348. package/vendor/abseil-cpp/absl/types/source_location_test.cc +139 -0
  349. package/vendor/abseil-cpp/absl/types/span.h +19 -23
  350. package/vendor/abseil-cpp/absl/types/variant.h +75 -18
  351. package/vendor/abseil-cpp/absl/types/variant_test.cc +23 -23
  352. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -0
  353. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +1 -0
  354. package/vendor/abseil-cpp/absl/utility/utility.h +99 -16
  355. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -0
  356. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +10 -4
  357. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +13 -6
  358. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +10 -4
  359. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +12 -5
  360. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +9 -2
  361. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  362. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +10 -3
  363. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +8 -2
  364. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +4 -3
  365. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +2 -2
  366. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -1
  367. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -1
  368. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +0 -118
  369. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +0 -71
  370. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +0 -97
@@ -390,7 +390,7 @@ struct SkipWhitespace {
390
390
  template <typename T>
391
391
  using EnableSplitIfString =
392
392
  typename std::enable_if<std::is_same<T, std::string>::value ||
393
- std::is_same<T, const std::string>::value,
393
+ std::is_same<T, const std::string>::value,
394
394
  int>::type;
395
395
 
396
396
  //------------------------------------------------------------------------------
@@ -399,11 +399,16 @@ using EnableSplitIfString =
399
399
 
400
400
  // StrSplit()
401
401
  //
402
- // Splits a given string based on the provided `Delimiter` object, returning the
403
- // elements within the type specified by the caller. Optionally, you may pass a
404
- // `Predicate` to `StrSplit()` indicating whether to include or exclude the
405
- // resulting element within the final result set. (See the overviews for
406
- // Delimiters and Predicates above.)
402
+ // Splits a string into a sequence of substrings identified by `Delimiter`. The
403
+ // input is processed sequentially from beginning to end, and each resulting
404
+ // substring is filtered by an optional `Predicate` before inclusion in the
405
+ // result set. `StrSplit()` returns a lazy range that preserves the substrings
406
+ // original order and is convertible to the collection type specified by the
407
+ // caller.
408
+ //
409
+ // Optionally, you may pass a `Predicate` to `StrSplit()` indicating whether to
410
+ // include or exclude the resulting element within the final result set. (See
411
+ // the overviews for Delimiters and Predicates above.)
407
412
  //
408
413
  // Example:
409
414
  //
@@ -36,6 +36,7 @@
36
36
  #include "absl/container/btree_set.h"
37
37
  #include "absl/container/flat_hash_map.h"
38
38
  #include "absl/container/node_hash_map.h"
39
+ #include "absl/hash/hash.h"
39
40
  #include "absl/strings/string_view.h"
40
41
 
41
42
  namespace {
@@ -422,6 +423,9 @@ TEST(Splitter, ConversionOperator) {
422
423
  TestConversionOperator<absl::btree_multiset<absl::string_view>>(splitter);
423
424
  TestConversionOperator<absl::btree_multiset<std::string>>(splitter);
424
425
  TestConversionOperator<std::unordered_set<std::string>>(splitter);
426
+ TestConversionOperator<
427
+ std::unordered_set<absl::string_view, absl::Hash<absl::string_view>>>(
428
+ splitter);
425
429
 
426
430
  // Tests conversion to map-like objects.
427
431
 
@@ -455,6 +459,15 @@ TEST(Splitter, ConversionOperator) {
455
459
  splitter);
456
460
  TestMapConversionOperator<std::unordered_map<std::string, std::string>>(
457
461
  splitter);
462
+ TestMapConversionOperator<std::unordered_map<
463
+ absl::string_view, absl::string_view, absl::Hash<absl::string_view>>>(
464
+ splitter);
465
+ TestMapConversionOperator<std::unordered_map<absl::string_view, std::string,
466
+ absl::Hash<absl::string_view>>>(
467
+ splitter);
468
+ TestMapConversionOperator<std::unordered_map<std::string, absl::string_view,
469
+ absl::Hash<absl::string_view>>>(
470
+ splitter);
458
471
  TestMapConversionOperator<
459
472
  absl::node_hash_map<absl::string_view, absl::string_view>>(splitter);
460
473
  TestMapConversionOperator<
@@ -123,9 +123,9 @@ class Arg {
123
123
  // probably using them as 8-bit integers and would probably prefer an integer
124
124
  // representation. However, we can't really know, so we make the caller decide
125
125
  // what to do.
126
- Arg(char value) // NOLINT(google-explicit-constructor)
127
- : piece_(scratch_, 1) {
126
+ Arg(char value) { // NOLINT(google-explicit-constructor)
128
127
  scratch_[0] = value;
128
+ piece_ = absl::string_view(scratch_, 1);
129
129
  }
130
130
  Arg(short value) // NOLINT(*)
131
131
  : piece_(scratch_,
@@ -65,6 +65,7 @@ cc_library(
65
65
  copts = ABSL_DEFAULT_COPTS,
66
66
  linkopts = ABSL_DEFAULT_LINKOPTS,
67
67
  visibility = [
68
+ "//absl:friends",
68
69
  ],
69
70
  deps = [
70
71
  "//absl/base",
@@ -295,6 +296,7 @@ cc_library(
295
296
  copts = ABSL_TEST_COPTS,
296
297
  linkopts = ABSL_DEFAULT_LINKOPTS,
297
298
  visibility = [
299
+ "//absl:friends",
298
300
  ],
299
301
  deps = [
300
302
  ":synchronization",
@@ -343,6 +345,7 @@ cc_library(
343
345
  copts = ABSL_TEST_COPTS,
344
346
  linkopts = ABSL_DEFAULT_LINKOPTS,
345
347
  visibility = [
348
+ "//absl:friends",
346
349
  ],
347
350
  deps = [
348
351
  ":synchronization",
@@ -77,6 +77,16 @@ void OneTimeInitThreadIdentity(base_internal::ThreadIdentity* identity) {
77
77
  identity->ticker.store(0, std::memory_order_relaxed);
78
78
  identity->wait_start.store(0, std::memory_order_relaxed);
79
79
  identity->is_idle.store(false, std::memory_order_relaxed);
80
+ // To avoid a circular dependency we declare only the storage in the header
81
+ // and use placement new to construct the SpinLock.
82
+ static_assert(
83
+ sizeof(base_internal::ThreadIdentity::SchedulerState::
84
+ association_lock_word) == sizeof(base_internal::SpinLock),
85
+ "Wrong size for SpinLock");
86
+ // Protects the association between this identity and its schedulable. Should
87
+ // never be cooperative.
88
+ new (&identity->scheduler_state.association_lock_word)
89
+ base_internal::SpinLock(base_internal::SCHEDULE_KERNEL_ONLY);
80
90
  }
81
91
 
82
92
  static void ResetThreadIdentityBetweenReuse(
@@ -96,6 +106,17 @@ static void ResetThreadIdentityBetweenReuse(
96
106
  pts->wake = false;
97
107
  pts->cond_waiter = false;
98
108
  pts->all_locks = nullptr;
109
+ base_internal::ThreadIdentity::SchedulerState* ss =
110
+ &identity->scheduler_state;
111
+ ss->bound_schedulable.store(nullptr, std::memory_order_relaxed);
112
+ ss->association_lock_word = 0;
113
+ ss->scheduling_disabled_depth.store(0, std::memory_order_relaxed);
114
+ ss->potentially_blocking_depth = 0;
115
+ ss->schedule_next_state = 0;
116
+ ss->waking_designated_waker = false;
117
+ identity->static_initialization_depth = 0;
118
+ identity->wait_state.store(base_internal::ThreadIdentity::WaitState::kActive,
119
+ std::memory_order_relaxed);
99
120
  identity->blocked_count_ptr = nullptr;
100
121
  identity->ticker.store(0, std::memory_order_relaxed);
101
122
  identity->wait_start.store(0, std::memory_order_relaxed);
@@ -31,6 +31,10 @@
31
31
  #include "absl/synchronization/internal/create_thread_identity.h"
32
32
  #include "absl/synchronization/internal/kernel_timeout.h"
33
33
 
34
+ namespace gloop_do_not_use {
35
+ struct SynchronizationBenchmarkPeer;
36
+ } // namespace gloop_do_not_use
37
+
34
38
  namespace absl {
35
39
  ABSL_NAMESPACE_BEGIN
36
40
 
@@ -77,6 +81,7 @@ class PerThreadSem {
77
81
  // Permitted callers.
78
82
  friend class PerThreadSemTest;
79
83
  friend class absl::Mutex;
84
+ friend struct ::gloop_do_not_use::SynchronizationBenchmarkPeer;
80
85
  friend void OneTimeInitThreadIdentity(absl::base_internal::ThreadIdentity*);
81
86
  };
82
87
 
@@ -2139,6 +2139,8 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams* waitp) {
2139
2139
  intptr_t wr_wait = 0; // set to kMuWrWait if we wake a reader and a
2140
2140
  // later writer could have acquired the lock
2141
2141
  // (starvation avoidance)
2142
+ // When non-null, clear its "woken_has_waiters" field before returning.
2143
+ absl::base_internal::ThreadIdentity* clear_waking_des_waker = nullptr;
2142
2144
  ABSL_RAW_CHECK(waitp == nullptr || waitp->thread->waitp == nullptr ||
2143
2145
  waitp->thread->suppress_fatal_errors,
2144
2146
  "detected illegal recursion into Mutex code");
@@ -2382,6 +2384,13 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams* waitp) {
2382
2384
  h->readers = 0;
2383
2385
  h->maybe_unlocking = false; // finished unlocking
2384
2386
  nv |= wr_wait | kMuWait | reinterpret_cast<intptr_t>(h);
2387
+
2388
+ // Signal to any Scheduler that we are waking from Mutex Unlock
2389
+ // and there are more waiters left, signaling possible contention.
2390
+ ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
2391
+ clear_waking_des_waker = GetOrCreateCurrentThreadIdentity();
2392
+ ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
2393
+ clear_waking_des_waker->scheduler_state.waking_designated_waker = true;
2385
2394
  }
2386
2395
 
2387
2396
  // release both spinlock & lock
@@ -2417,6 +2426,10 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams* waitp) {
2417
2426
  ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
2418
2427
  }
2419
2428
  }
2429
+
2430
+ if (clear_waking_des_waker) {
2431
+ clear_waking_des_waker->scheduler_state.waking_designated_waker = false;
2432
+ }
2420
2433
  }
2421
2434
 
2422
2435
  // Used by CondVar implementation to reacquire mutex after waking from
@@ -61,6 +61,7 @@
61
61
  #include <atomic>
62
62
  #include <cstdint>
63
63
  #include <cstring>
64
+ #include <type_traits>
64
65
 
65
66
  #include "absl/base/attributes.h"
66
67
  #include "absl/base/config.h"
@@ -81,6 +82,18 @@ ABSL_NAMESPACE_BEGIN
81
82
  class Condition;
82
83
  struct SynchWaitParams;
83
84
 
85
+ namespace synchronization_internal {
86
+
87
+ template <typename T, typename = void>
88
+ struct HasConstMemberCallOperator : std::false_type {};
89
+
90
+ template <typename T>
91
+ struct HasConstMemberCallOperator<
92
+ T, std::void_t<decltype(static_cast<bool (T::*)() const>(&T::operator()))>>
93
+ : std::true_type {};
94
+
95
+ } // namespace synchronization_internal
96
+
84
97
  // -----------------------------------------------------------------------------
85
98
  // Mutex
86
99
  // -----------------------------------------------------------------------------
@@ -866,11 +879,23 @@ class Condition {
866
879
  // Implementation note: The second template parameter ensures that this
867
880
  // constructor doesn't participate in overload resolution if T doesn't have
868
881
  // `bool operator() const`.
869
- template <typename T, typename E = decltype(static_cast<bool (T::*)() const>(
870
- &T::operator()))>
882
+ template <typename T,
883
+ std::enable_if_t<
884
+ synchronization_internal::HasConstMemberCallOperator<T>::value,
885
+ int> = 0>
871
886
  explicit Condition(const T* absl_nonnull obj)
872
887
  : Condition(obj, static_cast<bool (T::*)() const>(&T::operator())) {}
873
888
 
889
+ // Constructor for functors that do not match the `bool operator()() const`
890
+ // signature, such as those using C++23 "deducing this" or static operator().
891
+ template <
892
+ typename T,
893
+ typename = std::enable_if_t<
894
+ !synchronization_internal::HasConstMemberCallOperator<T>::value &&
895
+ sizeof(static_cast<bool (*)(const T&)>(&T::operator())) != 0>>
896
+ explicit Condition(const T* absl_nonnull obj)
897
+ : Condition(&CallByRef<T>, obj) {}
898
+
874
899
  // A Condition that always returns `true`.
875
900
  // kTrue is only useful in a narrow set of circumstances, mostly when
876
901
  // it's passed conditionally. For example:
@@ -932,6 +957,11 @@ class Condition {
932
957
  template <typename T, typename ConditionMethodPtr>
933
958
  static bool CastAndCallMethod(const Condition* absl_nonnull c);
934
959
 
960
+ template <typename T>
961
+ static bool CallByRef(const T* absl_nonnull self) {
962
+ return (*self)();
963
+ }
964
+
935
965
  // Helper methods for storing, validating, and reading callback arguments.
936
966
  template <typename T>
937
967
  inline void StoreCallback(T callback) {
@@ -56,7 +56,7 @@ static constexpr bool kExtendedTest = false;
56
56
 
57
57
  std::unique_ptr<absl::synchronization_internal::ThreadPool> CreatePool(
58
58
  int threads) {
59
- return absl::make_unique<absl::synchronization_internal::ThreadPool>(threads);
59
+ return std::make_unique<absl::synchronization_internal::ThreadPool>(threads);
60
60
  }
61
61
 
62
62
  std::unique_ptr<absl::synchronization_internal::ThreadPool>
@@ -868,7 +868,7 @@ TEST(Mutex, LockedMutexDestructionBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
868
868
  for (int i = 0; i != 10; i++) {
869
869
  // Create, lock and destroy 10 locks.
870
870
  const int kNumLocks = 10;
871
- auto mu = absl::make_unique<absl::Mutex[]>(kNumLocks);
871
+ auto mu = std::make_unique<absl::Mutex[]>(kNumLocks);
872
872
  for (int j = 0; j != kNumLocks; j++) {
873
873
  if ((j % 2) == 0) {
874
874
  mu[j].lock();
@@ -993,6 +993,20 @@ TEST(Mutex, FunctionPointerConditionWithConstMethod) {
993
993
  EXPECT_TRUE(absl::Condition(&chapman, &Constable::WotsAllThisThen).Eval());
994
994
  }
995
995
 
996
+ #ifdef __cpp_explicit_this_parameter
997
+ struct TrueViaDeducingThis {
998
+ template <class This, class... Args>
999
+ bool operator()(this const This&, Args...) {
1000
+ return true;
1001
+ }
1002
+ };
1003
+
1004
+ TEST(Mutex, FunctorConditionDeducingThis) {
1005
+ TrueViaDeducingThis f;
1006
+ EXPECT_TRUE(absl::Condition(&f).Eval());
1007
+ }
1008
+ #endif
1009
+
996
1010
  struct True {
997
1011
  template <class... Args>
998
1012
  bool operator()(Args...) const {
@@ -1292,7 +1306,7 @@ TEST(Mutex, DeadlockDetectorStressTest) ABSL_NO_THREAD_SAFETY_ANALYSIS {
1292
1306
  // If a deadlock detector keeps a full graph of lock acquisition order,
1293
1307
  // it will likely be too slow for this test to pass.
1294
1308
  const int n_locks = 1 << 17;
1295
- auto array_of_locks = absl::make_unique<absl::Mutex[]>(n_locks);
1309
+ auto array_of_locks = std::make_unique<absl::Mutex[]>(n_locks);
1296
1310
  for (int i = 0; i < n_locks; i++) {
1297
1311
  int end = std::min(n_locks, i + 5);
1298
1312
  // acquire and then release locks i, i+1, ..., i+4
@@ -67,6 +67,48 @@ cc_library(
67
67
  ],
68
68
  )
69
69
 
70
+ cc_library(
71
+ name = "clock_interface",
72
+ srcs = [
73
+ "clock_interface.cc",
74
+ ],
75
+ hdrs = [
76
+ "clock_interface.h",
77
+ ],
78
+ copts = ABSL_DEFAULT_COPTS,
79
+ linkopts = ABSL_DEFAULT_LINKOPTS,
80
+ deps = [
81
+ ":time",
82
+ "//absl/base:config",
83
+ "//absl/base:core_headers",
84
+ "//absl/base:no_destructor",
85
+ "//absl/base:nullability",
86
+ "//absl/base:raw_logging_internal",
87
+ "//absl/synchronization",
88
+ ],
89
+ )
90
+
91
+ cc_library(
92
+ name = "simulated_clock",
93
+ testonly = True,
94
+ srcs = [
95
+ "simulated_clock.cc",
96
+ ],
97
+ hdrs = [
98
+ "simulated_clock.h",
99
+ ],
100
+ copts = ABSL_DEFAULT_COPTS,
101
+ linkopts = ABSL_DEFAULT_LINKOPTS,
102
+ deps = [
103
+ ":clock_interface",
104
+ ":time",
105
+ "//absl/base:config",
106
+ "//absl/base:core_headers",
107
+ "//absl/base:nullability",
108
+ "//absl/synchronization",
109
+ ],
110
+ )
111
+
70
112
  cc_library(
71
113
  name = "test_util",
72
114
  testonly = True,
@@ -110,6 +152,44 @@ cc_test(
110
152
  ],
111
153
  )
112
154
 
155
+ cc_test(
156
+ name = "clock_interface_test",
157
+ srcs = [
158
+ "clock_interface_test.cc",
159
+ ],
160
+ copts = ABSL_TEST_COPTS,
161
+ linkopts = ABSL_DEFAULT_LINKOPTS,
162
+ deps = [
163
+ ":clock_interface",
164
+ ":time",
165
+ "//absl/functional:bind_front",
166
+ "//absl/synchronization",
167
+ "@googletest//:gtest",
168
+ "@googletest//:gtest_main",
169
+ ],
170
+ )
171
+
172
+ cc_test(
173
+ name = "simulated_clock_test",
174
+ srcs = [
175
+ "simulated_clock_test.cc",
176
+ ],
177
+ copts = ABSL_TEST_COPTS,
178
+ linkopts = ABSL_DEFAULT_LINKOPTS,
179
+ deps = [
180
+ ":clock_interface",
181
+ ":simulated_clock",
182
+ ":time",
183
+ "//absl/base:core_headers",
184
+ "//absl/base:raw_logging_internal",
185
+ "//absl/functional:bind_front",
186
+ "//absl/random",
187
+ "//absl/synchronization",
188
+ "@googletest//:gtest",
189
+ "@googletest//:gtest_main",
190
+ ],
191
+ )
192
+
113
193
  cc_test(
114
194
  name = "flag_test",
115
195
  srcs = [
@@ -131,6 +131,79 @@ absl_cc_test(
131
131
  GTest::gmock_main
132
132
  )
133
133
 
134
+ absl_cc_library(
135
+ NAME
136
+ clock_interface
137
+ HDRS
138
+ "clock_interface.h"
139
+ SRCS
140
+ "clock_interface.cc"
141
+ COPTS
142
+ ${ABSL_DEFAULT_COPTS}
143
+ DEPS
144
+ absl::time
145
+ absl::config
146
+ absl::core_headers
147
+ absl::no_destructor
148
+ absl::nullability
149
+ absl::raw_logging_internal
150
+ absl::synchronization
151
+ )
152
+
153
+ absl_cc_test(
154
+ NAME
155
+ clock_interface_test
156
+ SRCS
157
+ "clock_interface_test.cc"
158
+ COPTS
159
+ ${ABSL_TEST_COPTS}
160
+ DEPS
161
+ absl::clock_interface
162
+ absl::time
163
+ absl::config
164
+ absl::bind_front
165
+ absl::synchronization
166
+ GTest::gmock_main
167
+ )
168
+
169
+ absl_cc_library(
170
+ NAME
171
+ simulated_clock
172
+ HDRS
173
+ "simulated_clock.h"
174
+ SRCS
175
+ "simulated_clock.cc"
176
+ COPTS
177
+ ${ABSL_DEFAULT_COPTS}
178
+ DEPS
179
+ absl::clock_interface
180
+ absl::time
181
+ absl::config
182
+ absl::core_headers
183
+ absl::nullability
184
+ absl::synchronization
185
+ TESTONLY
186
+ )
187
+
188
+ absl_cc_test(
189
+ NAME
190
+ simulated_clock_test
191
+ SRCS
192
+ "simulated_clock_test.cc"
193
+ COPTS
194
+ ${ABSL_TEST_COPTS}
195
+ DEPS
196
+ absl::clock_interface
197
+ absl::simulated_clock
198
+ absl::time
199
+ absl::config
200
+ absl::bind_front
201
+ absl::random_random
202
+ absl::raw_logging_internal
203
+ absl::synchronization
204
+ GTest::gmock_main
205
+ )
206
+
134
207
  absl_cc_test(
135
208
  NAME
136
209
  flag_test
@@ -34,6 +34,9 @@ ABSL_NAMESPACE_BEGIN
34
34
  // Now()
35
35
  //
36
36
  // Returns the current time, expressed as an `absl::Time` absolute time value.
37
+ //
38
+ // To improve testability, consider injecting an absl::Clock and using
39
+ // absl::Clock::TimeNow() instead.
37
40
  absl::Time Now();
38
41
 
39
42
  // GetCurrentTimeNanos()
@@ -0,0 +1,71 @@
1
+ // Copyright 2026 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/time/clock_interface.h"
16
+
17
+ #include "absl/base/config.h"
18
+ #include "absl/base/internal/raw_logging.h"
19
+ #include "absl/base/no_destructor.h"
20
+ #include "absl/synchronization/mutex.h"
21
+ #include "absl/time/clock.h"
22
+ #include "absl/time/time.h"
23
+
24
+ namespace absl {
25
+ ABSL_NAMESPACE_BEGIN
26
+
27
+ namespace {
28
+
29
+ class RealTimeClock final : public Clock {
30
+ private:
31
+ #ifdef _MSC_VER
32
+ // Disable MSVC warning "destructor never returns, potential memory leak"
33
+ #pragma warning(push)
34
+ #pragma warning(disable : 4722)
35
+ #endif
36
+ ~RealTimeClock() override {
37
+ ABSL_RAW_LOG(FATAL, "RealTimeClock should never be destroyed");
38
+ }
39
+ #ifdef _MSC_VER
40
+ #pragma warning(pop)
41
+ #endif
42
+
43
+ public:
44
+ absl::Time TimeNow() override { return absl::Now(); }
45
+
46
+ void Sleep(absl::Duration d) override { absl::SleepFor(d); }
47
+
48
+ void SleepUntil(absl::Time wakeup_time) override {
49
+ absl::Duration d = wakeup_time - TimeNow();
50
+ if (d > absl::ZeroDuration()) {
51
+ Sleep(d);
52
+ }
53
+ }
54
+
55
+ bool AwaitWithDeadline(absl::Mutex* mu, const absl::Condition& cond,
56
+ absl::Time deadline) override {
57
+ return mu->AwaitWithDeadline(cond, deadline);
58
+ }
59
+ };
60
+
61
+ } // namespace
62
+
63
+ Clock::~Clock() = default; // go/key-method
64
+
65
+ Clock& Clock::GetRealClock() {
66
+ static absl::NoDestructor<RealTimeClock> rtclock;
67
+ return *rtclock;
68
+ }
69
+
70
+ ABSL_NAMESPACE_END
71
+ } // namespace absl
@@ -0,0 +1,93 @@
1
+ // Copyright 2026 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+ // -----------------------------------------------------------------------------
16
+ // File: clock_interface.h
17
+ // -----------------------------------------------------------------------------
18
+
19
+ #ifndef ABSL_TIME_CLOCK_INTERFACE_H_
20
+ #define ABSL_TIME_CLOCK_INTERFACE_H_
21
+
22
+ #include "absl/base/config.h"
23
+ #include "absl/base/macros.h"
24
+ #include "absl/base/nullability.h"
25
+ #include "absl/synchronization/mutex.h"
26
+ #include "absl/time/time.h"
27
+
28
+ namespace absl {
29
+ ABSL_NAMESPACE_BEGIN
30
+
31
+ // An abstract interface representing a Clock, which is an object that can
32
+ // tell you the current time, sleep, and wait for a condition variable.
33
+ //
34
+ // This interface allows decoupling code that uses time from the code that
35
+ // creates a point in time. You can use this to your advantage by injecting
36
+ // Clocks into interfaces rather than having implementations call absl::Now()
37
+ // directly.
38
+ //
39
+ // Implementations of this interface must be thread-safe.
40
+ //
41
+ // The Clock::GetRealClock() function returns a reference to the global realtime
42
+ // clock.
43
+ //
44
+ // Example:
45
+ //
46
+ // bool IsWeekend(Clock& clock) {
47
+ // absl::Time now = clock.TimeNow();
48
+ // // ... code to check if 'now' is a weekend.
49
+ // }
50
+ //
51
+ // // Production code.
52
+ // IsWeekend(Clock::GetRealClock());
53
+ //
54
+ // // Test code:
55
+ // MyTestClock test_clock(SATURDAY);
56
+ // IsWeekend(test_clock);
57
+ //
58
+ class Clock {
59
+ public:
60
+ // Returns a reference to the global realtime clock.
61
+ // The returned clock is thread-safe.
62
+ static Clock& GetRealClock();
63
+
64
+ virtual ~Clock();
65
+
66
+ // Returns the current time.
67
+ virtual absl::Time TimeNow() = 0;
68
+
69
+ // Sleeps for the specified duration.
70
+ virtual void Sleep(absl::Duration d) = 0;
71
+
72
+ // Sleeps until the specified time.
73
+ virtual void SleepUntil(absl::Time wakeup_time) = 0;
74
+
75
+ // Returns when cond is true or the deadline has passed. Returns true iff
76
+ // cond holds when returning.
77
+ //
78
+ // Requires *mu to be held at least in shared mode. It will be held when
79
+ // evaluating cond, and upon return, but it may be released and reacquired
80
+ // in the meantime.
81
+ //
82
+ // This method is similar to mu->AwaitWithDeadline() except that the
83
+ // latter only works with real-time deadlines. This call works properly
84
+ // with simulated time if invoked on a simulated clock.
85
+ virtual bool AwaitWithDeadline(absl::Mutex* absl_nonnull mu,
86
+ const absl::Condition& cond,
87
+ absl::Time deadline) = 0;
88
+ };
89
+
90
+ ABSL_NAMESPACE_END
91
+ } // namespace absl
92
+
93
+ #endif // ABSL_TIME_CLOCK_INTERFACE_H_