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,987 @@
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_map.h"
16
+
17
+ #include <algorithm>
18
+ #include <cstddef>
19
+ #include <memory>
20
+ #include <string>
21
+ #include <tuple>
22
+ #include <type_traits>
23
+ #include <utility>
24
+ #include <vector>
25
+
26
+ #include "gmock/gmock.h"
27
+ #include "gtest/gtest.h"
28
+ #include "absl/base/config.h"
29
+ #include "absl/base/internal/exception_testing.h"
30
+ #include "absl/container/internal/hash_generator_testing.h"
31
+ #include "absl/container/internal/hash_policy_testing.h"
32
+ #include "absl/container/internal/heterogeneous_lookup_testing.h"
33
+ #include "absl/container/internal/test_instance_tracker.h"
34
+ #include "absl/container/internal/unordered_map_constructor_test.h"
35
+ #include "absl/container/internal/unordered_map_lookup_test.h"
36
+ #include "absl/container/internal/unordered_map_members_test.h"
37
+ #include "absl/container/internal/unordered_map_modifiers_test.h"
38
+ #include "absl/strings/string_view.h"
39
+
40
+ namespace absl {
41
+ ABSL_NAMESPACE_BEGIN
42
+ namespace container_internal {
43
+ namespace {
44
+
45
+ using ::testing::ElementsAre;
46
+ using ::testing::Pair;
47
+ using ::testing::Pointee;
48
+
49
+ template <class K, class V>
50
+ using Map = linked_hash_map<K, V, StatefulTestingHash, StatefulTestingEqual,
51
+ Alloc<std::pair<const K, V>>>;
52
+
53
+ static_assert(!std::is_standard_layout<NonStandardLayout>(), "");
54
+
55
+ using MapTypes =
56
+ ::testing::Types<Map<int, int>, Map<std::string, int>,
57
+ Map<Enum, std::string>, Map<EnumClass, int>,
58
+ Map<int, NonStandardLayout>, Map<NonStandardLayout, int>>;
59
+
60
+ INSTANTIATE_TYPED_TEST_SUITE_P(LinkedHashMap, ConstructorTest, MapTypes);
61
+ INSTANTIATE_TYPED_TEST_SUITE_P(LinkedHashMap, LookupTest, MapTypes);
62
+ INSTANTIATE_TYPED_TEST_SUITE_P(LinkedHashMap, MembersTest, MapTypes);
63
+ INSTANTIATE_TYPED_TEST_SUITE_P(LinkedHashMap, ModifiersTest, MapTypes);
64
+
65
+ // Tests that the range constructor works.
66
+ TEST(LinkedHashMapTest, RangeConstruct) {
67
+ const std::pair<int, int> items[] = {{1, 2}, {2, 3}, {3, 4}};
68
+ EXPECT_THAT((linked_hash_map<int, int>(std::begin(items), std::end(items))),
69
+ ElementsAre(Pair(1, 2), Pair(2, 3), Pair(3, 4)));
70
+ }
71
+
72
+ // Tests that copying works.
73
+ TEST(LinkedHashMapTest, Copy) {
74
+ linked_hash_map<int, int> m{{2, 12}, {3, 13}};
75
+ auto copy = m;
76
+
77
+ EXPECT_TRUE(copy.contains(2));
78
+ auto found = copy.find(2);
79
+ ASSERT_TRUE(found != copy.end());
80
+ for (auto iter = copy.begin(); iter != copy.end(); ++iter) {
81
+ if (iter == found) return;
82
+ }
83
+ FAIL() << "Copied map's find method returned an invalid iterator.";
84
+ }
85
+
86
+ // Tests that assignment works.
87
+ TEST(LinkedHashMapTest, Assign) {
88
+ linked_hash_map<int, int> m{{2, 12}, {3, 13}};
89
+ linked_hash_map<int, int> n{{4, 14}};
90
+
91
+ n = m;
92
+ EXPECT_TRUE(n.contains(2));
93
+ auto found = n.find(2);
94
+ ASSERT_TRUE(found != n.end());
95
+ for (auto iter = n.begin(); iter != n.end(); ++iter) {
96
+ if (iter == found) return;
97
+ }
98
+ FAIL() << "Assigned map's find method returned an invalid iterator.";
99
+ }
100
+
101
+ // Tests that self-assignment works.
102
+ TEST(LinkedHashMapTest, SelfAssign) {
103
+ linked_hash_map<int, int> a{{1, 1}, {2, 2}, {3, 3}};
104
+ auto& a_ref = a;
105
+ a = a_ref;
106
+ EXPECT_THAT(a, ElementsAre(Pair(1, 1), Pair(2, 2), Pair(3, 3)));
107
+ }
108
+
109
+ // Tests that move constructor works.
110
+ TEST(LinkedHashMapTest, Move) {
111
+ // Use unique_ptr as an example of a non-copyable type.
112
+ linked_hash_map<int, std::unique_ptr<int>> m;
113
+ m[2] = std::make_unique<int>(12);
114
+ m[3] = std::make_unique<int>(13);
115
+ linked_hash_map<int, std::unique_ptr<int>> n = std::move(m);
116
+ EXPECT_THAT(n, ElementsAre(Pair(2, Pointee(12)), Pair(3, Pointee(13))));
117
+ }
118
+
119
+ // Tests that self-moving works.
120
+ TEST(LinkedHashMapTest, SelfMove) {
121
+ linked_hash_map<int, int> a{{1, 1}, {2, 2}, {3, 3}};
122
+ auto& a_ref = a;
123
+ a = std::move(a_ref);
124
+ EXPECT_THAT(a, ElementsAre(Pair(1, 1), Pair(2, 2), Pair(3, 3)));
125
+ }
126
+
127
+ TEST(LinkedHashMapTest, CanInsertMoveOnly) {
128
+ linked_hash_map<int, std::unique_ptr<int>> m;
129
+ struct Data {
130
+ int k, v;
131
+ };
132
+ const Data data[] = {{1, 123}, {3, 345}, {2, 234}, {4, 456}};
133
+ for (const auto& kv : data)
134
+ m.insert({kv.k, std::make_unique<int>(int{kv.v})});
135
+ EXPECT_TRUE(m.contains(2));
136
+ auto found = m.find(2);
137
+ ASSERT_TRUE(found != m.end());
138
+ EXPECT_EQ(234, *found->second);
139
+ }
140
+
141
+ TEST(LinkedHashMapTest, CanEmplaceMoveOnly) {
142
+ linked_hash_map<int, std::unique_ptr<int>> m;
143
+ struct Data {
144
+ int k, v;
145
+ };
146
+ const Data data[] = {{1, 123}, {3, 345}, {2, 234}, {4, 456}};
147
+ for (const auto& kv : data) {
148
+ m.emplace(std::piecewise_construct, std::make_tuple(kv.k),
149
+ std::make_tuple(new int{kv.v}));
150
+ }
151
+ EXPECT_TRUE(m.contains(2));
152
+ auto found = m.find(2);
153
+ ASSERT_TRUE(found != m.end());
154
+ EXPECT_EQ(234, *found->second);
155
+ }
156
+
157
+ struct NoCopy {
158
+ explicit NoCopy(int x) : x(x) {}
159
+ NoCopy(const NoCopy&) = delete;
160
+ NoCopy& operator=(const NoCopy&) = delete;
161
+ NoCopy(NoCopy&&) = delete;
162
+ NoCopy& operator=(NoCopy&&) = delete;
163
+ int x;
164
+ };
165
+
166
+ TEST(LinkedHashMapTest, CanEmplaceNoMoveNoCopy) {
167
+ linked_hash_map<int, NoCopy> m;
168
+ struct Data {
169
+ int k, v;
170
+ };
171
+ const Data data[] = {{1, 123}, {3, 345}, {2, 234}, {4, 456}};
172
+ for (const auto& kv : data) {
173
+ m.emplace(std::piecewise_construct, std::make_tuple(kv.k),
174
+ std::make_tuple(kv.v));
175
+ }
176
+ EXPECT_TRUE(m.contains(2));
177
+ auto found = m.find(2);
178
+ ASSERT_TRUE(found != m.end());
179
+ EXPECT_EQ(234, found->second.x);
180
+ }
181
+
182
+ TEST(LinkedHashMapTest, ConstKeys) {
183
+ linked_hash_map<int, int> m;
184
+ m.insert(std::make_pair(1, 2));
185
+ // Test that keys are const in iteration.
186
+ std::pair<const int, int>& p = *m.begin();
187
+ EXPECT_EQ(1, p.first);
188
+ }
189
+
190
+ // Tests that iteration from begin() to end() works
191
+ TEST(LinkedHashMapTest, Iteration) {
192
+ linked_hash_map<int, int> m;
193
+ EXPECT_TRUE(m.begin() == m.end());
194
+
195
+ m.insert(std::make_pair(2, 12));
196
+ m.insert(std::make_pair(1, 11));
197
+ m.insert(std::make_pair(3, 13));
198
+
199
+ linked_hash_map<int, int>::iterator i = m.begin();
200
+ ASSERT_TRUE(m.begin() == i);
201
+ ASSERT_TRUE(m.end() != i);
202
+ EXPECT_EQ(2, i->first);
203
+ EXPECT_EQ(12, i->second);
204
+
205
+ ++i;
206
+ ASSERT_TRUE(m.end() != i);
207
+ EXPECT_EQ(1, i->first);
208
+ EXPECT_EQ(11, i->second);
209
+
210
+ ++i;
211
+ ASSERT_TRUE(m.end() != i);
212
+ EXPECT_EQ(3, i->first);
213
+ EXPECT_EQ(13, i->second);
214
+
215
+ ++i; // Should be the end of the line.
216
+ ASSERT_TRUE(m.end() == i);
217
+ }
218
+
219
+ // Tests that reverse iteration from rbegin() to rend() works
220
+ TEST(LinkedHashMapTest, ReverseIteration) {
221
+ linked_hash_map<int, int> m;
222
+ EXPECT_TRUE(m.rbegin() == m.rend());
223
+
224
+ m.insert(std::make_pair(2, 12));
225
+ m.insert(std::make_pair(1, 11));
226
+ m.insert(std::make_pair(3, 13));
227
+
228
+ linked_hash_map<int, int>::reverse_iterator i = m.rbegin();
229
+ ASSERT_TRUE(m.rbegin() == i);
230
+ ASSERT_TRUE(m.rend() != i);
231
+ EXPECT_EQ(3, i->first);
232
+ EXPECT_EQ(13, i->second);
233
+
234
+ ++i;
235
+ ASSERT_TRUE(m.rend() != i);
236
+ EXPECT_EQ(1, i->first);
237
+ EXPECT_EQ(11, i->second);
238
+
239
+ ++i;
240
+ ASSERT_TRUE(m.rend() != i);
241
+ EXPECT_EQ(2, i->first);
242
+ EXPECT_EQ(12, i->second);
243
+
244
+ ++i; // Should be the end of the line.
245
+ ASSERT_TRUE(m.rend() == i);
246
+ }
247
+
248
+ // Tests that clear() works
249
+ TEST(LinkedHashMapTest, Clear) {
250
+ linked_hash_map<int, int> m;
251
+ m.insert(std::make_pair(2, 12));
252
+ m.insert(std::make_pair(1, 11));
253
+ m.insert(std::make_pair(3, 13));
254
+
255
+ ASSERT_EQ(3, m.size());
256
+
257
+ m.clear();
258
+
259
+ EXPECT_EQ(0, m.size());
260
+
261
+ m.clear(); // Make sure we can call it on an empty map.
262
+
263
+ EXPECT_EQ(0, m.size());
264
+ }
265
+
266
+ // Tests that size() works.
267
+ TEST(LinkedHashMapTest, Size) {
268
+ linked_hash_map<int, int> m;
269
+ EXPECT_EQ(0, m.size());
270
+ m.insert(std::make_pair(2, 12));
271
+ EXPECT_EQ(1, m.size());
272
+ m.insert(std::make_pair(1, 11));
273
+ EXPECT_EQ(2, m.size());
274
+ m.insert(std::make_pair(3, 13));
275
+ EXPECT_EQ(3, m.size());
276
+ m.clear();
277
+ EXPECT_EQ(0, m.size());
278
+ }
279
+
280
+ // Tests empty()
281
+ TEST(LinkedHashMapTest, Empty) {
282
+ linked_hash_map<int, int> m;
283
+ ASSERT_TRUE(m.empty());
284
+ m.insert(std::make_pair(2, 12));
285
+ ASSERT_FALSE(m.empty());
286
+ m.clear();
287
+ ASSERT_TRUE(m.empty());
288
+ }
289
+
290
+ TEST(LinkedHashMapTest, Erase) {
291
+ linked_hash_map<int, int> m;
292
+ ASSERT_EQ(0, m.size());
293
+ EXPECT_EQ(0, m.erase(2)); // Nothing to erase yet
294
+
295
+ m.insert(std::make_pair(2, 12));
296
+ ASSERT_EQ(1, m.size());
297
+ EXPECT_EQ(1, m.erase(2));
298
+ EXPECT_EQ(0, m.size());
299
+
300
+ EXPECT_EQ(0, m.erase(2)); // Make sure nothing bad happens if we repeat.
301
+ EXPECT_EQ(0, m.size());
302
+ }
303
+
304
+ TEST(LinkedHashMapTest, Erase2) {
305
+ linked_hash_map<int, int> m;
306
+ ASSERT_EQ(0, m.size());
307
+ EXPECT_EQ(0, m.erase(2)); // Nothing to erase yet
308
+
309
+ m.insert(std::make_pair(2, 12));
310
+ m.insert(std::make_pair(1, 11));
311
+ m.insert(std::make_pair(3, 13));
312
+ m.insert(std::make_pair(4, 14));
313
+ ASSERT_EQ(4, m.size());
314
+
315
+ // Erase middle two
316
+ EXPECT_EQ(1, m.erase(1));
317
+ EXPECT_EQ(1, m.erase(3));
318
+
319
+ EXPECT_EQ(2, m.size());
320
+
321
+ // Make sure we can still iterate over everything that's left.
322
+ linked_hash_map<int, int>::iterator it = m.begin();
323
+ ASSERT_TRUE(it != m.end());
324
+ EXPECT_EQ(12, it->second);
325
+ ++it;
326
+ ASSERT_TRUE(it != m.end());
327
+ EXPECT_EQ(14, it->second);
328
+ ++it;
329
+ ASSERT_TRUE(it == m.end());
330
+
331
+ EXPECT_EQ(0, m.erase(1)); // Make sure nothing bad happens if we repeat.
332
+ ASSERT_EQ(2, m.size());
333
+
334
+ EXPECT_EQ(1, m.erase(2));
335
+ EXPECT_EQ(1, m.erase(4));
336
+ ASSERT_EQ(0, m.size());
337
+
338
+ EXPECT_EQ(0, m.erase(1)); // Make sure nothing bad happens if we repeat.
339
+ ASSERT_EQ(0, m.size());
340
+ }
341
+
342
+ // Test that erase(iter,iter) and erase(iter) compile and work.
343
+ TEST(LinkedHashMapTest, Erase3) {
344
+ linked_hash_map<int, int> m;
345
+
346
+ m.insert(std::make_pair(1, 11));
347
+ m.insert(std::make_pair(2, 12));
348
+ m.insert(std::make_pair(3, 13));
349
+ m.insert(std::make_pair(4, 14));
350
+
351
+ // Erase middle two
352
+ linked_hash_map<int, int>::iterator it2 = m.find(2);
353
+ linked_hash_map<int, int>::iterator it4 = m.find(4);
354
+ EXPECT_EQ(m.erase(it2, it4), m.find(4));
355
+ EXPECT_EQ(2, m.size());
356
+
357
+ // Make sure we can still iterate over everything that's left.
358
+ linked_hash_map<int, int>::iterator it = m.begin();
359
+ ASSERT_TRUE(it != m.end());
360
+ EXPECT_EQ(11, it->second);
361
+ ++it;
362
+ ASSERT_TRUE(it != m.end());
363
+ EXPECT_EQ(14, it->second);
364
+ ++it;
365
+ ASSERT_TRUE(it == m.end());
366
+
367
+ // Erase first one using an iterator.
368
+ EXPECT_EQ(m.erase(m.begin()), m.find(4));
369
+
370
+ // Only the last element should be left.
371
+ it = m.begin();
372
+ ASSERT_TRUE(it != m.end());
373
+ EXPECT_EQ(14, it->second);
374
+ ++it;
375
+ ASSERT_TRUE(it == m.end());
376
+ }
377
+
378
+ // Test all types of insertion
379
+ TEST(LinkedHashMapTest, Insertion) {
380
+ linked_hash_map<int, int> m;
381
+ ASSERT_EQ(0, m.size());
382
+ std::pair<linked_hash_map<int, int>::iterator, bool> result;
383
+
384
+ result = m.insert(std::make_pair(2, 12));
385
+ ASSERT_EQ(1, m.size());
386
+ EXPECT_TRUE(result.second);
387
+ EXPECT_EQ(2, result.first->first);
388
+ EXPECT_EQ(12, result.first->second);
389
+
390
+ result = m.insert(std::make_pair(1, 11));
391
+ ASSERT_EQ(2, m.size());
392
+ EXPECT_TRUE(result.second);
393
+ EXPECT_EQ(1, result.first->first);
394
+ EXPECT_EQ(11, result.first->second);
395
+
396
+ result = m.insert(std::make_pair(3, 13));
397
+ linked_hash_map<int, int>::iterator result_iterator = result.first;
398
+ ASSERT_EQ(3, m.size());
399
+ EXPECT_TRUE(result.second);
400
+ EXPECT_EQ(3, result.first->first);
401
+ EXPECT_EQ(13, result.first->second);
402
+
403
+ result = m.insert(std::make_pair(3, 13));
404
+ EXPECT_EQ(3, m.size());
405
+ EXPECT_FALSE(result.second) << "No insertion should have occurred.";
406
+ EXPECT_TRUE(result_iterator == result.first)
407
+ << "Duplicate insertion should have given us the original iterator.";
408
+
409
+ std::vector<std::pair<int, int>> v = {{3, 13}, {4, 14}, {5, 15}};
410
+ m.insert(v.begin(), v.end());
411
+ // Expect 4 and 5 inserted, 3 not inserted.
412
+ EXPECT_EQ(5, m.size());
413
+ EXPECT_EQ(14, m.at(4));
414
+ EXPECT_EQ(15, m.at(5));
415
+ }
416
+
417
+ static std::pair<const int, int> Pair(int i, int j) { return {i, j}; }
418
+
419
+ // Test front accessors.
420
+ TEST(LinkedHashMapTest, Front) {
421
+ linked_hash_map<int, int> m;
422
+
423
+ m.insert(std::make_pair(2, 12));
424
+ m.insert(std::make_pair(1, 11));
425
+ m.insert(std::make_pair(3, 13));
426
+
427
+ EXPECT_EQ(3, m.size());
428
+ EXPECT_EQ(Pair(2, 12), m.front());
429
+ m.pop_front();
430
+ EXPECT_EQ(2, m.size());
431
+ EXPECT_EQ(Pair(1, 11), m.front());
432
+ m.pop_front();
433
+ EXPECT_EQ(1, m.size());
434
+ EXPECT_EQ(Pair(3, 13), m.front());
435
+ m.pop_front();
436
+ EXPECT_TRUE(m.empty());
437
+ }
438
+
439
+ // Test back accessors.
440
+ TEST(LinkedHashMapTest, Back) {
441
+ linked_hash_map<int, int> m;
442
+
443
+ m.insert(std::make_pair(2, 12));
444
+ m.insert(std::make_pair(1, 11));
445
+ m.insert(std::make_pair(3, 13));
446
+
447
+ EXPECT_EQ(3, m.size());
448
+ EXPECT_EQ(Pair(3, 13), m.back());
449
+ m.pop_back();
450
+ EXPECT_EQ(2, m.size());
451
+ EXPECT_EQ(Pair(1, 11), m.back());
452
+ m.pop_back();
453
+ EXPECT_EQ(1, m.size());
454
+ EXPECT_EQ(Pair(2, 12), m.back());
455
+ m.pop_back();
456
+ EXPECT_TRUE(m.empty());
457
+ }
458
+
459
+ TEST(LinkedHashMapTest, Find) {
460
+ linked_hash_map<int, int> m;
461
+
462
+ EXPECT_TRUE(m.end() == m.find(1))
463
+ << "We shouldn't find anything in an empty map.";
464
+
465
+ m.insert(std::make_pair(2, 12));
466
+ EXPECT_TRUE(m.end() == m.find(1))
467
+ << "We shouldn't find an element that doesn't exist in the map.";
468
+
469
+ std::pair<linked_hash_map<int, int>::iterator, bool> result =
470
+ m.insert(std::make_pair(1, 11));
471
+ ASSERT_TRUE(result.second);
472
+ ASSERT_TRUE(m.end() != result.first);
473
+ EXPECT_TRUE(result.first == m.find(1))
474
+ << "We should have found an element we know exists in the map.";
475
+ EXPECT_EQ(11, result.first->second);
476
+
477
+ // Check that a follow-up insertion doesn't affect our original
478
+ m.insert(std::make_pair(3, 13));
479
+ linked_hash_map<int, int>::iterator it = m.find(1);
480
+ ASSERT_TRUE(m.end() != it);
481
+ EXPECT_EQ(11, it->second);
482
+
483
+ m.clear();
484
+ EXPECT_TRUE(m.end() == m.find(1))
485
+ << "We shouldn't find anything in a map that we've cleared.";
486
+ }
487
+
488
+ TEST(LinkedHashMapTest, Contains) {
489
+ linked_hash_map<int, int> m;
490
+
491
+ EXPECT_FALSE(m.contains(1)) << "An empty map shouldn't contain anything.";
492
+
493
+ m.insert(std::make_pair(2, 12));
494
+ EXPECT_FALSE(m.contains(1))
495
+ << "The map shouldn't contain an element that doesn't exist.";
496
+
497
+ m.insert(std::make_pair(1, 11));
498
+ EXPECT_TRUE(m.contains(1))
499
+ << "The map should contain an element that we know exists.";
500
+
501
+ m.clear();
502
+ EXPECT_FALSE(m.contains(1))
503
+ << "A map that we've cleared shouldn't contain anything.";
504
+ }
505
+
506
+ TEST(LinkedHashMapTest, At) {
507
+ linked_hash_map<int, int> m = {{1, 2}};
508
+ EXPECT_EQ(2, m.at(1));
509
+ ABSL_BASE_INTERNAL_EXPECT_FAIL(m.at(3), std::out_of_range,
510
+ "linked_hash_map::at");
511
+
512
+ const linked_hash_map<int, int> cm = {{1, 2}};
513
+ EXPECT_EQ(2, cm.at(1));
514
+ ABSL_BASE_INTERNAL_EXPECT_FAIL(cm.at(3), std::out_of_range,
515
+ "linked_hash_map::at");
516
+ }
517
+
518
+ TEST(LinkedHashMapTest, Swap) {
519
+ linked_hash_map<int, int> m1;
520
+ linked_hash_map<int, int> m2;
521
+ m1.insert(std::make_pair(1, 1));
522
+ m1.insert(std::make_pair(2, 2));
523
+ m2.insert(std::make_pair(3, 3));
524
+ ASSERT_EQ(2, m1.size());
525
+ ASSERT_EQ(1, m2.size());
526
+ m1.swap(m2);
527
+ ASSERT_EQ(1, m1.size());
528
+ ASSERT_EQ(2, m2.size());
529
+ }
530
+
531
+ TEST(LinkedHashMapTest, SelfSwap) {
532
+ linked_hash_map<int, int> a{{1, 1}, {2, 2}, {3, 3}};
533
+ using std::swap;
534
+ swap(a, a);
535
+ EXPECT_THAT(a, ElementsAre(Pair(1, 1), Pair(2, 2), Pair(3, 3)));
536
+ }
537
+
538
+ TEST(LinkedHashMapTest, InitializerList) {
539
+ linked_hash_map<int, int> m{{1, 2}, {3, 4}};
540
+ ASSERT_EQ(2, m.size());
541
+ EXPECT_TRUE(m.contains(1));
542
+ linked_hash_map<int, int>::iterator it = m.find(1);
543
+ ASSERT_TRUE(m.end() != it);
544
+ EXPECT_EQ(2, it->second);
545
+ EXPECT_TRUE(m.contains(3));
546
+ it = m.find(3);
547
+ ASSERT_TRUE(m.end() != it);
548
+ EXPECT_EQ(4, it->second);
549
+ }
550
+
551
+ TEST(LinkedHashMapTest, CustomHashAndEquality) {
552
+ struct CustomIntHash {
553
+ size_t operator()(int x) const { return x; }
554
+ };
555
+ struct CustomIntEq {
556
+ bool operator()(int x, int y) const { return x == y; }
557
+ };
558
+ linked_hash_map<int, int, CustomIntHash, CustomIntEq> m;
559
+ m.insert(std::make_pair(1, 1));
560
+ EXPECT_TRUE(m.contains(1));
561
+ EXPECT_EQ(1, m[1]);
562
+ }
563
+
564
+ TEST(LinkedHashMapTest, EqualRange) {
565
+ linked_hash_map<int, int> m{{3, 11}, {1, 13}};
566
+ const auto& const_m = m;
567
+
568
+ EXPECT_THAT(m.equal_range(2), testing::Pair(m.end(), m.end()));
569
+ EXPECT_THAT(const_m.equal_range(2),
570
+ testing::Pair(const_m.end(), const_m.end()));
571
+
572
+ EXPECT_THAT(m.equal_range(1), testing::Pair(m.find(1), ++m.find(1)));
573
+ EXPECT_THAT(const_m.equal_range(1),
574
+ testing::Pair(const_m.find(1), ++const_m.find(1)));
575
+ }
576
+
577
+ TEST(LinkedHashMapTest, ReserveWorks) {
578
+ linked_hash_map<int, int> m;
579
+ EXPECT_EQ(0, m.size());
580
+ EXPECT_EQ(0.0, m.load_factor());
581
+ m.reserve(10);
582
+ EXPECT_LE(10, m.capacity());
583
+ EXPECT_EQ(0, m.size());
584
+ EXPECT_EQ(0.0, m.load_factor());
585
+ m.emplace(1, 1);
586
+ m.emplace(2, 2);
587
+ EXPECT_LE(10, m.capacity());
588
+ EXPECT_EQ(2, m.size());
589
+ EXPECT_LT(0.0, m.load_factor());
590
+ }
591
+
592
+ // We require key types to have hash and equals.
593
+ class CopyableMovableType
594
+ : public absl::test_internal::CopyableMovableInstance {
595
+ public:
596
+ using CopyableMovableInstance::CopyableMovableInstance;
597
+
598
+ bool operator==(const CopyableMovableType& o) const {
599
+ return value() == o.value();
600
+ }
601
+
602
+ template <typename H>
603
+ friend H AbslHashValue(H h, const CopyableMovableType& c) {
604
+ return H::combine(std::move(h), c.value());
605
+ }
606
+ };
607
+
608
+ TEST(LinkedHashMapTest, RValueOperatorAt) {
609
+ absl::test_internal::InstanceTracker tracker;
610
+
611
+ linked_hash_map<CopyableMovableType, int> map;
612
+ map[CopyableMovableType(1)] = 1;
613
+ EXPECT_EQ(tracker.copies(), 0);
614
+ CopyableMovableType c(2);
615
+ map[std::move(c)] = 2;
616
+ EXPECT_EQ(tracker.copies(), 0);
617
+ EXPECT_THAT(map, ElementsAre(Pair(CopyableMovableType(1), 1),
618
+ Pair(CopyableMovableType(2), 2)));
619
+ }
620
+
621
+ TEST(LinkedHashMapTest, HeterogeneousTests) {
622
+ absl::test_internal::InstanceTracker tracker;
623
+
624
+ using MapType = linked_hash_map<ExpensiveType, int, HeterogeneousHash,
625
+ HeterogeneousEqual>;
626
+ MapType map;
627
+ ExpensiveType one(1);
628
+ map[one] = 1;
629
+ // Two instances: 'one' var and an instance in the map.
630
+ EXPECT_EQ(2, tracker.instances());
631
+ EXPECT_EQ(1, tracker.copies());
632
+ EXPECT_EQ(0, tracker.moves());
633
+
634
+ tracker.ResetCopiesMovesSwaps();
635
+ map[one] = 5;
636
+ // No construction since key==1 exists.
637
+ EXPECT_EQ(2, tracker.instances());
638
+ EXPECT_EQ(0, tracker.copies());
639
+ EXPECT_EQ(0, tracker.moves());
640
+
641
+ tracker.ResetCopiesMovesSwaps();
642
+ map[CheapType(1)] = 10;
643
+ // No construction since key==1 exists.
644
+ EXPECT_EQ(2, tracker.instances());
645
+ EXPECT_EQ(0, tracker.copies());
646
+ EXPECT_EQ(0, tracker.moves());
647
+
648
+ tracker.ResetCopiesMovesSwaps();
649
+ map[CheapType(2)] = 20;
650
+ // Construction since key==2 doesn't exist in the map.
651
+ EXPECT_EQ(3, tracker.instances());
652
+ EXPECT_EQ(0, tracker.copies());
653
+ EXPECT_EQ(0, tracker.moves());
654
+ EXPECT_THAT(map, ElementsAre(Pair(HasExpensiveValue(1), 10),
655
+ Pair(HasExpensiveValue(2), 20)));
656
+
657
+ // find
658
+ auto itr = map.find(CheapType(1));
659
+ tracker.ResetCopiesMovesSwaps();
660
+ ASSERT_NE(itr, map.end());
661
+ EXPECT_EQ(10, itr->second);
662
+ // contains
663
+ EXPECT_TRUE(map.contains(CheapType(2)));
664
+ // count
665
+ EXPECT_EQ(1, map.count(CheapType(2)));
666
+ // equal_range
667
+ auto eq_itr_pair = map.equal_range(CheapType(2));
668
+ ASSERT_NE(eq_itr_pair.first, map.end());
669
+ EXPECT_EQ(20, eq_itr_pair.first->second);
670
+ // No construction for find, contains, count or equal_range.
671
+ EXPECT_EQ(3, tracker.instances());
672
+ EXPECT_EQ(0, tracker.copies());
673
+ EXPECT_EQ(0, tracker.moves());
674
+
675
+ // insert
676
+ auto three = MapType::value_type(CheapType(3), 30);
677
+ tracker.ResetCopiesMovesSwaps();
678
+ map.insert(three);
679
+ // Two instances: 'three' var and an instance in the map.
680
+ EXPECT_EQ(5, tracker.instances());
681
+ EXPECT_EQ(1, tracker.copies());
682
+ EXPECT_EQ(0, tracker.moves());
683
+
684
+ tracker.ResetCopiesMovesSwaps();
685
+ map.insert(three);
686
+ // No additional construction since key==3 exists.
687
+ EXPECT_EQ(5, tracker.instances());
688
+ EXPECT_EQ(0, tracker.copies());
689
+ EXPECT_EQ(0, tracker.moves());
690
+ EXPECT_THAT(map, ElementsAre(Pair(HasExpensiveValue(1), 10),
691
+ Pair(HasExpensiveValue(2), 20),
692
+ Pair(HasExpensiveValue(3), 30)));
693
+
694
+ // Test std::move() using operator[] and insert().
695
+ ExpensiveType four(4);
696
+ tracker.ResetCopiesMovesSwaps();
697
+ map[std::move(four)] = 40;
698
+ // Two constructions (regular and move).
699
+ EXPECT_EQ(7, tracker.instances());
700
+ EXPECT_EQ(0, tracker.copies());
701
+ EXPECT_EQ(1, tracker.moves());
702
+
703
+ auto five = MapType::value_type(CheapType(5), 50);
704
+ tracker.ResetCopiesMovesSwaps();
705
+ map.insert(std::move(five));
706
+ // Two constructions (regular and move).
707
+ EXPECT_EQ(9, tracker.instances());
708
+ EXPECT_EQ(1, tracker.copies());
709
+ EXPECT_EQ(0, tracker.moves());
710
+ EXPECT_THAT(map, ElementsAre(Pair(HasExpensiveValue(1), 10),
711
+ Pair(HasExpensiveValue(2), 20),
712
+ Pair(HasExpensiveValue(3), 30),
713
+ Pair(HasExpensiveValue(4), 40),
714
+ Pair(HasExpensiveValue(5), 50)));
715
+
716
+ // Insert using std::pair.
717
+ tracker.ResetCopiesMovesSwaps();
718
+ map.insert(std::make_pair(ExpensiveType(6), 60));
719
+ EXPECT_EQ(10, tracker.instances());
720
+ EXPECT_EQ(1, tracker.copies());
721
+ EXPECT_EQ(2, tracker.moves());
722
+
723
+ // Heterogeneous erase.
724
+ map.erase(CheapType(1));
725
+ // No construction and instance reduced by one.
726
+ tracker.ResetCopiesMovesSwaps();
727
+ EXPECT_EQ(9, tracker.instances());
728
+ EXPECT_EQ(0, tracker.copies());
729
+ EXPECT_EQ(0, tracker.moves());
730
+ EXPECT_THAT(map, ElementsAre(Pair(HasExpensiveValue(2), 20),
731
+ Pair(HasExpensiveValue(3), 30),
732
+ Pair(HasExpensiveValue(4), 40),
733
+ Pair(HasExpensiveValue(5), 50),
734
+ Pair(HasExpensiveValue(6), 60)));
735
+ }
736
+
737
+ TEST(LinkedHashMapTest, HeterogeneousStringViewLookup) {
738
+ linked_hash_map<std::string, int> map;
739
+ map["foo"] = 1;
740
+ map["bar"] = 2;
741
+ map["blah"] = 3;
742
+
743
+ {
744
+ absl::string_view lookup("foo");
745
+ auto itr = map.find(lookup);
746
+ ASSERT_NE(itr, map.end());
747
+ EXPECT_EQ(1, itr->second);
748
+ }
749
+
750
+ // Not found.
751
+ {
752
+ absl::string_view lookup("foobar");
753
+ EXPECT_EQ(map.end(), map.find(lookup));
754
+ }
755
+
756
+ {
757
+ absl::string_view lookup("blah");
758
+ auto itr = map.find(lookup);
759
+ ASSERT_NE(itr, map.end());
760
+ EXPECT_EQ(3, itr->second);
761
+ }
762
+ }
763
+
764
+ TEST(LinkedHashMapTest, UniversalReferenceWorks) {
765
+ linked_hash_map<std::string, int> map;
766
+ std::string s = "very very very very very long string";
767
+ map[s] = 1;
768
+ EXPECT_EQ(s, "very very very very very long string");
769
+ }
770
+
771
+ TEST(LinkedHashMap, ExtractInsert) {
772
+ linked_hash_map<int, int> m = {{1, 7}, {2, 9}};
773
+ auto node = m.extract(1);
774
+ EXPECT_TRUE(node);
775
+ EXPECT_EQ(node.key(), 1);
776
+ EXPECT_EQ(node.mapped(), 7);
777
+ EXPECT_THAT(m, ElementsAre(Pair(2, 9)));
778
+ EXPECT_FALSE(m.contains(1));
779
+ EXPECT_TRUE(m.contains(2));
780
+
781
+ node.mapped() = 17;
782
+ m.insert(std::move(node));
783
+ EXPECT_FALSE(node);
784
+ EXPECT_THAT(m, ElementsAre(Pair(2, 9), Pair(1, 17)));
785
+ EXPECT_TRUE(m.contains(2));
786
+ EXPECT_TRUE(m.contains(1));
787
+
788
+ node = m.extract(m.find(1));
789
+ EXPECT_TRUE(node);
790
+ EXPECT_EQ(node.key(), 1);
791
+ EXPECT_EQ(node.mapped(), 17);
792
+ EXPECT_THAT(m, ElementsAre(Pair(2, 9)));
793
+ }
794
+
795
+ TEST(LinkedHashMap, Merge) {
796
+ linked_hash_map<int, int> m = {{1, 7}, {3, 6}};
797
+ linked_hash_map<int, int> src = {{1, 10}, {2, 9}, {4, 16}};
798
+
799
+ m.merge(src);
800
+
801
+ EXPECT_THAT(m, ElementsAre(Pair(1, 7), Pair(3, 6), Pair(2, 9), Pair(4, 16)));
802
+ EXPECT_THAT(src, ElementsAre(Pair(1, 10)));
803
+ for (int i : {2, 9, 4}) {
804
+ EXPECT_FALSE(src.contains(i));
805
+ }
806
+ }
807
+
808
+ TEST(LinkedHashMap, Splice) {
809
+ linked_hash_map<int, int> m = {{1, 7}, {3, 6}};
810
+ linked_hash_map<int, int> src = {{1, 10}, {2, 9}, {4, 16}};
811
+ m.splice(m.end(), m, m.begin());
812
+
813
+ EXPECT_THAT(m, ElementsAre(Pair(3, 6), Pair(1, 7)));
814
+
815
+ m.splice(m.end(), src, ++src.begin());
816
+ EXPECT_THAT(m, ElementsAre(Pair(3, 6), Pair(1, 7), Pair(2, 9)));
817
+ EXPECT_THAT(src, ElementsAre(Pair(1, 10), Pair(4, 16)));
818
+ }
819
+
820
+ TEST(LinkedHashMap, EraseRange) {
821
+ linked_hash_map<int, int> map = {{1, 1}, {2, 4}, {3, 9}, {4, 16}, {5, 25},
822
+ {6, 36}, {7, 49}, {8, 64}, {9, 81}};
823
+ auto start = map.find(3);
824
+ auto end = map.find(8);
825
+ auto itr = map.erase(start, end);
826
+ ASSERT_NE(itr, map.end());
827
+ EXPECT_THAT(*itr, Pair(8, 64));
828
+ EXPECT_THAT(map,
829
+ ElementsAre(Pair(1, 1), Pair(2, 4), Pair(8, 64), Pair(9, 81)));
830
+ for (int i : {1, 2, 8, 9}) {
831
+ EXPECT_TRUE(map.contains(i));
832
+ }
833
+ for (int i : {3, 4, 5, 6, 7}) {
834
+ EXPECT_FALSE(map.contains(i));
835
+ }
836
+ }
837
+
838
+ TEST(LinkedHashMap, InsertInitializerList) {
839
+ linked_hash_map<int, int> m;
840
+ m.insert({{1, 7}, {2, 9}, {3, 29}});
841
+ EXPECT_THAT(m, ElementsAre(Pair(1, 7), Pair(2, 9), Pair(3, 29)));
842
+ }
843
+
844
+ TEST(LinkedHashMap, InsertOrAssign) {
845
+ linked_hash_map<int, int> m;
846
+ {
847
+ auto [itr, elem_inserted] = m.insert_or_assign(10, 20);
848
+ EXPECT_THAT(*itr, Pair(10, 20));
849
+ EXPECT_EQ(elem_inserted, true);
850
+ }
851
+ {
852
+ auto [itr, elem_inserted] = m.insert_or_assign(10, 30);
853
+ EXPECT_THAT(*itr, Pair(10, 30));
854
+ EXPECT_EQ(elem_inserted, false);
855
+ }
856
+ }
857
+
858
+ TEST(LinkedHashMap, TryEmplace) {
859
+ linked_hash_map<int, std::pair<int, std::string>> m;
860
+ {
861
+ auto [itr, elem_inserted] = m.try_emplace(10, 20, "string");
862
+ EXPECT_THAT(*itr, Pair(10, Pair(20, "string")));
863
+ EXPECT_EQ(elem_inserted, true);
864
+ }
865
+ {
866
+ absl::test_internal::InstanceTracker tracker;
867
+ std::string s = "some string";
868
+ auto [itr, elem_inserted] = m.try_emplace(10, 2, std::move(s));
869
+ EXPECT_THAT(*itr, Pair(10, Pair(20, "string")));
870
+ EXPECT_EQ(elem_inserted, false);
871
+ EXPECT_THAT(tracker.moves(), 0);
872
+ }
873
+ }
874
+
875
+ TEST(LinkedHashMapTest, TryEmplace) {
876
+ linked_hash_map<int, std::tuple<int, std::string, std::unique_ptr<float>>>
877
+ map;
878
+ auto result = map.try_emplace(3, 2, "foo", new float(1.0));
879
+ EXPECT_TRUE(result.second);
880
+ EXPECT_EQ(std::get<0>(result.first->second), 2);
881
+ EXPECT_EQ(std::get<1>(result.first->second), "foo");
882
+ EXPECT_EQ(*std::get<2>(result.first->second), 1.0);
883
+
884
+ // Ptr should not be moved.
885
+ auto ptr = std::make_unique<float>(3.0);
886
+ auto result2 = map.try_emplace(3, 22, "foo-bar", std::move(ptr));
887
+ EXPECT_FALSE(result2.second);
888
+ EXPECT_EQ(std::get<0>(result.first->second), 2);
889
+ EXPECT_EQ(std::get<1>(result.first->second), "foo");
890
+ EXPECT_EQ(*std::get<2>(result.first->second), 1.0);
891
+ EXPECT_NE(ptr.get(), nullptr);
892
+ }
893
+
894
+ struct CountedHash {
895
+ explicit CountedHash(int* count) : count(count) {}
896
+ size_t operator()(int value) const {
897
+ ++(*count);
898
+ return value;
899
+ }
900
+ int* count = nullptr;
901
+ };
902
+
903
+ // Makes a map too big for small object optimization. Counts the number of
904
+ // hashes in `count`, but leaves `count` set to 0.
905
+ linked_hash_map<int, std::string, CountedHash> MakeNonSmallMap(int* count) {
906
+ const int kFirstKey = -1000;
907
+ linked_hash_map<int, std::string, CountedHash> m(0, CountedHash(count));
908
+ for (int i = kFirstKey; i < kFirstKey + 100; ++i) {
909
+ m[i] = "foo";
910
+ }
911
+ *count = 0;
912
+ return m;
913
+ }
914
+
915
+ constexpr bool BuildHasDebugModeRehashes() {
916
+ #if !defined(NDEBUG) || defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
917
+ defined(ABSL_HAVE_MEMORY_SANITIZER) || defined(ABSL_HAVE_THREAD_SANITIZER)
918
+ return true;
919
+ #else
920
+ return false;
921
+ #endif
922
+ }
923
+
924
+ TEST(LinkedHashMapTest, HashCountInOptBuilds) {
925
+ if (BuildHasDebugModeRehashes()) {
926
+ GTEST_SKIP() << "Only run under NDEBUG: `assert` statements and sanitizer "
927
+ "rehashing may cause redundant hashing.";
928
+ }
929
+
930
+ using Map = linked_hash_map<int, std::string, CountedHash>;
931
+ {
932
+ int count = 0;
933
+ Map m = MakeNonSmallMap(&count);
934
+ m.insert({1, "foo"});
935
+ EXPECT_EQ(count, 1);
936
+ m.erase(1);
937
+ EXPECT_EQ(count, 2);
938
+ }
939
+ {
940
+ int count = 0;
941
+ Map m = MakeNonSmallMap(&count);
942
+ m[2] = "bar";
943
+ EXPECT_EQ(count, 1);
944
+ }
945
+ {
946
+ int count = 0;
947
+ Map m = MakeNonSmallMap(&count);
948
+ m.insert({3, "baz"});
949
+ EXPECT_EQ(count, 1);
950
+ auto node = m.extract(3);
951
+ EXPECT_EQ(count, 2);
952
+ m.insert(std::move(node));
953
+ EXPECT_EQ(count, 3);
954
+ }
955
+ {
956
+ int count = 0;
957
+ Map m = MakeNonSmallMap(&count);
958
+ m.insert_or_assign(4, "qux");
959
+ EXPECT_EQ(count, 1);
960
+ }
961
+ {
962
+ int count = 0;
963
+ Map m = MakeNonSmallMap(&count);
964
+ m.emplace(5, "vog");
965
+ EXPECT_EQ(count, 1);
966
+ }
967
+ {
968
+ int count = 0;
969
+ Map m = MakeNonSmallMap(&count);
970
+ m.try_emplace(6, 'x', 42);
971
+ EXPECT_EQ(count, 1);
972
+ }
973
+ {
974
+ int src_count = 0, dst_count = 0;
975
+ Map src = MakeNonSmallMap(&src_count);
976
+ Map dst = MakeNonSmallMap(&dst_count);
977
+ src[7] = "siete";
978
+ dst.merge(src);
979
+ EXPECT_LE(src_count, 200);
980
+ EXPECT_LE(dst_count, 200);
981
+ }
982
+ }
983
+
984
+ } // namespace
985
+ } // namespace container_internal
986
+ ABSL_NAMESPACE_END
987
+ } // namespace absl