re2 1.24.1 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/LICENSE +15 -20
  2. package/README.md +62 -4
  3. package/binding.gyp +1 -2
  4. package/lib/addon.cc +7 -3
  5. package/lib/exec.cc +4 -4
  6. package/lib/match.cc +4 -4
  7. package/lib/pattern.cc +148 -1
  8. package/lib/replace.cc +5 -4
  9. package/lib/search.cc +1 -1
  10. package/lib/set.cc +75 -0
  11. package/lib/test.cc +1 -1
  12. package/lib/unicode_properties.h +15840 -0
  13. package/lib/wrapped_re2.h +11 -4
  14. package/lib/wrapped_re2_set.h +3 -1
  15. package/llms-full.txt +37 -7
  16. package/llms.txt +4 -1
  17. package/package.json +11 -10
  18. package/re2.d.ts +2 -0
  19. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +87 -74
  20. package/vendor/abseil-cpp/CMakeLists.txt +3 -3
  21. package/vendor/abseil-cpp/FAQ.md +130 -79
  22. package/vendor/abseil-cpp/MODULE.bazel +6 -7
  23. package/vendor/abseil-cpp/absl/BUILD.bazel +6 -0
  24. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +4 -0
  25. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +4 -0
  26. package/vendor/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  27. package/vendor/abseil-cpp/absl/algorithm/container.h +164 -17
  28. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +390 -13
  29. package/vendor/abseil-cpp/absl/base/BUILD.bazel +53 -6
  30. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +28 -4
  31. package/vendor/abseil-cpp/absl/base/attributes.h +61 -42
  32. package/vendor/abseil-cpp/absl/base/call_once.h +1 -0
  33. package/vendor/abseil-cpp/absl/base/casts.h +8 -1
  34. package/vendor/abseil-cpp/absl/base/casts_test.cc +3 -6
  35. package/vendor/abseil-cpp/absl/base/config.h +54 -10
  36. package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +9 -9
  37. package/vendor/abseil-cpp/absl/base/fast_type_id.h +30 -2
  38. package/vendor/abseil-cpp/absl/base/fast_type_id_test.cc +3 -0
  39. package/vendor/abseil-cpp/absl/base/internal/exception_safety_testing.h +15 -12
  40. package/vendor/abseil-cpp/absl/base/internal/hardening.h +136 -0
  41. package/vendor/abseil-cpp/absl/base/internal/hardening_test.cc +168 -0
  42. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +2 -2
  43. package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -0
  44. package/vendor/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  45. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +1 -2
  46. package/vendor/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  47. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  48. package/vendor/abseil-cpp/absl/base/macros.h +36 -20
  49. package/vendor/abseil-cpp/absl/base/nullability.h +4 -3
  50. package/vendor/abseil-cpp/absl/base/optimization.h +3 -2
  51. package/vendor/abseil-cpp/absl/base/optimization_test.cc +4 -3
  52. package/vendor/abseil-cpp/absl/base/options.h +55 -1
  53. package/vendor/abseil-cpp/absl/base/policy_checks.h +5 -5
  54. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  55. package/vendor/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  56. package/vendor/abseil-cpp/absl/base/throw_delegate_test.cc +19 -28
  57. package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -0
  58. package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +2 -0
  59. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +3 -2
  60. package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  61. package/vendor/abseil-cpp/absl/container/BUILD.bazel +19 -7
  62. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +6 -5
  63. package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +3 -5
  64. package/vendor/abseil-cpp/absl/container/btree_set.h +5 -5
  65. package/vendor/abseil-cpp/absl/container/btree_test.cc +11 -14
  66. package/vendor/abseil-cpp/absl/container/chunked_queue.h +8 -6
  67. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +5 -5
  68. package/vendor/abseil-cpp/absl/container/fixed_array.h +14 -13
  69. package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +3 -3
  70. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +18 -6
  71. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +34 -1
  72. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +21 -7
  73. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +39 -7
  74. package/vendor/abseil-cpp/absl/container/inlined_vector.h +29 -29
  75. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +2 -2
  76. package/vendor/abseil-cpp/absl/container/internal/btree.h +32 -24
  77. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +16 -17
  78. package/vendor/abseil-cpp/absl/container/internal/common.h +6 -5
  79. package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  80. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +16 -16
  81. package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +13 -13
  82. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +41 -31
  83. package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +2 -2
  84. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +4 -4
  85. package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +3 -3
  86. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +27 -19
  87. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -2
  88. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +0 -17
  89. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +12 -30
  90. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +28 -28
  91. package/vendor/abseil-cpp/absl/container/internal/layout.h +13 -13
  92. package/vendor/abseil-cpp/absl/container/internal/layout_test.cc +3 -2
  93. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +60 -62
  94. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +59 -39
  95. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +619 -326
  96. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +25 -2
  97. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +4 -4
  98. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +575 -159
  99. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +2 -2
  100. package/vendor/abseil-cpp/absl/container/node_hash_map.h +27 -15
  101. package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +34 -0
  102. package/vendor/abseil-cpp/absl/container/node_hash_set.h +25 -11
  103. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +39 -7
  104. package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +7 -4
  105. package/vendor/abseil-cpp/absl/crc/BUILD.bazel +0 -1
  106. package/vendor/abseil-cpp/absl/crc/CMakeLists.txt +2 -3
  107. package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +2 -1
  108. package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +6 -6
  109. package/vendor/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  110. package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  111. package/vendor/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  112. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +143 -81
  113. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +9 -31
  114. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +3 -33
  115. package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  116. package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +2 -1
  117. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +12 -2
  118. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +2 -3
  119. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +11 -0
  120. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -4
  121. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  122. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +4 -0
  123. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +46 -36
  124. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +18 -58
  125. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +5 -48
  126. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +10 -124
  127. package/vendor/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  128. package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +58 -106
  129. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +37 -36
  130. package/vendor/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  131. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -3
  132. package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +1 -1
  133. package/vendor/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  134. package/vendor/abseil-cpp/absl/flags/commandlineflag_test.cc +1 -1
  135. package/vendor/abseil-cpp/absl/flags/flag_benchmark.cc +5 -5
  136. package/vendor/abseil-cpp/absl/flags/flag_test.cc +30 -30
  137. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +4 -4
  138. package/vendor/abseil-cpp/absl/flags/internal/flag.h +6 -6
  139. package/vendor/abseil-cpp/absl/flags/marshalling.h +2 -28
  140. package/vendor/abseil-cpp/absl/flags/marshalling_test.cc +12 -11
  141. package/vendor/abseil-cpp/absl/flags/reflection_test.cc +1 -1
  142. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +26 -1
  143. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +29 -1
  144. package/vendor/abseil-cpp/absl/functional/any_invocable.h +13 -14
  145. package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +46 -47
  146. package/vendor/abseil-cpp/absl/functional/bind_back.h +79 -0
  147. package/vendor/abseil-cpp/absl/functional/bind_back_test.cc +237 -0
  148. package/vendor/abseil-cpp/absl/functional/bind_front.h +7 -1
  149. package/vendor/abseil-cpp/absl/functional/bind_front_test.cc +4 -4
  150. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +2 -2
  151. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +28 -28
  152. package/vendor/abseil-cpp/absl/functional/internal/back_binder.h +95 -0
  153. package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  154. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  155. package/vendor/abseil-cpp/absl/functional/overload_test.cc +13 -13
  156. package/vendor/abseil-cpp/absl/hash/BUILD.bazel +1 -2
  157. package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +1 -2
  158. package/vendor/abseil-cpp/absl/hash/hash.h +1 -1
  159. package/vendor/abseil-cpp/absl/hash/hash_test.cc +14 -20
  160. package/vendor/abseil-cpp/absl/hash/hash_testing.h +11 -9
  161. package/vendor/abseil-cpp/absl/hash/internal/city.cc +39 -51
  162. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +165 -47
  163. package/vendor/abseil-cpp/absl/hash/internal/hash.h +82 -26
  164. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +36 -1
  165. package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +8 -5
  166. package/vendor/abseil-cpp/absl/log/BUILD.bazel +5 -2
  167. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +5 -3
  168. package/vendor/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  169. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +15 -1
  170. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -4
  171. package/vendor/abseil-cpp/absl/log/internal/log_message.h +14 -0
  172. package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  173. package/vendor/abseil-cpp/absl/log/internal/proto.cc +13 -0
  174. package/vendor/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  175. package/vendor/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  176. package/vendor/abseil-cpp/absl/log/internal/structured_proto_test.cc +3 -3
  177. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +2 -2
  178. package/vendor/abseil-cpp/absl/log/internal/vlog_config_benchmark.cc +3 -3
  179. package/vendor/abseil-cpp/absl/log/log_format_test.cc +19 -2
  180. package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +18 -0
  181. package/vendor/abseil-cpp/absl/log/log_streamer.h +29 -2
  182. package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +18 -0
  183. package/vendor/abseil-cpp/absl/log/scoped_mock_log_test.cc +1 -1
  184. package/vendor/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  185. package/vendor/abseil-cpp/absl/log/vlog_is_on_test.cc +6 -5
  186. package/vendor/abseil-cpp/absl/memory/memory.h +55 -5
  187. package/vendor/abseil-cpp/absl/memory/memory_test.cc +55 -1
  188. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
  189. package/vendor/abseil-cpp/absl/meta/internal/requires.h +1 -1
  190. package/vendor/abseil-cpp/absl/meta/type_traits.h +119 -55
  191. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +7 -7
  192. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +6 -6
  193. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +3 -1
  194. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +0 -4
  195. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +32 -33
  196. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +25 -2
  197. package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +8 -5
  198. package/vendor/abseil-cpp/absl/random/BUILD.bazel +13 -1
  199. package/vendor/abseil-cpp/absl/random/CMakeLists.txt +23 -2
  200. package/vendor/abseil-cpp/absl/random/benchmarks.cc +1 -1
  201. package/vendor/abseil-cpp/absl/random/beta_distribution.h +2 -2
  202. package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  203. package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +43 -0
  204. package/vendor/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  205. package/vendor/abseil-cpp/absl/random/distributions.h +17 -17
  206. package/vendor/abseil-cpp/absl/random/distributions_test.cc +4 -4
  207. package/vendor/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  208. package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +4 -2
  209. package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  210. package/vendor/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  211. package/vendor/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  212. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  213. package/vendor/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc +3 -2
  214. package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +14 -40
  215. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  216. package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +2 -2
  217. package/vendor/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  218. package/vendor/abseil-cpp/absl/random/internal/pcg_engine_test.cc +3 -2
  219. package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  220. package/vendor/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  221. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +3 -2
  222. package/vendor/abseil-cpp/absl/random/internal/randen_test.cc +3 -2
  223. package/vendor/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  224. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +4 -4
  225. package/vendor/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  226. package/vendor/abseil-cpp/absl/random/internal/traits.h +21 -0
  227. package/vendor/abseil-cpp/absl/random/internal/traits_test.cc +5 -0
  228. package/vendor/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  229. package/vendor/abseil-cpp/absl/random/internal/uniform_helper_test.cc +2 -1
  230. package/vendor/abseil-cpp/absl/random/mocking_access.h +74 -0
  231. package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +9 -19
  232. package/vendor/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  233. package/vendor/abseil-cpp/absl/status/BUILD.bazel +81 -0
  234. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +91 -0
  235. package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  236. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +26 -2
  237. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +22 -8
  238. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +43 -43
  239. package/vendor/abseil-cpp/absl/status/status.cc +62 -70
  240. package/vendor/abseil-cpp/absl/status/status.h +249 -23
  241. package/vendor/abseil-cpp/absl/status/status_benchmark.cc +12 -0
  242. package/vendor/abseil-cpp/absl/status/status_builder.cc +196 -0
  243. package/vendor/abseil-cpp/absl/status/status_builder.h +978 -0
  244. package/vendor/abseil-cpp/absl/status/status_builder_test.cc +380 -0
  245. package/vendor/abseil-cpp/absl/status/status_macros.h +484 -0
  246. package/vendor/abseil-cpp/absl/status/status_macros_test.cc +634 -0
  247. package/vendor/abseil-cpp/absl/status/status_matchers.h +2 -1
  248. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +3 -4
  249. package/vendor/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  250. package/vendor/abseil-cpp/absl/status/status_test.cc +443 -13
  251. package/vendor/abseil-cpp/absl/status/statusor.h +69 -36
  252. package/vendor/abseil-cpp/absl/status/statusor_test.cc +132 -35
  253. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +42 -7
  254. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +33 -4
  255. package/vendor/abseil-cpp/absl/strings/ascii.h +1 -2
  256. package/vendor/abseil-cpp/absl/strings/atod_manual_test.cc +5 -5
  257. package/vendor/abseil-cpp/absl/strings/cord.cc +26 -7
  258. package/vendor/abseil-cpp/absl/strings/cord.h +23 -13
  259. package/vendor/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  260. package/vendor/abseil-cpp/absl/strings/cord_test.cc +85 -9
  261. package/vendor/abseil-cpp/absl/strings/escaping.cc +176 -30
  262. package/vendor/abseil-cpp/absl/strings/escaping.h +12 -2
  263. package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +1 -3
  264. package/vendor/abseil-cpp/absl/strings/escaping_test.cc +18 -18
  265. package/vendor/abseil-cpp/absl/strings/has_absl_stringify_test.cc +2 -2
  266. package/vendor/abseil-cpp/absl/strings/has_ostream_operator_test.cc +2 -2
  267. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +10 -10
  268. package/vendor/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc +1 -1
  269. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  270. package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  271. package/vendor/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  272. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +2 -26
  273. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +23 -2
  274. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +6 -2
  275. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -24
  276. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized_test.cc +16 -41
  277. package/vendor/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  278. package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  279. package/vendor/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  280. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +12 -20
  281. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +510 -307
  282. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +0 -1
  283. package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +9 -10
  284. package/vendor/abseil-cpp/absl/strings/internal/string_constant_test.cc +6 -5
  285. package/vendor/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  286. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream.h +119 -0
  287. package/vendor/abseil-cpp/absl/strings/internal/stringify_stream_test.cc +111 -0
  288. package/vendor/abseil-cpp/absl/strings/numbers.cc +406 -0
  289. package/vendor/abseil-cpp/absl/strings/numbers.h +4 -0
  290. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +33 -0
  291. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +10 -6
  292. package/vendor/abseil-cpp/absl/strings/str_cat.h +36 -1
  293. package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +1 -2
  294. package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +28 -0
  295. package/vendor/abseil-cpp/absl/strings/str_join_test.cc +4 -4
  296. package/vendor/abseil-cpp/absl/strings/str_split.h +11 -6
  297. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +13 -0
  298. package/vendor/abseil-cpp/absl/strings/substitute.h +2 -2
  299. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +3 -0
  300. package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +21 -0
  301. package/vendor/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  302. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +13 -0
  303. package/vendor/abseil-cpp/absl/synchronization/mutex.h +32 -2
  304. package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +17 -3
  305. package/vendor/abseil-cpp/absl/time/BUILD.bazel +80 -0
  306. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +73 -0
  307. package/vendor/abseil-cpp/absl/time/clock.h +3 -0
  308. package/vendor/abseil-cpp/absl/time/clock_interface.cc +71 -0
  309. package/vendor/abseil-cpp/absl/time/clock_interface.h +93 -0
  310. package/vendor/abseil-cpp/absl/time/clock_interface_test.cc +128 -0
  311. package/vendor/abseil-cpp/absl/time/format.cc +3 -10
  312. package/vendor/abseil-cpp/absl/time/format_test.cc +12 -0
  313. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +90 -89
  314. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +80 -5
  315. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +1 -2
  316. package/vendor/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  317. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  318. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver +0 -0
  319. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
  320. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh +0 -0
  321. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon +0 -0
  322. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi +0 -0
  323. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane +0 -0
  324. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific +0 -0
  325. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau +0 -0
  326. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol +0 -0
  327. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +1 -1
  328. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +3 -3
  329. package/vendor/abseil-cpp/absl/time/simulated_clock.cc +225 -0
  330. package/vendor/abseil-cpp/absl/time/simulated_clock.h +109 -0
  331. package/vendor/abseil-cpp/absl/time/simulated_clock_test.cc +614 -0
  332. package/vendor/abseil-cpp/absl/types/BUILD.bazel +116 -0
  333. package/vendor/abseil-cpp/absl/types/CMakeLists.txt +100 -0
  334. package/vendor/abseil-cpp/absl/types/any.h +26 -4
  335. package/vendor/abseil-cpp/absl/types/any_span.h +1067 -0
  336. package/vendor/abseil-cpp/absl/types/any_span_benchmark.cc +258 -0
  337. package/vendor/abseil-cpp/absl/types/any_span_test.cc +1210 -0
  338. package/vendor/abseil-cpp/absl/types/compare.h +4 -4
  339. package/vendor/abseil-cpp/absl/types/internal/any_span.h +477 -0
  340. package/vendor/abseil-cpp/absl/types/internal/span.h +5 -6
  341. package/vendor/abseil-cpp/absl/types/optional.h +30 -3
  342. package/vendor/abseil-cpp/absl/types/optional_ref.h +295 -0
  343. package/vendor/abseil-cpp/absl/types/optional_ref_test.cc +370 -0
  344. package/vendor/abseil-cpp/absl/types/source_location.cc +18 -0
  345. package/vendor/abseil-cpp/absl/types/source_location.h +172 -0
  346. package/vendor/abseil-cpp/absl/types/source_location_test.cc +139 -0
  347. package/vendor/abseil-cpp/absl/types/span.h +19 -23
  348. package/vendor/abseil-cpp/absl/types/variant.h +75 -18
  349. package/vendor/abseil-cpp/absl/types/variant_test.cc +23 -23
  350. package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -0
  351. package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +1 -0
  352. package/vendor/abseil-cpp/absl/utility/utility.h +99 -16
  353. package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -0
  354. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +10 -4
  355. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +13 -6
  356. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +10 -4
  357. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +12 -5
  358. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +9 -2
  359. package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
  360. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +10 -3
  361. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +8 -2
  362. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +4 -3
  363. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +2 -2
  364. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -1
  365. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -1
  366. package/AGENTS.md +0 -131
  367. package/ARCHITECTURE.md +0 -152
  368. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +0 -118
  369. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +0 -71
  370. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +0 -97
@@ -142,7 +142,7 @@ TEST(Format, Basics) {
142
142
  time_zone tz = utc_time_zone();
143
143
  time_point<chrono::nanoseconds> tp = chrono::system_clock::from_time_t(0);
144
144
 
145
- // Starts with a couple basic edge cases.
145
+ // Start with basic edge cases.
146
146
  EXPECT_EQ("", absl::time_internal::cctz::format("", tp, tz));
147
147
  EXPECT_EQ(" ", absl::time_internal::cctz::format(" ", tp, tz));
148
148
  EXPECT_EQ(" ", absl::time_internal::cctz::format(" ", tp, tz));
@@ -786,6 +786,36 @@ TEST(Format, Week) {
786
786
  absl::time_internal::cctz::format("%Y-%W-%w", tp, utc));
787
787
  }
788
788
 
789
+ TEST(Format, NULsInFormatString) {
790
+ time_zone tz = utc_time_zone();
791
+ time_point<chrono::nanoseconds> tp = chrono::system_clock::from_time_t(0);
792
+
793
+ // All NULs.
794
+ std::string nuls(32, '\0');
795
+ EXPECT_EQ(nuls, absl::time_internal::cctz::format(nuls, tp, tz));
796
+
797
+ // NULs amongst ordinary text plus the internal "%\0" specifier.
798
+ std::string percent_nul("\0X\0\0X%\0\0X\0\0X\0", 13);
799
+ EXPECT_EQ(percent_nul,
800
+ absl::time_internal::cctz::format(percent_nul, tp, tz));
801
+
802
+ // NULs amongst ordinary text plus a non-internal specifier (%I).
803
+ EXPECT_EQ(std::string("X\0\0\0X12\0X\0\0\0X", 13),
804
+ absl::time_internal::cctz::format(
805
+ std::string("X\0\0\0X%I\0X\0\0\0X", 13), tp, tz));
806
+
807
+ #if defined(__linux__) && defined(__GLIBC__)
808
+ // Depending upon strftime() behavior on "%E"
809
+ // and "%O", "%E\0" and "%0\0" produce themselves.
810
+ std::string percent_E_nul("abc%E\0xyz", 9);
811
+ EXPECT_EQ(percent_E_nul,
812
+ absl::time_internal::cctz::format(percent_E_nul, tp, tz));
813
+ std::string percent_O_nul("abc%O\0xyz", 9);
814
+ EXPECT_EQ(percent_O_nul,
815
+ absl::time_internal::cctz::format(percent_O_nul, tp, tz));
816
+ #endif
817
+ }
818
+
789
819
  //
790
820
  // Testing parse()
791
821
  //
@@ -930,6 +960,9 @@ TEST(Parse, ErrorCases) {
930
960
  const time_zone tz = utc_time_zone();
931
961
  auto tp = chrono::system_clock::from_time_t(0);
932
962
 
963
+ // No data.
964
+ EXPECT_FALSE(parse("X", "", tz, &tp));
965
+
933
966
  // Illegal trailing data.
934
967
  EXPECT_FALSE(parse("%S", "123", tz, &tp));
935
968
 
@@ -1578,6 +1611,41 @@ TEST(Parse, WeekYearShift) {
1578
1611
  EXPECT_FALSE(parse("%Y-%U-%u", "9223372036854775807-53-7", utc, &tp));
1579
1612
  }
1580
1613
 
1614
+ TEST(Parse, NULsInFormatAndInputStrings) {
1615
+ const time_zone utc = utc_time_zone();
1616
+ time_point<absl::time_internal::cctz::seconds> tp;
1617
+
1618
+ // Check that NULs are parsed just like any other chars.
1619
+ EXPECT_FALSE(
1620
+ parse(std::string("abc\0def", 7), std::string("abc\0xyz", 7), utc, &tp));
1621
+ EXPECT_FALSE(
1622
+ parse(std::string("%Y\0def", 6), std::string("2026\0xyz", 8), utc, &tp));
1623
+ EXPECT_TRUE(
1624
+ parse(std::string("%Y\0xyz", 6), std::string("2026\0xyz", 8), utc, &tp));
1625
+ ExpectTime(tp, utc, 2026, 1, 1, 0, 0, 0, 0, false, "UTC");
1626
+
1627
+ // All NULs.
1628
+ std::string nuls(32, '\0');
1629
+ EXPECT_TRUE(parse(nuls, nuls, utc, &tp));
1630
+ ExpectTime(tp, utc, 1970, 1, 1, 0, 0, 0, 0, false, "UTC");
1631
+
1632
+ // The "%\0" specifier never matches, even on the empty string and itself.
1633
+ std::string percent_nul("%\0", 2);
1634
+ EXPECT_FALSE(parse(percent_nul, "", utc, &tp));
1635
+ EXPECT_FALSE(parse(percent_nul, percent_nul, utc, &tp));
1636
+
1637
+ #if defined(__linux__) && defined(__GLIBC__)
1638
+ // Depending upon strptime() behavior on "%E"
1639
+ // and "%O", "%E\0" and "%0\0" also never match.
1640
+ std::string percent_E_nul("%E\0", 3);
1641
+ EXPECT_FALSE(parse(percent_E_nul, "", utc, &tp));
1642
+ EXPECT_FALSE(parse(percent_E_nul, percent_E_nul, utc, &tp));
1643
+ std::string percent_O_nul("%O\0", 3);
1644
+ EXPECT_FALSE(parse(percent_O_nul, "", utc, &tp));
1645
+ EXPECT_FALSE(parse(percent_O_nul, percent_O_nul, utc, &tp));
1646
+ #endif
1647
+ }
1648
+
1581
1649
  TEST(Parse, MaxRange) {
1582
1650
  const time_zone utc = utc_time_zone();
1583
1651
  time_point<absl::time_internal::cctz::seconds> tp;
@@ -1707,10 +1775,18 @@ TEST(FormatParse, RoundTrip) {
1707
1775
  const auto in = convert(civil_second(1977, 6, 28, 9, 8, 7), lax);
1708
1776
  const auto subseconds = chrono::nanoseconds(654321);
1709
1777
 
1778
+ // No format specifiers, but include NUL.
1779
+ {
1780
+ time_point<chrono::nanoseconds> out;
1781
+ const auto fmt = std::string("\0\1\2\3\4\5\6\7abcdefgh01234567");
1782
+ const auto s = absl::time_internal::cctz::format(fmt, in, lax);
1783
+ EXPECT_TRUE(parse(fmt, s, lax, &out)) << s;
1784
+ }
1785
+
1710
1786
  // RFC3339, which renders subseconds.
1711
1787
  {
1712
1788
  time_point<chrono::nanoseconds> out;
1713
- const std::string s =
1789
+ const auto s =
1714
1790
  absl::time_internal::cctz::format(RFC3339_full, in + subseconds, lax);
1715
1791
  EXPECT_TRUE(parse(RFC3339_full, s, lax, &out)) << s;
1716
1792
  EXPECT_EQ(in + subseconds, out); // RFC3339_full includes %Ez
@@ -1719,8 +1795,7 @@ TEST(FormatParse, RoundTrip) {
1719
1795
  // RFC1123, which only does whole seconds.
1720
1796
  {
1721
1797
  time_point<chrono::nanoseconds> out;
1722
- const std::string s =
1723
- absl::time_internal::cctz::format(RFC1123_full, in, lax);
1798
+ const auto s = absl::time_internal::cctz::format(RFC1123_full, in, lax);
1724
1799
  EXPECT_TRUE(parse(RFC1123_full, s, lax, &out)) << s;
1725
1800
  EXPECT_EQ(in, out); // RFC1123_full includes %z
1726
1801
  }
@@ -1738,7 +1813,7 @@ TEST(FormatParse, RoundTrip) {
1738
1813
  {
1739
1814
  time_point<chrono::nanoseconds> out;
1740
1815
  time_zone utc = utc_time_zone();
1741
- const std::string s = absl::time_internal::cctz::format("%c", in, utc);
1816
+ const auto s = absl::time_internal::cctz::format("%c", in, utc);
1742
1817
  EXPECT_TRUE(parse("%c", s, utc, &out)) << s;
1743
1818
  EXPECT_EQ(in, out);
1744
1819
  }
@@ -131,7 +131,7 @@ ucal_getTimeZoneIDForWindowsID_func LoadIcuGetTimeZoneIDForWindowsID() {
131
131
 
132
132
  // Convert wchar_t array (UTF-16) to UTF-8 string
133
133
  std::string Utf16ToUtf8(const wchar_t* ptr, size_t size) {
134
- if (size > std::numeric_limits<int>::max()) {
134
+ if (size > static_cast<size_t>(std::numeric_limits<int>::max())) {
135
135
  return std::string();
136
136
  }
137
137
  const int chars_len = static_cast<int>(size);
@@ -140,7 +140,6 @@ std::string Utf16ToUtf8(const wchar_t* ptr, size_t size) {
140
140
  std::min<size_t>(result.capacity(), std::numeric_limits<int>::max()), 1);
141
141
  do {
142
142
  result.resize(len);
143
- // TODO: Switch to std::string::data() when we require C++17 or higher.
144
143
  len = static_cast<std::size_t>(::WideCharToMultiByte(
145
144
  CP_UTF8, WC_ERR_INVALID_CHARS, ptr, chars_len, &result[0],
146
145
  static_cast<int>(len), nullptr, nullptr));
@@ -17,15 +17,8 @@
17
17
  ** Thank you!
18
18
  */
19
19
 
20
- /*
21
- ** Information about time zone files.
22
- */
23
-
24
- #ifndef TZDEFRULES
25
- #define TZDEFRULES "posixrules"
26
- #endif /* !defined TZDEFRULES */
27
-
28
- /* See Internet RFC 9636 for more details about the following format. */
20
+ /* Information about time zone files.
21
+ See Internet RFC 9636 for more details about the following format. */
29
22
 
30
23
  /*
31
24
  ** Each file begins with. . .
@@ -96,23 +89,25 @@ struct tzhead {
96
89
  */
97
90
 
98
91
  #ifndef TZ_MAX_TIMES
99
- /* This must be at least 242 for Europe/London with 'zic -b fat'. */
92
+ /* The following limit applies to localtime.c; zic has no such limit.
93
+ The limit must be at least 310 for Asia/Hebron with 'zic -b fat'. */
100
94
  #define TZ_MAX_TIMES 2000
101
95
  #endif /* !defined TZ_MAX_TIMES */
102
96
 
103
97
  #ifndef TZ_MAX_TYPES
104
98
  /* This must be at least 18 for Europe/Vilnius with 'zic -b fat'. */
105
- #define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */
99
+ #define TZ_MAX_TYPES 256 /* Limited to 256 by Internet RFC 9636. */
106
100
  #endif /* !defined TZ_MAX_TYPES */
107
101
 
108
102
  #ifndef TZ_MAX_CHARS
109
103
  /* This must be at least 40 for America/Anchorage. */
110
- #define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */
111
- /* (limited by what unsigned chars can hold) */
112
- #endif /* !defined TZ_MAX_CHARS */
104
+ #define TZ_MAX_CHARS 256 /* Maximum number of abbreviation characters */
105
+ /* (limited to 256 by Internet RFC 9636) */
106
+ #endif /* !defined TZ_MAX_CHARS */
113
107
 
114
108
  #ifndef TZ_MAX_LEAPS
115
- /* This must be at least 27 for leap seconds from 1972 through mid-2023.
109
+ /* The following limit applies to localtime.c; zic has no such limit.
110
+ The limit must be at least 27 for leap seconds from 1972 through mid-2023.
116
111
  There's a plan to discontinue leap seconds by 2035. */
117
112
  #define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */
118
113
  #endif /* !defined TZ_MAX_LEAPS */
@@ -1 +1 @@
1
- 2025c
1
+ 2026b
@@ -115,11 +115,11 @@ CA +5017-10750 America/Swift_Current CST - SK (midwest)
115
115
  CA +5333-11328 America/Edmonton Mountain - AB, BC(E), NT(E), SK(W)
116
116
  CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west)
117
117
  CA +682059-1334300 America/Inuvik Mountain - NT (west)
118
+ CA +4916-12307 America/Vancouver MST - BC (most areas)
118
119
  CA +5546-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John)
119
120
  CA +5848-12242 America/Fort_Nelson MST - BC (Ft Nelson)
120
121
  CA +6043-13503 America/Whitehorse MST - Yukon (east)
121
122
  CA +6404-13925 America/Dawson MST - Yukon (west)
122
- CA +4916-12307 America/Vancouver Pacific - BC (most areas)
123
123
  CH,DE,LI +4723+00832 Europe/Zurich Büsingen
124
124
  CI,BF,GH,GM,GN,IS,ML,MR,SH,SL,SN,TG +0519-00402 Africa/Abidjan
125
125
  CK -2114-15946 Pacific/Rarotonga
@@ -58,6 +58,9 @@ XX -2504-13005 Pacific/Pitcairn Pitcairn
58
58
  # -08/-07 - PST/PDT (North America DST)
59
59
  XX +340308-1181434 America/Los_Angeles Pacific (PST/PDT) - US & Canada; Mexico near US border
60
60
  #
61
+ # -08/-07 - PST/PDT (North America DST) until 2026-11-01 02:00; then MST
62
+ XX +4916-12307 America/Vancouver MST - BC (most areas)
63
+ #
61
64
  # -07 - MST
62
65
  XX +332654-1120424 America/Phoenix Mountain Standard (MST) - Arizona; western Mexico; Yukon
63
66
  #
@@ -166,9 +169,6 @@ XX +3003+03115 Africa/Cairo Egypt
166
169
  # +02/+03 - EET/EEST (Lebanon DST)
167
170
  XX +3353+03530 Asia/Beirut Lebanon
168
171
  #
169
- # +02/+03 - EET/EEST (Moldova DST)
170
- XX +4700+02850 Europe/Chisinau Moldova
171
- #
172
172
  # +02/+03 - EET/EEST (Palestine DST)
173
173
  XX +3130+03428 Asia/Gaza Palestine
174
174
  #
@@ -0,0 +1,225 @@
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/simulated_clock.h"
16
+
17
+ #include <cstdint>
18
+ #include <map>
19
+ #include <memory>
20
+ #include <optional>
21
+ #include <utility>
22
+ #include <vector>
23
+
24
+ #include "absl/base/config.h"
25
+ #include "absl/base/macros.h"
26
+ #include "absl/base/nullability.h"
27
+ #include "absl/base/thread_annotations.h"
28
+ #include "absl/synchronization/mutex.h"
29
+ #include "absl/time/clock.h"
30
+ #include "absl/time/time.h"
31
+
32
+ namespace absl {
33
+ ABSL_NAMESPACE_BEGIN
34
+
35
+ // There are a few tricky details in the implementation of SimulatedClock.
36
+ //
37
+ // The external mutex that is passed as a param of AwaitWithDeadline() is not
38
+ // under the control of SimulatedClock; in particular, it can be destroyed any
39
+ // time after AwaitWithDeadline() returns. This requires the wakeup call from
40
+ // AdvanceTime() to avoid grabbing the external mutex if AwaitWithDeadline()
41
+ // has returned. This is accomplished by allowing the waiter to be cancelled
42
+ // via a bool guarded by a mutex in WakeUpInfo.
43
+ //
44
+ // Once AwaitWithDeadline() has released lock_, someone nefarious might call
45
+ // the SimulatedClock destructor, so it isn't possible for AwaitWithDeadline()
46
+ // to remove the wakeup call from waiters_ if the condition it is awaiting
47
+ // becomes true; it cancels the waiter instead. This means that,
48
+ // theoretically, many obsolete entries could pile up in waiters_ if
49
+ // AwaitWithDeadline() keeps being called but simulated time is not advanced.
50
+ // This seems unlikely to happen in practice.
51
+ //
52
+ // The WakeUpInfo in waiters_ are always awoken via WakeUp() (and
53
+ // removed) or cancelled before AwaitWithDeadline() returns. If a
54
+ // waiters_ value is cancelled then calling its WakeUp() method will
55
+ // short-circuit before touching the external mutex.
56
+
57
+ class SimulatedClock::WakeUpInfo {
58
+ public:
59
+ WakeUpInfo(absl::Mutex* mu, absl::Condition cond)
60
+ : mu_(mu),
61
+ cond_(cond),
62
+ wakeup_time_passed_(false),
63
+ cancelled_(false),
64
+ wakeup_called_(false) {}
65
+
66
+ void WakeUp() {
67
+ // If we are cancelled then AwaitWithDeadline may have returned, in which
68
+ // case we can't lock mu_.
69
+ {
70
+ absl::MutexLock lock(cancellation_mu_);
71
+ if (cancelled_) return;
72
+ wakeup_called_ = true;
73
+ }
74
+ absl::MutexLock lock(*mu_);
75
+ wakeup_time_passed_ = true;
76
+ }
77
+
78
+ void AwaitConditionOrWakeUp() {
79
+ mu_->Await(absl::Condition(this, &WakeUpInfo::Ready));
80
+ }
81
+
82
+ void CancelOrAwaitWakeUp() {
83
+ bool wakeup_called;
84
+ {
85
+ absl::MutexLock lock(cancellation_mu_);
86
+ cancelled_ = true;
87
+ wakeup_called = wakeup_called_;
88
+ }
89
+ if (wakeup_called && !wakeup_time_passed_) {
90
+ // Wait for WakeUp to complete.
91
+ //
92
+ // Note that this will unlock 'mu_'; this is actually necessary
93
+ // so that WakeUp() can unblock and complete. This does allow
94
+ // for 'cond_' to potentially change from true to false; that is
95
+ // OK, since WakeUp() is being called, so the deadline must be
96
+ // past, and so this method is fulfilling its duties. (Well, the
97
+ // destructor might be calling WakeUp(), but if you're deleting
98
+ // time itself while waiting for a deadline to pass, you deserve
99
+ // what you get.)
100
+ mu_->Await(absl::Condition(&wakeup_time_passed_));
101
+ }
102
+ }
103
+
104
+ private:
105
+ bool Ready() const { return wakeup_time_passed_ || cond_.Eval(); }
106
+
107
+ absl::Mutex* mu_;
108
+ absl::Condition cond_;
109
+ bool wakeup_time_passed_;
110
+ absl::Mutex cancellation_mu_;
111
+ bool cancelled_ ABSL_GUARDED_BY(cancellation_mu_);
112
+ bool wakeup_called_ ABSL_GUARDED_BY(cancellation_mu_);
113
+ };
114
+
115
+ SimulatedClock::SimulatedClock(absl::Time t) : now_(t) {}
116
+
117
+ SimulatedClock::~SimulatedClock() {
118
+ // Wake up all existing waiters.
119
+ WaiterList waiters;
120
+ {
121
+ absl::MutexLock l(lock_);
122
+ waiters.swap(waiters_);
123
+ }
124
+ for (auto& iter : waiters) {
125
+ iter.second->WakeUp();
126
+ }
127
+ }
128
+
129
+ absl::Time SimulatedClock::TimeNow() {
130
+ absl::ReaderMutexLock l(lock_);
131
+ return now_;
132
+ }
133
+
134
+ void SimulatedClock::Sleep(absl::Duration d) { SleepUntil(TimeNow() + d); }
135
+
136
+ int64_t SimulatedClock::SetTime(absl::Time t) ABSL_NO_THREAD_SAFETY_ANALYSIS {
137
+ return UpdateTime([this, t]()
138
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock_) { now_ = t; });
139
+ }
140
+
141
+ int64_t SimulatedClock::AdvanceTime(absl::Duration d)
142
+ ABSL_NO_THREAD_SAFETY_ANALYSIS {
143
+ return UpdateTime([this, d]()
144
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock_) { now_ += d; });
145
+ }
146
+
147
+ template <class T>
148
+ int64_t SimulatedClock::UpdateTime(const T& now_updater) {
149
+ // Deadlock could occur if UpdateTime() were to hold lock_ while waking up
150
+ // waiters, since waking up requires acquiring the external mutex, and
151
+ // AwaitWithDeadline() acquires the mutexes in the opposite order. So let's
152
+ // first grab all the wakeup callbacks, then release lock_, then call the
153
+ // callbacks.
154
+ std::vector<WaiterList::mapped_type> wakeup_calls;
155
+
156
+ lock_.lock();
157
+ now_updater(); // reset now_
158
+ WaiterList::iterator iter;
159
+ while (((iter = waiters_.begin()) != waiters_.end()) &&
160
+ (iter->first <= now_)) {
161
+ wakeup_calls.push_back(std::move(iter->second));
162
+ waiters_.erase(iter);
163
+ }
164
+ lock_.unlock();
165
+
166
+ for (const auto& wakeup_call : wakeup_calls) {
167
+ wakeup_call->WakeUp();
168
+ }
169
+
170
+ return static_cast<int64_t>(wakeup_calls.size());
171
+ }
172
+
173
+ void SimulatedClock::SleepUntil(absl::Time wakeup_time) {
174
+ absl::Mutex mu;
175
+ absl::MutexLock lock(mu);
176
+ bool f = false;
177
+ AwaitWithDeadline(&mu, absl::Condition(&f), wakeup_time);
178
+ }
179
+
180
+ bool SimulatedClock::AwaitWithDeadline(absl::Mutex* mu,
181
+ const absl::Condition& cond,
182
+ absl::Time deadline) {
183
+ mu->AssertReaderHeld();
184
+
185
+ // Evaluate cond outside our own lock to minimize contention.
186
+ const bool ready = cond.Eval();
187
+
188
+ lock_.lock();
189
+ num_await_calls_++;
190
+
191
+ // Return now if the deadline is already past, or if the condition is true.
192
+ // This avoids creating a WakeUpInfo that won't be deleted until an
193
+ // appropriate UpdateTime() call.
194
+ if (deadline <= now_ || ready) {
195
+ lock_.unlock();
196
+ return ready;
197
+ }
198
+
199
+ auto wakeup_info = std::make_shared<WakeUpInfo>(mu, cond);
200
+ waiters_.insert(std::make_pair(deadline, wakeup_info));
201
+
202
+ lock_.unlock();
203
+ // SimulatedClock may be destroyed any time after this, so we can't
204
+ // acquire lock_ again.
205
+
206
+ // Wait until either cond.Eval() becomes true, or the deadline has passed.
207
+ wakeup_info->AwaitConditionOrWakeUp();
208
+
209
+ // Cancel the wakeup call, or if it's already in progress, wait for it to
210
+ // finish, since we must ensure no one touches 'mu' or 'cond' after we return.
211
+ wakeup_info->CancelOrAwaitWakeUp();
212
+
213
+ return cond.Eval();
214
+ }
215
+
216
+ std::optional<absl::Time> SimulatedClock::GetEarliestWakeupTime() const {
217
+ absl::ReaderMutexLock l(lock_);
218
+ if (waiters_.empty()) {
219
+ return std::nullopt;
220
+ }
221
+ return waiters_.begin()->first;
222
+ }
223
+
224
+ ABSL_NAMESPACE_END
225
+ } // namespace absl
@@ -0,0 +1,109 @@
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: simulated_clock.h
17
+ // -----------------------------------------------------------------------------
18
+
19
+ #ifndef ABSL_TIME_SIMULATED_CLOCK_H_
20
+ #define ABSL_TIME_SIMULATED_CLOCK_H_
21
+
22
+ #include <cstdint>
23
+ #include <map>
24
+ #include <memory>
25
+ #include <optional>
26
+
27
+ #include "absl/base/config.h"
28
+ #include "absl/base/macros.h"
29
+ #include "absl/base/nullability.h"
30
+ #include "absl/base/thread_annotations.h"
31
+ #include "absl/synchronization/mutex.h"
32
+ #include "absl/time/clock.h"
33
+ #include "absl/time/clock_interface.h"
34
+ #include "absl/time/time.h"
35
+
36
+ namespace absl {
37
+ ABSL_NAMESPACE_BEGIN
38
+
39
+ // A simulated clock is a concrete Clock implementation that does not "tick"
40
+ // on its own. Time is advanced by explicit calls to the AdvanceTime() or
41
+ // SetTime() functions.
42
+ //
43
+ // Example:
44
+ // absl::SimulatedClock sim_clock;
45
+ // absl::Time now = sim_clock.TimeNow();
46
+ // // now == absl::UnixEpoch()
47
+ //
48
+ // now = sim_clock.TimeNow();
49
+ // // now == absl::UnixEpoch() (still)
50
+ //
51
+ // sim_clock.AdvanceTime(absl::Seconds(3));
52
+ // now = sim_clock.TimeNow();
53
+ // // now == absl::UnixEpoch() + absl::Seconds(3)
54
+ //
55
+ // This class is thread-safe.
56
+ class SimulatedClock : public Clock {
57
+ public:
58
+ explicit SimulatedClock(absl::Time t);
59
+ SimulatedClock() : SimulatedClock(absl::UnixEpoch()) {}
60
+
61
+ // The destructor should be called only if all Sleep(), etc. and
62
+ // AdvanceTime() calls have completed. The code does its best to let
63
+ // any pending calls finish gracefully, but there are no guarantees.
64
+ ~SimulatedClock() override;
65
+
66
+ // Returns the simulated time.
67
+ absl::Time TimeNow() override;
68
+
69
+ // Sleeps until the specified duration has elapsed according to this clock.
70
+ void Sleep(absl::Duration d) override;
71
+
72
+ // Sleeps until the specified wakeup_time.
73
+ void SleepUntil(absl::Time wakeup_time) override;
74
+
75
+ // Sets the simulated time to the argument. Wakes up any threads whose
76
+ // sleeps have now expired. Returns the number of woken threads.
77
+ int64_t SetTime(absl::Time t);
78
+
79
+ // Advances the simulated time by the specified duration. Wakes up any
80
+ // threads whose sleeps have now expired. Returns the number of woken threads.
81
+ int64_t AdvanceTime(absl::Duration d);
82
+
83
+ // Blocks until the condition is true or until the simulated clock is
84
+ // advanced to or beyond the wakeup time (or both).
85
+ bool AwaitWithDeadline(absl::Mutex* absl_nonnull mu,
86
+ const absl::Condition& cond,
87
+ absl::Time deadline) override
88
+ ABSL_SHARED_LOCKS_REQUIRED(mu);
89
+
90
+ // Returns the earliest wakeup time.
91
+ std::optional<absl::Time> GetEarliestWakeupTime() const;
92
+
93
+ private:
94
+ template <class T>
95
+ int64_t UpdateTime(const T& now_updater) ABSL_LOCKS_EXCLUDED(lock_);
96
+
97
+ class WakeUpInfo;
98
+ using WaiterList = std::multimap<absl::Time, std::shared_ptr<WakeUpInfo>>;
99
+
100
+ mutable absl::Mutex lock_;
101
+ absl::Time now_ ABSL_GUARDED_BY(lock_);
102
+ WaiterList waiters_ ABSL_GUARDED_BY(lock_);
103
+ int64_t num_await_calls_ ABSL_GUARDED_BY(lock_) = 0;
104
+ };
105
+
106
+ ABSL_NAMESPACE_END
107
+ } // namespace absl
108
+
109
+ #endif // ABSL_TIME_SIMULATED_CLOCK_H_