re2 1.23.0 → 1.23.2

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 (280) hide show
  1. package/README.md +2 -0
  2. package/binding.gyp +3 -2
  3. package/package.json +5 -5
  4. package/vendor/abseil-cpp/CMake/AbseilDll.cmake +25 -4
  5. package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +6 -1
  6. package/vendor/abseil-cpp/CMakeLists.txt +2 -2
  7. package/vendor/abseil-cpp/MODULE.bazel +2 -2
  8. package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +0 -1
  9. package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +0 -2
  10. package/vendor/abseil-cpp/absl/algorithm/container.h +191 -140
  11. package/vendor/abseil-cpp/absl/algorithm/container_test.cc +818 -0
  12. package/vendor/abseil-cpp/absl/base/BUILD.bazel +44 -5
  13. package/vendor/abseil-cpp/absl/base/CMakeLists.txt +42 -3
  14. package/vendor/abseil-cpp/absl/base/attributes.h +5 -1
  15. package/vendor/abseil-cpp/absl/base/call_once_test.cc +10 -10
  16. package/vendor/abseil-cpp/absl/base/casts.cc +61 -0
  17. package/vendor/abseil-cpp/absl/base/casts.h +128 -2
  18. package/vendor/abseil-cpp/absl/base/casts_test.cc +151 -0
  19. package/vendor/abseil-cpp/absl/base/config.h +13 -37
  20. package/vendor/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
  21. package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +4 -0
  22. package/vendor/abseil-cpp/absl/base/internal/nullability_traits.h +71 -0
  23. package/vendor/abseil-cpp/absl/base/internal/nullability_traits_test.cc +98 -0
  24. package/vendor/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
  25. package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +13 -7
  26. package/vendor/abseil-cpp/absl/base/internal/spinlock.h +16 -11
  27. package/vendor/abseil-cpp/absl/base/internal/strerror_test.cc +2 -1
  28. package/vendor/abseil-cpp/absl/base/internal/sysinfo.cc +0 -9
  29. package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +0 -6
  30. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -1
  31. package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
  32. package/vendor/abseil-cpp/absl/base/macros.h +40 -17
  33. package/vendor/abseil-cpp/absl/base/nullability.h +1 -1
  34. package/vendor/abseil-cpp/absl/base/optimization.h +1 -3
  35. package/vendor/abseil-cpp/absl/base/options.h +1 -27
  36. package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +5 -8
  37. package/vendor/abseil-cpp/absl/cleanup/cleanup.h +4 -0
  38. package/vendor/abseil-cpp/absl/container/BUILD.bazel +195 -2
  39. package/vendor/abseil-cpp/absl/container/CMakeLists.txt +136 -2
  40. package/vendor/abseil-cpp/absl/container/btree_map.h +56 -6
  41. package/vendor/abseil-cpp/absl/container/btree_set.h +52 -6
  42. package/vendor/abseil-cpp/absl/container/btree_test.cc +107 -1
  43. package/vendor/abseil-cpp/absl/container/chunked_queue.h +755 -0
  44. package/vendor/abseil-cpp/absl/container/chunked_queue_benchmark.cc +386 -0
  45. package/vendor/abseil-cpp/absl/container/chunked_queue_test.cc +768 -0
  46. package/vendor/abseil-cpp/absl/container/fixed_array.h +4 -6
  47. package/vendor/abseil-cpp/absl/container/flat_hash_map.h +16 -6
  48. package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +1 -2
  49. package/vendor/abseil-cpp/absl/container/flat_hash_set.h +16 -6
  50. package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +0 -2
  51. package/vendor/abseil-cpp/absl/container/inlined_vector.h +12 -4
  52. package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +21 -0
  53. package/vendor/abseil-cpp/absl/container/internal/btree_container.h +14 -5
  54. package/vendor/abseil-cpp/absl/container/internal/chunked_queue.h +173 -0
  55. package/vendor/abseil-cpp/absl/container/internal/common.h +51 -0
  56. package/vendor/abseil-cpp/absl/container/internal/container_memory.h +7 -1
  57. package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +11 -0
  58. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +0 -2
  59. package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +1 -2
  60. package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +0 -14
  61. package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +11 -8
  62. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +3 -4
  63. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +23 -6
  64. package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +31 -15
  65. package/vendor/abseil-cpp/absl/container/internal/heterogeneous_lookup_testing.h +80 -0
  66. package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +4 -12
  67. package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -10
  68. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +149 -23
  69. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +120 -126
  70. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +4 -0
  71. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +8 -0
  72. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +14 -59
  73. package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +111 -22
  74. package/vendor/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +53 -112
  75. package/vendor/abseil-cpp/absl/container/internal/unordered_map_lookup_test.h +10 -15
  76. package/vendor/abseil-cpp/absl/container/internal/unordered_map_members_test.h +3 -3
  77. package/vendor/abseil-cpp/absl/container/internal/unordered_map_modifiers_test.h +45 -61
  78. package/vendor/abseil-cpp/absl/container/internal/unordered_set_constructor_test.h +53 -112
  79. package/vendor/abseil-cpp/absl/container/internal/unordered_set_lookup_test.h +6 -9
  80. package/vendor/abseil-cpp/absl/container/internal/unordered_set_members_test.h +3 -3
  81. package/vendor/abseil-cpp/absl/container/internal/unordered_set_modifiers_test.h +25 -31
  82. package/vendor/abseil-cpp/absl/container/linked_hash_map.h +666 -0
  83. package/vendor/abseil-cpp/absl/container/linked_hash_map_benchmark.cc +140 -0
  84. package/vendor/abseil-cpp/absl/container/linked_hash_map_test.cc +987 -0
  85. package/vendor/abseil-cpp/absl/container/linked_hash_set.h +527 -0
  86. package/vendor/abseil-cpp/absl/container/linked_hash_set_benchmark.cc +84 -0
  87. package/vendor/abseil-cpp/absl/container/linked_hash_set_test.cc +947 -0
  88. package/vendor/abseil-cpp/absl/container/node_hash_map.h +17 -6
  89. package/vendor/abseil-cpp/absl/container/node_hash_set.h +16 -5
  90. package/vendor/abseil-cpp/absl/container/node_hash_set_test.cc +1 -2
  91. package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +79 -0
  92. package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +79 -0
  93. package/vendor/abseil-cpp/absl/copts/copts.py +17 -4
  94. package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +67 -13
  95. package/vendor/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
  96. package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +31 -0
  97. package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +34 -0
  98. package/vendor/abseil-cpp/absl/debugging/failure_signal_handler.cc +2 -2
  99. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +118 -0
  100. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +71 -0
  101. package/vendor/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +97 -0
  102. package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
  103. package/vendor/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
  104. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.cc +4 -0
  105. package/vendor/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -0
  106. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +1 -1
  107. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +0 -7
  108. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
  109. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +2 -1
  110. package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  111. package/vendor/abseil-cpp/absl/debugging/internal/symbolize.h +2 -2
  112. package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +35 -67
  113. package/vendor/abseil-cpp/absl/debugging/stacktrace.h +3 -0
  114. package/vendor/abseil-cpp/absl/debugging/stacktrace_benchmark.cc +24 -1
  115. package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +39 -15
  116. package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
  117. package/vendor/abseil-cpp/absl/debugging/symbolize_test.cc +25 -40
  118. package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
  119. package/vendor/abseil-cpp/absl/flags/BUILD.bazel +1 -0
  120. package/vendor/abseil-cpp/absl/flags/declare.h +9 -0
  121. package/vendor/abseil-cpp/absl/flags/flag.h +2 -1
  122. package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
  123. package/vendor/abseil-cpp/absl/flags/internal/flag.cc +3 -2
  124. package/vendor/abseil-cpp/absl/flags/marshalling.cc +1 -16
  125. package/vendor/abseil-cpp/absl/flags/parse.cc +4 -2
  126. package/vendor/abseil-cpp/absl/flags/parse_test.cc +1 -1
  127. package/vendor/abseil-cpp/absl/flags/reflection.cc +4 -3
  128. package/vendor/abseil-cpp/absl/functional/BUILD.bazel +4 -0
  129. package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +4 -0
  130. package/vendor/abseil-cpp/absl/functional/any_invocable.h +3 -1
  131. package/vendor/abseil-cpp/absl/functional/function_ref.h +125 -20
  132. package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +122 -9
  133. package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +13 -2
  134. package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +42 -4
  135. package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +11 -0
  136. package/vendor/abseil-cpp/absl/hash/hash_test.cc +5 -2
  137. package/vendor/abseil-cpp/absl/hash/internal/hash.cc +184 -53
  138. package/vendor/abseil-cpp/absl/hash/internal/hash.h +116 -10
  139. package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +43 -4
  140. package/vendor/abseil-cpp/absl/log/BUILD.bazel +2 -0
  141. package/vendor/abseil-cpp/absl/log/CMakeLists.txt +35 -1
  142. package/vendor/abseil-cpp/absl/log/check_test_impl.inc +59 -4
  143. package/vendor/abseil-cpp/absl/log/die_if_null.cc +3 -1
  144. package/vendor/abseil-cpp/absl/log/die_if_null.h +24 -3
  145. package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +31 -1
  146. package/vendor/abseil-cpp/absl/log/internal/check_impl.h +2 -1
  147. package/vendor/abseil-cpp/absl/log/internal/check_op.cc +3 -1
  148. package/vendor/abseil-cpp/absl/log/internal/check_op.h +44 -18
  149. package/vendor/abseil-cpp/absl/log/internal/conditions.h +38 -35
  150. package/vendor/abseil-cpp/absl/log/internal/container.h +312 -0
  151. package/vendor/abseil-cpp/absl/log/internal/container_test.cc +254 -0
  152. package/vendor/abseil-cpp/absl/log/internal/log_impl.h +108 -110
  153. package/vendor/abseil-cpp/absl/log/internal/log_message.cc +5 -2
  154. package/vendor/abseil-cpp/absl/log/internal/log_message.h +5 -1
  155. package/vendor/abseil-cpp/absl/log/internal/strip.h +30 -31
  156. package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +19 -19
  157. package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
  158. package/vendor/abseil-cpp/absl/log/log.h +2 -2
  159. package/vendor/abseil-cpp/absl/meta/BUILD.bazel +51 -0
  160. package/vendor/abseil-cpp/absl/meta/CMakeLists.txt +46 -0
  161. package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing.h +73 -0
  162. package/vendor/abseil-cpp/absl/meta/internal/constexpr_testing_test.cc +40 -0
  163. package/vendor/abseil-cpp/absl/meta/internal/requires.h +67 -0
  164. package/vendor/abseil-cpp/absl/meta/internal/requires_test.cc +66 -0
  165. package/vendor/abseil-cpp/absl/meta/type_traits.h +42 -1
  166. package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +14 -0
  167. package/vendor/abseil-cpp/absl/numeric/int128.h +41 -21
  168. package/vendor/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
  169. package/vendor/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
  170. package/vendor/abseil-cpp/absl/numeric/int128_test.cc +52 -5
  171. package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +1 -0
  172. package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +1 -0
  173. package/vendor/abseil-cpp/absl/profiling/hashtable.cc +18 -7
  174. package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +1 -0
  175. package/vendor/abseil-cpp/absl/random/internal/fastmath_test.cc +3 -5
  176. package/vendor/abseil-cpp/absl/random/internal/platform.h +0 -13
  177. package/vendor/abseil-cpp/absl/random/internal/randen_engine_test.cc +0 -1
  178. package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +1 -27
  179. package/vendor/abseil-cpp/absl/status/BUILD.bazel +17 -0
  180. package/vendor/abseil-cpp/absl/status/CMakeLists.txt +16 -0
  181. package/vendor/abseil-cpp/absl/status/internal/status_internal.h +4 -2
  182. package/vendor/abseil-cpp/absl/status/internal/status_matchers.h +2 -2
  183. package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +2 -1
  184. package/vendor/abseil-cpp/absl/status/status.cc +4 -0
  185. package/vendor/abseil-cpp/absl/status/status.h +5 -0
  186. package/vendor/abseil-cpp/absl/status/status_matchers.h +48 -0
  187. package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +27 -0
  188. package/vendor/abseil-cpp/absl/status/status_test.cc +1 -0
  189. package/vendor/abseil-cpp/absl/status/statusor.h +1 -1
  190. package/vendor/abseil-cpp/absl/strings/BUILD.bazel +101 -21
  191. package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +99 -5
  192. package/vendor/abseil-cpp/absl/strings/ascii.h +9 -4
  193. package/vendor/abseil-cpp/absl/strings/cord.cc +15 -10
  194. package/vendor/abseil-cpp/absl/strings/cord.h +1 -1
  195. package/vendor/abseil-cpp/absl/strings/escaping.cc +126 -94
  196. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
  197. package/vendor/abseil-cpp/absl/strings/internal/append_and_overwrite_test.cc +95 -0
  198. package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +2 -0
  199. package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc +8 -8
  200. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +24 -18
  201. package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +10 -16
  202. package/vendor/abseil-cpp/absl/strings/internal/escaping.h +9 -7
  203. package/vendor/abseil-cpp/absl/strings/internal/generic_printer.cc +107 -0
  204. package/vendor/abseil-cpp/absl/strings/internal/generic_printer.h +115 -0
  205. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_internal.h +423 -0
  206. package/vendor/abseil-cpp/absl/strings/internal/generic_printer_test.cc +685 -0
  207. package/vendor/abseil-cpp/absl/strings/internal/resize_uninitialized.h +0 -12
  208. package/vendor/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
  209. package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +21 -7
  210. package/vendor/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +495 -8
  211. package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -15
  212. package/vendor/abseil-cpp/absl/strings/numbers.cc +71 -8
  213. package/vendor/abseil-cpp/absl/strings/numbers.h +25 -12
  214. package/vendor/abseil-cpp/absl/strings/numbers_test.cc +70 -0
  215. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite.h +194 -0
  216. package/vendor/abseil-cpp/absl/strings/resize_and_overwrite_test.cc +154 -0
  217. package/vendor/abseil-cpp/absl/strings/str_cat.cc +96 -91
  218. package/vendor/abseil-cpp/absl/strings/str_cat.h +17 -12
  219. package/vendor/abseil-cpp/absl/strings/str_format_test.cc +4 -4
  220. package/vendor/abseil-cpp/absl/strings/str_split.h +1 -1
  221. package/vendor/abseil-cpp/absl/strings/str_split_test.cc +1 -1
  222. package/vendor/abseil-cpp/absl/strings/string_view.h +8 -718
  223. package/vendor/abseil-cpp/absl/strings/string_view_test.cc +1 -1265
  224. package/vendor/abseil-cpp/absl/strings/substitute.cc +24 -24
  225. package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +2 -3
  226. package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +1 -0
  227. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
  228. package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +15 -5
  229. package/vendor/abseil-cpp/absl/synchronization/mutex.cc +2 -1
  230. package/vendor/abseil-cpp/absl/synchronization/mutex.h +47 -23
  231. package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
  232. package/vendor/abseil-cpp/absl/time/CMakeLists.txt +2 -0
  233. package/vendor/abseil-cpp/absl/time/civil_time_benchmark.cc +1 -2
  234. package/vendor/abseil-cpp/absl/time/civil_time_test.cc +58 -103
  235. package/vendor/abseil-cpp/absl/time/clock.cc +18 -16
  236. package/vendor/abseil-cpp/absl/time/clock_test.cc +2 -2
  237. package/vendor/abseil-cpp/absl/time/duration_benchmark.cc +144 -0
  238. package/vendor/abseil-cpp/absl/time/duration_test.cc +26 -29
  239. package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +7 -1
  240. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +4 -2
  241. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
  242. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +186 -0
  243. package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
  244. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
  245. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +0 -0
  246. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +0 -0
  247. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +0 -0
  248. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +0 -0
  249. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab +9 -9
  250. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +12 -12
  251. package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +47 -47
  252. package/vendor/abseil-cpp/absl/time/time.cc +4 -4
  253. package/vendor/abseil-cpp/absl/time/time.h +10 -10
  254. package/vendor/abseil-cpp/absl/time/time_test.cc +1 -0
  255. package/vendor/abseil-cpp/absl/types/compare.h +62 -61
  256. package/vendor/abseil-cpp/absl/types/compare_test.cc +3 -3
  257. package/vendor/abseil-cpp/absl/types/internal/span.h +1 -0
  258. package/vendor/abseil-cpp/absl/types/optional.h +2 -2
  259. package/vendor/abseil-cpp/absl/types/span.h +10 -2
  260. package/vendor/abseil-cpp/absl/utility/utility.h +13 -0
  261. package/vendor/abseil-cpp/ci/absl_alternate_options.h +0 -1
  262. package/vendor/abseil-cpp/ci/cmake_common.sh +1 -1
  263. package/vendor/abseil-cpp/ci/cmake_install_test.sh +6 -0
  264. package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +1 -0
  265. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +2 -0
  266. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +1 -0
  267. package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +1 -0
  268. package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +1 -0
  269. package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +1 -0
  270. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +1 -0
  271. package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +6 -0
  272. package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +6 -0
  273. package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +3 -2
  274. package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +5 -0
  275. package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +1 -0
  276. package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +1 -0
  277. package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +6 -1
  278. package/vendor/abseil-cpp/absl/base/internal/identity.h +0 -39
  279. package/vendor/abseil-cpp/absl/strings/string_view.cc +0 -257
  280. package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +0 -380
@@ -0,0 +1,947 @@
1
+ // Copyright 2025 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/container/linked_hash_set.h"
16
+
17
+ #include <algorithm>
18
+ #include <cmath>
19
+ #include <cstddef>
20
+ #include <memory>
21
+ #include <string>
22
+ #include <utility>
23
+ #include <vector>
24
+
25
+ #include "gmock/gmock.h"
26
+ #include "gtest/gtest.h"
27
+ #include "absl/base/config.h"
28
+ #include "absl/container/internal/hash_generator_testing.h"
29
+ #include "absl/container/internal/hash_policy_testing.h"
30
+ #include "absl/container/internal/heterogeneous_lookup_testing.h"
31
+ #include "absl/container/internal/test_instance_tracker.h"
32
+ #include "absl/container/internal/unordered_set_constructor_test.h"
33
+ #include "absl/container/internal/unordered_set_lookup_test.h"
34
+ #include "absl/container/internal/unordered_set_members_test.h"
35
+ #include "absl/container/internal/unordered_set_modifiers_test.h"
36
+ #include "absl/strings/string_view.h"
37
+
38
+ namespace absl {
39
+ ABSL_NAMESPACE_BEGIN
40
+ namespace container_internal {
41
+ namespace {
42
+
43
+ using ::testing::ElementsAre;
44
+ using ::testing::ElementsAreArray;
45
+ using ::testing::Pointee;
46
+
47
+ template <class T>
48
+ using Set =
49
+ linked_hash_set<T, StatefulTestingHash, StatefulTestingEqual, Alloc<T>>;
50
+
51
+ using SetTypes =
52
+ ::testing::Types<Set<int>, Set<std::string>, Set<Enum>, Set<EnumClass>>;
53
+
54
+ INSTANTIATE_TYPED_TEST_SUITE_P(LinkedHashSet, ConstructorTest, SetTypes);
55
+ INSTANTIATE_TYPED_TEST_SUITE_P(LinkedHashSet, LookupTest, SetTypes);
56
+ INSTANTIATE_TYPED_TEST_SUITE_P(LinkedHashSet, MembersTest, SetTypes);
57
+ INSTANTIATE_TYPED_TEST_SUITE_P(LinkedHashSet, ModifiersTest, SetTypes);
58
+
59
+ // Tests that the range constructor works.
60
+ TEST(LinkedHashSetTest, RangeConstruct) {
61
+ const auto items = {1, 2, 3};
62
+ EXPECT_THAT(linked_hash_set<int>(items.begin(), items.end()),
63
+ ElementsAre(1, 2, 3));
64
+ }
65
+
66
+ // Tests that copying works.
67
+ TEST(LinkedHashSetTest, Copy) {
68
+ linked_hash_set<int> m{4, 8, 15, 16, 23, 42};
69
+ auto copy = m;
70
+
71
+ auto found = copy.find(8);
72
+ ASSERT_TRUE(found != copy.end());
73
+ for (auto iter = copy.begin(); iter != copy.end(); ++iter) {
74
+ if (iter == found) return;
75
+ }
76
+ FAIL() << "Copied set's find method returned an invalid iterator.";
77
+ }
78
+
79
+ // Tests that assignment works.
80
+ TEST(LinkedHashSetTest, Assign) {
81
+ linked_hash_set<int> m{2, 3};
82
+ linked_hash_set<int> n{4};
83
+
84
+ n = m;
85
+ EXPECT_TRUE(n.contains(2));
86
+ auto found = n.find(2);
87
+ ASSERT_TRUE(found != n.end());
88
+ for (auto iter = n.begin(); iter != n.end(); ++iter) {
89
+ if (iter == found) return;
90
+ }
91
+ FAIL() << "Assigned set's find method returned an invalid iterator.";
92
+ }
93
+
94
+ // Tests that self-assignment works.
95
+ TEST(LinkedHashSetTest, SelfAssign) {
96
+ linked_hash_set<int> a{1, 2, 3};
97
+ auto& a_ref = a;
98
+ a = a_ref;
99
+
100
+ EXPECT_TRUE(a.contains(2));
101
+ auto found = a.find(2);
102
+ ASSERT_TRUE(found != a.end());
103
+ for (auto iter = a.begin(); iter != a.end(); ++iter) {
104
+ if (iter == found) return;
105
+ }
106
+ FAIL() << "Assigned set's find method returned an invalid iterator.";
107
+ }
108
+
109
+ // Tests that move constructor works.
110
+ TEST(LinkedHashSetTest, Move) {
111
+ // Use unique_ptr as an example of a non-copyable type.
112
+ linked_hash_set<std::unique_ptr<int>> m;
113
+ m.insert(std::make_unique<int>(2));
114
+ m.insert(std::make_unique<int>(3));
115
+ linked_hash_set<std::unique_ptr<int>> n = std::move(m);
116
+ EXPECT_THAT(n, ElementsAre(Pointee(2), Pointee(3)));
117
+ }
118
+
119
+ // Tests that self-moving works.
120
+ TEST(LinkedHashSetTest, SelfMove) {
121
+ linked_hash_set<int> a{1, 2, 3};
122
+ auto& a_ref = a;
123
+ a = std::move(a_ref);
124
+ EXPECT_THAT(a, ElementsAre(1, 2, 3));
125
+ }
126
+
127
+ struct IntUniquePtrHash {
128
+ size_t operator()(const std::unique_ptr<int>& p) const {
129
+ return static_cast<size_t>(*p);
130
+ }
131
+ };
132
+
133
+ struct IntUniquePtrEq {
134
+ size_t operator()(const std::unique_ptr<int>& a,
135
+ const std::unique_ptr<int>& b) const {
136
+ return *a == *b;
137
+ }
138
+ };
139
+
140
+ // Pretty artificial for a set, but unique_ptr is a convenient move-only type.
141
+ TEST(LinkedHashSetTest, CanInsertMoveOnly) {
142
+ linked_hash_set<std::unique_ptr<int>, IntUniquePtrHash, IntUniquePtrEq> s;
143
+ std::vector<int> data = {4, 8, 15, 16, 23, 42};
144
+ for (int x : data) s.insert(std::make_unique<int>(x));
145
+ EXPECT_EQ(s.size(), data.size());
146
+ for (const std::unique_ptr<int>& elt : s) {
147
+ EXPECT_TRUE(s.contains(elt));
148
+ EXPECT_TRUE(s.find(elt) != s.end());
149
+ }
150
+ }
151
+
152
+ TEST(LinkedHashSetTest, CanMoveMoveOnly) {
153
+ linked_hash_set<std::unique_ptr<int>, IntUniquePtrHash, IntUniquePtrEq> s;
154
+ std::vector<int> data = {4, 8, 15, 16, 23, 42};
155
+ for (int x : data) s.insert(std::make_unique<int>(x));
156
+ linked_hash_set<std::unique_ptr<int>, IntUniquePtrHash, IntUniquePtrEq> ss =
157
+ std::move(s);
158
+ EXPECT_EQ(ss.size(), data.size());
159
+ }
160
+
161
+ TEST(LinkedHashSetTest, CanEmplaceMoveOnly) {
162
+ linked_hash_set<std::unique_ptr<int>, IntUniquePtrHash, IntUniquePtrEq> s;
163
+ std::vector<int> data = {4, 8, 15, 16, 23, 42};
164
+ for (const int x : data) {
165
+ s.emplace(new int{x});
166
+ }
167
+ EXPECT_EQ(s.size(), data.size());
168
+ for (const std::unique_ptr<int>& elt : s) {
169
+ EXPECT_TRUE(s.contains(elt));
170
+ EXPECT_TRUE(s.find(elt) != s.end());
171
+ }
172
+ }
173
+
174
+ TEST(LinkedHashSetTest, CanInsertTransparent) {
175
+ linked_hash_set<std::string> s;
176
+ s.insert(absl::string_view("foo"));
177
+ s.insert(absl::string_view("bar"));
178
+ s.insert(absl::string_view("foo"));
179
+ EXPECT_THAT(s, ElementsAre("foo", "bar"));
180
+ }
181
+
182
+ // Tests that iteration from begin() to end() works
183
+ TEST(LinkedHashSetTest, Iteration) {
184
+ linked_hash_set<int> m;
185
+ EXPECT_TRUE(m.begin() == m.end());
186
+
187
+ m.insert(2);
188
+ m.insert(1);
189
+ m.insert(3);
190
+
191
+ linked_hash_set<int>::iterator i = m.begin();
192
+ ASSERT_TRUE(m.begin() == i);
193
+ ASSERT_TRUE(m.end() != i);
194
+ EXPECT_EQ(2, *i);
195
+
196
+ ++i;
197
+ ASSERT_TRUE(m.end() != i);
198
+ EXPECT_EQ(1, *i);
199
+
200
+ ++i;
201
+ ASSERT_TRUE(m.end() != i);
202
+ EXPECT_EQ(3, *i);
203
+
204
+ ++i;
205
+ ASSERT_TRUE(m.end() == i);
206
+ }
207
+
208
+ // Tests that reverse iteration from rbegin() to rend() works
209
+ TEST(LinkedHashSetTest, ReverseIteration) {
210
+ linked_hash_set<int> m;
211
+ EXPECT_TRUE(m.rbegin() == m.rend());
212
+
213
+ m.insert(2);
214
+ m.insert(1);
215
+ m.insert(3);
216
+
217
+ linked_hash_set<int>::reverse_iterator i = m.rbegin();
218
+ ASSERT_TRUE(m.rbegin() == i);
219
+ ASSERT_TRUE(m.rend() != i);
220
+ EXPECT_EQ(3, *i);
221
+
222
+ ++i;
223
+ ASSERT_TRUE(m.rend() != i);
224
+ EXPECT_EQ(1, *i);
225
+
226
+ ++i;
227
+ ASSERT_TRUE(m.rend() != i);
228
+ EXPECT_EQ(2, *i);
229
+
230
+ ++i;
231
+ ASSERT_TRUE(m.rend() == i);
232
+ }
233
+
234
+ // Tests that clear() works
235
+ TEST(LinkedHashSetTest, Clear) {
236
+ linked_hash_set<int> m{2, 1, 3};
237
+ ASSERT_EQ(3, m.size());
238
+
239
+ m.clear();
240
+ EXPECT_EQ(0, m.size());
241
+ EXPECT_FALSE(m.contains(1));
242
+ EXPECT_TRUE(m.find(1) == m.end());
243
+
244
+ // Make sure we can call it on an empty set.
245
+ m.clear();
246
+ EXPECT_EQ(0, m.size());
247
+ }
248
+
249
+ // Tests that size() works.
250
+ TEST(LinkedHashSetTest, Size) {
251
+ linked_hash_set<int> m;
252
+ EXPECT_EQ(0, m.size());
253
+ m.insert(2);
254
+ EXPECT_EQ(1, m.size());
255
+ m.insert(11);
256
+ EXPECT_EQ(2, m.size());
257
+ m.insert(0);
258
+ EXPECT_EQ(3, m.size());
259
+ m.insert(0);
260
+ EXPECT_EQ(3, m.size());
261
+ m.clear();
262
+ EXPECT_EQ(0, m.size());
263
+ }
264
+
265
+ // Tests empty()
266
+ TEST(LinkedHashSetTest, Empty) {
267
+ linked_hash_set<int> m;
268
+ ASSERT_TRUE(m.empty());
269
+ m.insert(2);
270
+ ASSERT_FALSE(m.empty());
271
+ m.clear();
272
+ ASSERT_TRUE(m.empty());
273
+ }
274
+
275
+ TEST(LinkedHashSetTest, Erase) {
276
+ linked_hash_set<int> m;
277
+ ASSERT_EQ(0, m.size());
278
+ EXPECT_EQ(0, m.erase(2)); // Nothing to erase yet
279
+
280
+ m.insert(2);
281
+ ASSERT_EQ(1, m.size());
282
+ EXPECT_EQ(1, m.erase(2));
283
+ EXPECT_EQ(0, m.size());
284
+ EXPECT_TRUE(m.empty());
285
+
286
+ EXPECT_EQ(0, m.erase(2)); // Make sure nothing bad happens if we repeat.
287
+ EXPECT_EQ(0, m.size());
288
+ EXPECT_TRUE(m.empty());
289
+ }
290
+
291
+ TEST(LinkedHashSetTest, Erase2) {
292
+ linked_hash_set<int> m;
293
+ ASSERT_EQ(0, m.size());
294
+ EXPECT_EQ(0, m.erase(2)); // Nothing to erase yet
295
+
296
+ m.insert(2);
297
+ m.insert(1);
298
+ m.insert(3);
299
+ m.insert(4);
300
+ ASSERT_EQ(4, m.size());
301
+
302
+ // Erase middle two
303
+ EXPECT_EQ(1, m.erase(1));
304
+ EXPECT_EQ(1, m.erase(3));
305
+
306
+ EXPECT_EQ(2, m.size());
307
+
308
+ // Make sure we can still iterate over everything that's left.
309
+ linked_hash_set<int>::iterator it = m.begin();
310
+ ASSERT_TRUE(it != m.end());
311
+ EXPECT_EQ(2, *it);
312
+ ++it;
313
+ ASSERT_TRUE(it != m.end());
314
+ EXPECT_EQ(4, *it);
315
+ ++it;
316
+ ASSERT_TRUE(it == m.end());
317
+
318
+ EXPECT_EQ(0, m.erase(1)); // Make sure nothing bad happens if we repeat.
319
+ ASSERT_EQ(2, m.size());
320
+
321
+ EXPECT_EQ(1, m.erase(2));
322
+ EXPECT_EQ(1, m.erase(4));
323
+ ASSERT_EQ(0, m.size());
324
+ EXPECT_TRUE(m.empty());
325
+
326
+ EXPECT_EQ(0, m.erase(1)); // Make sure nothing bad happens if we repeat.
327
+ ASSERT_EQ(0, m.size());
328
+ EXPECT_TRUE(m.empty());
329
+ }
330
+
331
+ // Test that erase(iter,iter) and erase(iter) compile and work.
332
+ TEST(LinkedHashSetTest, Erase3) {
333
+ linked_hash_set<int> m;
334
+
335
+ m.insert(1);
336
+ m.insert(2);
337
+ m.insert(3);
338
+ m.insert(4);
339
+
340
+ // Erase middle two
341
+ linked_hash_set<int>::iterator it2 = m.find(2);
342
+ linked_hash_set<int>::iterator it4 = m.find(4);
343
+ EXPECT_EQ(m.erase(it2, it4), m.find(4));
344
+ EXPECT_FALSE(m.contains(2));
345
+ EXPECT_TRUE(m.find(2) == m.end());
346
+ EXPECT_FALSE(m.contains(3));
347
+ EXPECT_TRUE(m.find(3) == m.end());
348
+ EXPECT_EQ(2, m.size());
349
+
350
+ // Make sure we can still iterate over everything that's left.
351
+ linked_hash_set<int>::iterator it = m.begin();
352
+ ASSERT_TRUE(it != m.end());
353
+ EXPECT_EQ(1, *it);
354
+ ++it;
355
+ ASSERT_TRUE(it != m.end());
356
+ EXPECT_EQ(4, *it);
357
+ ++it;
358
+ ASSERT_TRUE(it == m.end());
359
+
360
+ // Erase first one using an iterator.
361
+ EXPECT_EQ(m.erase(m.begin()), m.find(4));
362
+ EXPECT_FALSE(m.contains(1));
363
+ EXPECT_TRUE(m.find(1) == m.end());
364
+
365
+ // Only the last element should be left.
366
+ EXPECT_TRUE(m.contains(4));
367
+ it = m.begin();
368
+ ASSERT_TRUE(it != m.end());
369
+ EXPECT_EQ(4, *it);
370
+ ++it;
371
+ ASSERT_TRUE(it == m.end());
372
+ }
373
+
374
+ // Test all types of insertion
375
+ TEST(LinkedHashSetTest, Insertion) {
376
+ linked_hash_set<int> m;
377
+ ASSERT_EQ(0, m.size());
378
+ std::pair<linked_hash_set<int>::iterator, bool> result;
379
+
380
+ result = m.insert(2);
381
+ ASSERT_EQ(1, m.size());
382
+ EXPECT_TRUE(result.second);
383
+ EXPECT_EQ(2, *result.first);
384
+ EXPECT_TRUE(m.contains(2));
385
+ EXPECT_TRUE(m.find(2) != m.end());
386
+
387
+ result = m.insert(1);
388
+ ASSERT_EQ(2, m.size());
389
+ EXPECT_TRUE(result.second);
390
+ EXPECT_EQ(1, *result.first);
391
+ EXPECT_TRUE(m.contains(1));
392
+ EXPECT_TRUE(m.find(1) != m.end());
393
+
394
+ result = m.insert(3);
395
+ linked_hash_set<int>::iterator result_iterator = result.first;
396
+ ASSERT_EQ(3, m.size());
397
+ EXPECT_TRUE(result.second);
398
+ EXPECT_EQ(3, *result.first);
399
+ EXPECT_TRUE(m.contains(3));
400
+ EXPECT_TRUE(m.find(3) != m.end());
401
+
402
+ result = m.insert(3);
403
+ EXPECT_EQ(3, m.size());
404
+ EXPECT_FALSE(result.second) << "No insertion should have occurred.";
405
+ EXPECT_TRUE(result_iterator == result.first)
406
+ << "Duplicate insertion should have given us the original iterator.";
407
+ EXPECT_TRUE(m.contains(3));
408
+ EXPECT_TRUE(m.find(3) != m.end());
409
+
410
+ std::vector<int> v = {3, 4, 5};
411
+ m.insert(v.begin(), v.end());
412
+ // Expect 4 and 5 inserted, 3 not inserted.
413
+ EXPECT_EQ(5, m.size());
414
+ EXPECT_TRUE(m.contains(4));
415
+ EXPECT_NE(m.find(4), m.end());
416
+ EXPECT_TRUE(m.contains(5));
417
+ EXPECT_NE(m.find(5), m.end());
418
+ }
419
+
420
+ TEST(LinkedHashSetTest, HintedInsertionMoveable) {
421
+ linked_hash_set<int> m = {1, 3};
422
+ m.insert(m.find(3), 2);
423
+ EXPECT_THAT(m, ElementsAre(1, 2, 3));
424
+ }
425
+
426
+ TEST(LinkedHashSetTest, HintedInsertionReference) {
427
+ linked_hash_set<int> m = {1, 3};
428
+ const int val = 2;
429
+ m.insert(m.find(3), val);
430
+ EXPECT_THAT(m, ElementsAre(1, 2, 3));
431
+ }
432
+
433
+ TEST(LinkedHashSetTest, HintedEmplaceMoveable) {
434
+ linked_hash_set<int> m = {1, 3};
435
+ m.emplace_hint(m.find(3), 2);
436
+ EXPECT_THAT(m, ElementsAre(1, 2, 3));
437
+ }
438
+
439
+ TEST(LinkedHashSetTest, HintedEmplaceReference) {
440
+ linked_hash_set<int> m = {1, 3};
441
+ const int val = 2;
442
+ m.emplace_hint(m.find(3), val);
443
+ EXPECT_THAT(m, ElementsAre(1, 2, 3));
444
+ }
445
+
446
+ // Test front accessors.
447
+ TEST(LinkedHashSetTest, Front) {
448
+ linked_hash_set<int> m;
449
+
450
+ m.insert(222);
451
+ m.insert(111);
452
+ m.insert(333);
453
+
454
+ EXPECT_EQ(3, m.size());
455
+ EXPECT_EQ(222, m.front());
456
+ m.pop_front();
457
+ EXPECT_EQ(2, m.size());
458
+ EXPECT_EQ(111, m.front());
459
+ m.pop_front();
460
+ EXPECT_EQ(1, m.size());
461
+ EXPECT_EQ(333, m.front());
462
+ m.pop_front();
463
+ EXPECT_TRUE(m.empty());
464
+ }
465
+
466
+ // Test back accessors.
467
+ TEST(LinkedHashSetTest, Back) {
468
+ linked_hash_set<int> m;
469
+
470
+ m.insert(222);
471
+ m.insert(111);
472
+ m.insert(333);
473
+
474
+ EXPECT_EQ(3, m.size());
475
+ EXPECT_EQ(333, m.back());
476
+ m.pop_back();
477
+ EXPECT_EQ(2, m.size());
478
+ EXPECT_EQ(111, m.back());
479
+ m.pop_back();
480
+ EXPECT_EQ(1, m.size());
481
+ EXPECT_EQ(222, m.back());
482
+ m.pop_back();
483
+ EXPECT_TRUE(m.empty());
484
+ }
485
+
486
+ TEST(LinkedHashSetTest, Find) {
487
+ linked_hash_set<int> m;
488
+
489
+ EXPECT_TRUE(m.end() == m.find(1))
490
+ << "We shouldn't find anything in an empty set.";
491
+
492
+ m.insert(2);
493
+ EXPECT_TRUE(m.end() == m.find(1))
494
+ << "We shouldn't find an element that doesn't exist in the set.";
495
+
496
+ std::pair<linked_hash_set<int>::iterator, bool> result = m.insert(1);
497
+ ASSERT_TRUE(result.second);
498
+ ASSERT_TRUE(m.end() != result.first);
499
+ EXPECT_TRUE(result.first == m.find(1))
500
+ << "We should have found an element we know exists in the set.";
501
+ EXPECT_EQ(1, *result.first);
502
+
503
+ // Check that a follow-up insertion doesn't affect our original
504
+ m.insert(3);
505
+ linked_hash_set<int>::iterator it = m.find(1);
506
+ ASSERT_TRUE(m.end() != it);
507
+ EXPECT_EQ(1, *it);
508
+
509
+ m.clear();
510
+ EXPECT_TRUE(m.end() == m.find(1))
511
+ << "We shouldn't find anything in a set that we've cleared.";
512
+ }
513
+
514
+ TEST(LinkedHashSetTest, Contains) {
515
+ linked_hash_set<int> m;
516
+
517
+ EXPECT_FALSE(m.contains(1)) << "The empty set shouldn't contain anything.";
518
+
519
+ m.insert(2);
520
+ EXPECT_FALSE(m.contains(1))
521
+ << "contains() should not return true for an element that doesn't exist "
522
+ << "in the set.";
523
+
524
+ m.insert(1);
525
+ EXPECT_TRUE(m.contains(1))
526
+ << "contains() should return true for an element we know exists in the "
527
+ << "set.";
528
+
529
+ m.clear();
530
+ EXPECT_FALSE(m.contains(1))
531
+ << "A set that we've cleared shouldn't contain anything.";
532
+ }
533
+
534
+ TEST(LinkedHashSetTest, Swap) {
535
+ linked_hash_set<int> m1;
536
+ linked_hash_set<int> m2;
537
+ m1.insert(1);
538
+ m1.insert(2);
539
+ m2.insert(3);
540
+ ASSERT_EQ(2, m1.size());
541
+ ASSERT_EQ(1, m2.size());
542
+ m1.swap(m2);
543
+ ASSERT_EQ(1, m1.size());
544
+ ASSERT_EQ(2, m2.size());
545
+ }
546
+
547
+ TEST(LinkedHashSetTest, SelfSwap) {
548
+ linked_hash_set<int> a{1, 2, 3};
549
+ using std::swap;
550
+ swap(a, a);
551
+ EXPECT_THAT(a, ElementsAre(1, 2, 3));
552
+ }
553
+
554
+ TEST(LinkedHashSetTest, InitializerList) {
555
+ linked_hash_set<int> m{1, 3};
556
+ ASSERT_EQ(2, m.size());
557
+ EXPECT_TRUE(m.contains(1));
558
+ linked_hash_set<int>::iterator it = m.find(1);
559
+ ASSERT_TRUE(m.end() != it);
560
+ EXPECT_EQ(1, *it);
561
+ it = m.find(3);
562
+ EXPECT_TRUE(m.contains(3));
563
+ ASSERT_TRUE(m.end() != it);
564
+ EXPECT_EQ(3, *it);
565
+ }
566
+
567
+ TEST(LinkedHashSetTest, CustomHashAndEquality) {
568
+ struct CustomIntHash {
569
+ size_t operator()(int x) const { return 0; }
570
+ };
571
+ struct CustomIntEq {
572
+ bool operator()(int x, int y) const { return abs(x) == abs(y); }
573
+ };
574
+ linked_hash_set<int, CustomIntHash, CustomIntEq> m;
575
+ m.insert(1);
576
+ EXPECT_EQ(1, m.size());
577
+ m.insert(2);
578
+ EXPECT_EQ(2, m.size());
579
+ EXPECT_FALSE(m.insert(-2).second);
580
+ EXPECT_EQ(2, m.size());
581
+ EXPECT_TRUE(m.contains(-1));
582
+ EXPECT_TRUE(m.find(-1) != m.end());
583
+ }
584
+
585
+ TEST(LinkedHashSetTest, EqualRange) {
586
+ linked_hash_set<int> m{3, 1};
587
+ const auto& const_m = m;
588
+
589
+ EXPECT_THAT(m.equal_range(2), testing::Pair(m.end(), m.end()));
590
+ EXPECT_THAT(const_m.equal_range(2),
591
+ testing::Pair(const_m.end(), const_m.end()));
592
+
593
+ EXPECT_THAT(m.equal_range(1), testing::Pair(m.find(1), ++m.find(1)));
594
+ EXPECT_THAT(const_m.equal_range(1),
595
+ testing::Pair(const_m.find(1), ++const_m.find(1)));
596
+ }
597
+
598
+ TEST(LinkedHashSetTest, ReserveWorks) {
599
+ linked_hash_set<int> m;
600
+ EXPECT_EQ(0, m.size());
601
+ EXPECT_EQ(0.0, m.load_factor());
602
+ m.reserve(10);
603
+ EXPECT_LE(10, m.capacity());
604
+ EXPECT_EQ(0, m.size());
605
+ EXPECT_EQ(0.0, m.load_factor());
606
+ m.insert(1);
607
+ m.insert(2);
608
+ EXPECT_LE(10, m.capacity());
609
+ EXPECT_EQ(2, m.size());
610
+ EXPECT_LT(0.0, m.load_factor());
611
+ }
612
+
613
+ TEST(LinkedHashSetTest, HeterogeneousTests) {
614
+ absl::test_internal::InstanceTracker tracker;
615
+
616
+ linked_hash_set<ExpensiveType, HeterogeneousHash, HeterogeneousEqual> set;
617
+ ExpensiveType one(1);
618
+ tracker.ResetCopiesMovesSwaps();
619
+ set.insert(one);
620
+ // Two instances: 'one' var and an instance in the set.
621
+ EXPECT_EQ(2, tracker.instances());
622
+ EXPECT_EQ(1, tracker.copies());
623
+ EXPECT_EQ(0, tracker.moves());
624
+
625
+ tracker.ResetCopiesMovesSwaps();
626
+ set.insert(one);
627
+ // No construction since key==1 exists.
628
+ EXPECT_EQ(2, tracker.instances());
629
+ EXPECT_EQ(0, tracker.copies());
630
+ EXPECT_EQ(0, tracker.moves());
631
+
632
+ tracker.ResetCopiesMovesSwaps();
633
+ set.emplace(CheapType(1));
634
+ // No construction since key==1 exists.
635
+ EXPECT_EQ(2, tracker.instances());
636
+ EXPECT_EQ(0, tracker.copies());
637
+ EXPECT_EQ(0, tracker.moves());
638
+
639
+ tracker.ResetCopiesMovesSwaps();
640
+ set.emplace(CheapType(2));
641
+ // Construction since key==2 doesn't exist in the set.
642
+ EXPECT_EQ(3, tracker.instances());
643
+ EXPECT_EQ(0, tracker.copies());
644
+ EXPECT_EQ(0, tracker.moves());
645
+ EXPECT_THAT(set, ElementsAre(HasExpensiveValue(1), HasExpensiveValue(2)));
646
+
647
+ // find
648
+ tracker.ResetCopiesMovesSwaps();
649
+ auto itr = set.find(CheapType(1));
650
+ ASSERT_NE(itr, set.end());
651
+ EXPECT_EQ(1, itr->value());
652
+ // contains
653
+ EXPECT_TRUE(set.contains(CheapType(2)));
654
+ // count
655
+ EXPECT_EQ(1, set.count(CheapType(2)));
656
+ // equal_range
657
+ auto eq_itr_pair = set.equal_range(CheapType(2));
658
+ ASSERT_NE(eq_itr_pair.first, set.end());
659
+ EXPECT_EQ(2, eq_itr_pair.first->value());
660
+ // No construction for find, contains, count or equal_range.
661
+ EXPECT_EQ(3, tracker.instances());
662
+ EXPECT_EQ(0, tracker.copies());
663
+ EXPECT_EQ(0, tracker.moves());
664
+
665
+ // emplace
666
+ tracker.ResetCopiesMovesSwaps();
667
+ set.emplace(3);
668
+ // Just one construction.
669
+ EXPECT_EQ(4, tracker.instances());
670
+ EXPECT_EQ(0, tracker.copies());
671
+ EXPECT_EQ(0, tracker.moves());
672
+
673
+ tracker.ResetCopiesMovesSwaps();
674
+ set.emplace(3);
675
+ // No additional construction since key==3 exists.
676
+ EXPECT_EQ(4, tracker.instances());
677
+ EXPECT_EQ(0, tracker.copies());
678
+ EXPECT_EQ(0, tracker.moves());
679
+ EXPECT_THAT(set, ElementsAre(HasExpensiveValue(1), HasExpensiveValue(2),
680
+ HasExpensiveValue(3)));
681
+
682
+ // Test std::move() using insert().
683
+ ExpensiveType four(4);
684
+ tracker.ResetCopiesMovesSwaps();
685
+ set.insert(std::move(four));
686
+ // Two constructions (regular and move).
687
+ EXPECT_EQ(6, tracker.instances());
688
+ EXPECT_EQ(0, tracker.copies());
689
+ EXPECT_EQ(1, tracker.moves());
690
+
691
+ EXPECT_THAT(set, ElementsAre(HasExpensiveValue(1), HasExpensiveValue(2),
692
+ HasExpensiveValue(3), HasExpensiveValue(4)));
693
+
694
+ tracker.ResetCopiesMovesSwaps();
695
+ set.erase(CheapType(1));
696
+ // No construction and instance reduced by one.
697
+ EXPECT_EQ(5, tracker.instances());
698
+ EXPECT_EQ(0, tracker.copies());
699
+ EXPECT_EQ(0, tracker.moves());
700
+ EXPECT_THAT(set, ElementsAre(HasExpensiveValue(2), HasExpensiveValue(3),
701
+ HasExpensiveValue(4)));
702
+ }
703
+
704
+ TEST(LinkedHashSetTest, HeterogeneousStringViewLookup) {
705
+ linked_hash_set<std::string> set;
706
+ set.insert("foo");
707
+ set.insert("bar");
708
+ set.insert("blah");
709
+
710
+ {
711
+ absl::string_view lookup("foo");
712
+ auto itr = set.find(lookup);
713
+ ASSERT_NE(itr, set.end());
714
+ EXPECT_EQ("foo", *itr);
715
+ }
716
+
717
+ // Not found.
718
+ {
719
+ absl::string_view lookup("foobar");
720
+ EXPECT_EQ(set.end(), set.find(lookup));
721
+ }
722
+
723
+ {
724
+ absl::string_view lookup("blah");
725
+ auto itr = set.find(lookup);
726
+ ASSERT_NE(itr, set.end());
727
+ EXPECT_EQ("blah", *itr);
728
+ }
729
+ }
730
+
731
+ TEST(LinkedHashSetTest, EmplaceString) {
732
+ std::vector<std::string> v = {"a", "b"};
733
+ linked_hash_set<absl::string_view> hs(v.begin(), v.end());
734
+ EXPECT_THAT(hs, ElementsAreArray(v));
735
+ }
736
+
737
+ TEST(LinkedHashSetTest, BitfieldArgument) {
738
+ union {
739
+ int n : 1;
740
+ };
741
+ n = 0;
742
+ linked_hash_set<int> s = {n};
743
+ s.insert(n);
744
+ s.insert(s.end(), n);
745
+ s.insert({n});
746
+ s.erase(n);
747
+ s.count(n);
748
+ s.find(n);
749
+ s.contains(n);
750
+ s.equal_range(n);
751
+ }
752
+
753
+ TEST(LinkedHashSetTest, MergeExtractInsert) {
754
+ struct Hash {
755
+ size_t operator()(const std::unique_ptr<int>& p) const { return *p; }
756
+ };
757
+ struct Eq {
758
+ bool operator()(const std::unique_ptr<int>& a,
759
+ const std::unique_ptr<int>& b) const {
760
+ return *a == *b;
761
+ }
762
+ };
763
+ linked_hash_set<std::unique_ptr<int>, Hash, Eq> set1, set2;
764
+ set1.insert(std::make_unique<int>(7));
765
+ set1.insert(std::make_unique<int>(17));
766
+
767
+ set2.insert(std::make_unique<int>(7));
768
+ set2.insert(std::make_unique<int>(19));
769
+
770
+ EXPECT_THAT(set1, ElementsAre(Pointee(7), Pointee(17)));
771
+ EXPECT_THAT(set2, ElementsAre(Pointee(7), Pointee(19)));
772
+
773
+ set1.merge(set2);
774
+
775
+ EXPECT_THAT(set1, ElementsAre(Pointee(7), Pointee(17), Pointee(19)));
776
+ EXPECT_THAT(set2, ElementsAre(Pointee(7)));
777
+
778
+ auto node = set1.extract(std::make_unique<int>(7));
779
+ EXPECT_TRUE(node);
780
+ EXPECT_THAT(node.value(), Pointee(7));
781
+ EXPECT_THAT(set1, ElementsAre(Pointee(17), Pointee(19)));
782
+
783
+ auto insert_result = set2.insert(std::move(node));
784
+ EXPECT_FALSE(node);
785
+ EXPECT_FALSE(insert_result.inserted);
786
+ EXPECT_TRUE(insert_result.node);
787
+ EXPECT_THAT(insert_result.node.value(), Pointee(7));
788
+ EXPECT_EQ(**insert_result.position, 7);
789
+ EXPECT_NE(insert_result.position->get(), insert_result.node.value().get());
790
+ EXPECT_THAT(set2, ElementsAre(Pointee(7)));
791
+
792
+ node = set1.extract(std::make_unique<int>(17));
793
+ EXPECT_TRUE(node);
794
+ EXPECT_THAT(node.value(), Pointee(17));
795
+ EXPECT_THAT(set1, ElementsAre(Pointee(19)));
796
+
797
+ node.value() = std::make_unique<int>(23);
798
+
799
+ insert_result = set2.insert(std::move(node));
800
+ EXPECT_FALSE(node);
801
+ EXPECT_TRUE(insert_result.inserted);
802
+ EXPECT_FALSE(insert_result.node);
803
+ EXPECT_EQ(**insert_result.position, 23);
804
+ EXPECT_THAT(set2, ElementsAre(Pointee(7), Pointee(23)));
805
+ }
806
+
807
+ TEST(LinkedHashSet, ExtractInsert) {
808
+ linked_hash_set<int> s = {1, 7, 2, 9};
809
+ auto node = s.extract(1);
810
+ EXPECT_TRUE(node);
811
+ EXPECT_EQ(node.value(), 1);
812
+ EXPECT_THAT(s, ElementsAre(7, 2, 9));
813
+ EXPECT_FALSE(s.contains(1));
814
+
815
+ node.value() = 17;
816
+ s.insert(std::move(node));
817
+ EXPECT_FALSE(node);
818
+ EXPECT_THAT(s, ElementsAre(7, 2, 9, 17));
819
+ EXPECT_TRUE(s.contains(17));
820
+
821
+ node = s.extract(s.find(9));
822
+ EXPECT_TRUE(node);
823
+ EXPECT_EQ(node.value(), 9);
824
+ EXPECT_THAT(s, ElementsAre(7, 2, 17));
825
+ EXPECT_FALSE(s.contains(9));
826
+ }
827
+
828
+ TEST(LinkedHashSet, Merge) {
829
+ linked_hash_set<int> m = {1, 7, 3, 6, 10};
830
+ linked_hash_set<int> src = {1, 2, 9, 10, 4, 16};
831
+
832
+ m.merge(src);
833
+
834
+ EXPECT_THAT(m, ElementsAre(1, 7, 3, 6, 10, 2, 9, 4, 16));
835
+ for (int i : {1, 7, 3, 6, 10, 2, 9, 4, 16}) {
836
+ EXPECT_TRUE(m.contains(i));
837
+ }
838
+ EXPECT_THAT(src, ElementsAre(1, 10));
839
+ for (int i : {1, 10}) {
840
+ EXPECT_TRUE(src.contains(i));
841
+ }
842
+ for (int i : {2, 9, 4, 16}) {
843
+ EXPECT_FALSE(src.contains(i));
844
+ }
845
+ }
846
+
847
+ TEST(LinkedHashSet, EraseRange) {
848
+ linked_hash_set<int> set = {1, 2, 3, 4, 5, 25, 36, 7, 8, 9, 81};
849
+ auto start = set.find(3);
850
+ auto end = set.find(8);
851
+ auto itr = set.erase(start, end);
852
+ ASSERT_NE(itr, set.end());
853
+ EXPECT_THAT(*itr, 8);
854
+ EXPECT_THAT(set, ElementsAre(1, 2, 8, 9, 81));
855
+ for (int i : {1, 2, 8, 9, 81}) {
856
+ EXPECT_TRUE(set.contains(i));
857
+ }
858
+ for (int i : {3, 4, 5, 25, 36, 7}) {
859
+ EXPECT_FALSE(set.contains(i));
860
+ }
861
+ }
862
+
863
+ TEST(LinkedHashSet, InsertInitializerList) {
864
+ linked_hash_set<int> set;
865
+ set.insert({1, 7, 2, 9, 3, 29});
866
+ EXPECT_THAT(set, ElementsAre(1, 7, 2, 9, 3, 29));
867
+ for (int i : {1, 7, 2, 9, 3, 29}) {
868
+ EXPECT_TRUE(set.contains(i));
869
+ }
870
+ }
871
+
872
+ struct CountedHash {
873
+ explicit CountedHash(int* count) : count(count) {}
874
+ size_t operator()(int value) const {
875
+ ++(*count);
876
+ return value;
877
+ }
878
+ int* count = nullptr;
879
+ };
880
+
881
+ // Makes a set too big for small object optimization. Counts the number of
882
+ // hashes in `count`, but leaves `count` set to 0.
883
+ linked_hash_set<int, CountedHash> MakeNonSmallSet(int* count) {
884
+ const int kFirstKey = -1000;
885
+ linked_hash_set<int, CountedHash> s(0, CountedHash(count));
886
+ for (int i = kFirstKey; i < kFirstKey + 100; ++i) {
887
+ s.insert(i);
888
+ }
889
+ *count = 0;
890
+ return s;
891
+ }
892
+
893
+ constexpr bool BuildHasDebugModeRehashes() {
894
+ #if !defined(NDEBUG) || defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
895
+ defined(ABSL_HAVE_MEMORY_SANITIZER) || defined(ABSL_HAVE_THREAD_SANITIZER)
896
+ return true;
897
+ #else
898
+ return false;
899
+ #endif
900
+ }
901
+
902
+ TEST(LinkedHashSetTest, HashCountInOptBuilds) {
903
+ if (BuildHasDebugModeRehashes()) {
904
+ GTEST_SKIP() << "Only run under NDEBUG: `assert` statements and sanitizer "
905
+ "rehashing may cause redundant hashing.";
906
+ }
907
+
908
+ using Set = linked_hash_set<int, CountedHash>;
909
+ {
910
+ int count = 0;
911
+ Set s = MakeNonSmallSet(&count);
912
+ s.insert(1);
913
+ EXPECT_EQ(count, 1);
914
+ s.erase(1);
915
+ EXPECT_EQ(count, 2);
916
+ }
917
+ {
918
+ int count = 0;
919
+ Set s = MakeNonSmallSet(&count);
920
+ s.insert(3);
921
+ EXPECT_EQ(count, 1);
922
+ auto node = s.extract(3);
923
+ EXPECT_EQ(count, 2);
924
+ s.insert(std::move(node));
925
+ EXPECT_EQ(count, 3);
926
+ }
927
+ {
928
+ int count = 0;
929
+ Set s = MakeNonSmallSet(&count);
930
+ s.emplace(5);
931
+ EXPECT_EQ(count, 1);
932
+ }
933
+ {
934
+ int src_count = 0, dst_count = 0;
935
+ Set src = MakeNonSmallSet(&src_count);
936
+ Set dst = MakeNonSmallSet(&dst_count);
937
+ src.insert(7);
938
+ dst.merge(src);
939
+ EXPECT_LE(src_count, 200);
940
+ EXPECT_LE(dst_count, 200);
941
+ }
942
+ }
943
+
944
+ } // namespace
945
+ } // namespace container_internal
946
+ ABSL_NAMESPACE_END
947
+ } // namespace absl