code_ownership 2.1.4 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. checksums.yaml +4 -4
  2. data/.cargo/config +2 -2
  3. data/Cargo.lock +6 -59
  4. data/ext/cargo-vendor/codeowners-0.5.0/.cargo-checksum.json +1 -0
  5. data/ext/cargo-vendor/codeowners-0.5.0/.github/workflows/audit.yml +31 -0
  6. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/.github/workflows/ci.yml +11 -0
  7. data/ext/cargo-vendor/codeowners-0.5.0/.github/workflows/codeql.yml +21 -0
  8. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/Cargo.lock +27 -115
  9. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/Cargo.toml +44 -3
  10. data/ext/cargo-vendor/codeowners-0.5.0/perf/README.md +204 -0
  11. data/ext/cargo-vendor/codeowners-0.5.0/perf/compare.sh +23 -0
  12. data/ext/cargo-vendor/codeowners-0.5.0/perf/run.sh +28 -0
  13. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/rust-toolchain.toml +1 -1
  14. data/ext/cargo-vendor/codeowners-0.5.0/src/bin/codeowners-perf.rs +719 -0
  15. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/cache/file.rs +9 -9
  16. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/cache/mod.rs +4 -4
  17. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/cache/noop.rs +4 -4
  18. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/cli.rs +7 -7
  19. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/main.rs +3 -3
  20. data/ext/cargo-vendor/codeowners-0.5.0/src/ownership/file_owner_resolver.rs +829 -0
  21. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/validator.rs +108 -15
  22. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership.rs +22 -3
  23. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/project.rs +4 -4
  24. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/project_builder.rs +40 -14
  25. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/project_file_builder.rs +2 -2
  26. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/runner/api.rs +8 -5
  27. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/runner/types.rs +1 -2
  28. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/runner.rs +39 -29
  29. data/ext/cargo-vendor/codeowners-0.5.0/tests/annotation_in_unowned_team_glob_test.rs +64 -0
  30. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/common/mod.rs +1 -1
  31. data/ext/cargo-vendor/codeowners-0.5.0/tests/directory_codeowner_github_team_test.rs +22 -0
  32. data/ext/cargo-vendor/codeowners-0.5.0/tests/empty_directory_codeowner_test.rs +26 -0
  33. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/annotation_in_unowned_team_glob/.github/CODEOWNERS +18 -0
  34. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/annotation_in_unowned_team_glob/config/code_ownership.yml +4 -0
  35. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/annotation_in_unowned_team_glob/config/teams/alpha.yml +7 -0
  36. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/annotation_in_unowned_team_glob/config/teams/beta.yml +3 -0
  37. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/annotation_in_unowned_team_glob/ruby/app/services/alpha_owned.rb +2 -0
  38. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/annotation_in_unowned_team_glob/ruby/app/services/beta_owned.rb +4 -0
  39. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/directory-codeowner-github-team/.github/CODEOWNERS +15 -0
  40. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/directory-codeowner-github-team/app/by_handle/.codeowner +1 -0
  41. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/directory-codeowner-github-team/app/by_handle/handled.rb +2 -0
  42. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/directory-codeowner-github-team/app/by_name/named.rb +2 -0
  43. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/empty-directory-codeowner/.github/CODEOWNERS +14 -0
  44. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/empty-directory-codeowner/app/services/.codeowner +1 -0
  45. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/empty-directory-codeowner/app/services/nested/.codeowner +1 -0
  46. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/empty-directory-codeowner/app/services/nested/nested_file.rb +2 -0
  47. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/empty-directory-codeowner/config/code_ownership.yml +10 -0
  48. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/empty-directory-codeowner/config/teams/foo.yml +5 -0
  49. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/invalid-directory-codeowner/.github/CODEOWNERS +14 -0
  50. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/invalid-directory-codeowner/app/services/.codeowner +1 -0
  51. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/invalid-directory-codeowner/app/services/nested/.codeowner +1 -0
  52. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/invalid-directory-codeowner/app/services/nested/nested_file.rb +2 -0
  53. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/invalid-directory-codeowner/config/code_ownership.yml +10 -0
  54. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/invalid-directory-codeowner/config/teams/foo.yml +5 -0
  55. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/multiple-directory-owners/app/services/.codeowner +1 -0
  56. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/multiple-directory-owners/config/code_ownership.yml +10 -0
  57. data/ext/cargo-vendor/codeowners-0.5.0/tests/fixtures/multiple-directory-owners/config/teams/foo.yml +5 -0
  58. data/ext/cargo-vendor/codeowners-0.5.0/tests/global_gitignore_test.rs +50 -0
  59. data/ext/cargo-vendor/codeowners-0.5.0/tests/invalid_directory_codeowner_test.rs +26 -0
  60. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/invalid_project_test.rs +9 -9
  61. data/ext/cargo-vendor/codeowners-0.5.0/tests/perf_harness_test.rs +245 -0
  62. data/ext/cargo-vendor/codeowners-0.5.0/tests/untracked_new_file_test.rs +63 -0
  63. data/ext/cargo-vendor/codeowners-0.5.0/tests/untracked_source_file_test.rs +40 -0
  64. data/ext/cargo-vendor/error-stack-0.8.0/.cargo-checksum.json +1 -0
  65. data/ext/cargo-vendor/error-stack-0.8.0/.cargo_vcs_info.json +6 -0
  66. data/ext/cargo-vendor/error-stack-0.8.0/.justfile +16 -0
  67. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/CHANGELOG.md +50 -1
  68. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/Cargo.lock +253 -310
  69. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/Cargo.toml +107 -52
  70. data/ext/cargo-vendor/error-stack-0.8.0/Cargo.toml.orig +109 -0
  71. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/README.md +16 -18
  72. data/ext/cargo-vendor/error-stack-0.8.0/build.rs +28 -0
  73. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/examples/demo.rs +21 -19
  74. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/examples/detect.rs +6 -6
  75. data/ext/cargo-vendor/error-stack-0.8.0/examples/exit_code.rs +25 -0
  76. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/examples/parse_config.rs +5 -5
  77. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/compat/anyhow.rs +7 -7
  78. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/compat/eyre.rs +7 -6
  79. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/compat/mod.rs +7 -9
  80. data/ext/cargo-vendor/error-stack-0.8.0/src/context.rs +52 -0
  81. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/error.rs +2 -9
  82. data/ext/cargo-vendor/error-stack-0.8.0/src/ext/iter.rs +286 -0
  83. data/ext/cargo-vendor/error-stack-0.8.0/src/ext/mod.rs +19 -0
  84. data/ext/cargo-vendor/error-stack-0.8.0/src/ext/stream.rs +212 -0
  85. data/ext/cargo-vendor/error-stack-0.8.0/src/ext/tuple.rs +218 -0
  86. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/fmt/charset.rs +12 -12
  87. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/fmt/color.rs +30 -30
  88. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/fmt/config.rs +1 -1
  89. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/fmt/hook.rs +23 -24
  90. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/fmt/location.rs +3 -3
  91. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/fmt/mod.rs +62 -52
  92. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/frame/frame_impl.rs +12 -15
  93. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/frame/kind.rs +11 -10
  94. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/frame/mod.rs +8 -10
  95. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/future.rs +57 -63
  96. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/hook/context.rs +18 -20
  97. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/hook/mod.rs +16 -15
  98. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/iter.rs +12 -57
  99. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/lib.rs +99 -87
  100. data/ext/cargo-vendor/error-stack-0.8.0/src/macros.rs +212 -0
  101. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/report.rs +525 -207
  102. data/ext/cargo-vendor/error-stack-0.8.0/src/result.rs +137 -0
  103. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/serde.rs +53 -38
  104. data/ext/cargo-vendor/error-stack-0.8.0/src/sink.rs +672 -0
  105. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/common.rs +36 -24
  106. data/ext/cargo-vendor/error-stack-0.8.0/tests/compiletest.rs +22 -0
  107. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__charset_ascii.snap +1 -1
  108. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__charset_utf8.snap +1 -1
  109. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__diagnostics_add.snap +1 -1
  110. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__doc.snap +1 -1
  111. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__emit.snap +1 -1
  112. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__emit_alt.snap +1 -1
  113. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__hookcontext_cast.snap +1 -1
  114. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__hookcontext_decrement.snap +1 -1
  115. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__hookcontext_emit.snap +1 -1
  116. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__hookcontext_increment.snap +1 -1
  117. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__hookcontext_storage.snap +1 -1
  118. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__preference_color.snap +1 -1
  119. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__preference_emphasis.snap +1 -1
  120. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt__preference_none.snap +1 -1
  121. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/fmt_doc_alt.snap +1 -1
  122. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/hook__debug_hook.snap +1 -1
  123. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/hook__debug_hook_provide.snap +1 -1
  124. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/lib__suggestion.snap +2 -2
  125. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/report_debug__doc.snap +3 -3
  126. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__complex.snap +1 -1
  127. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__hook_location.snap +1 -1
  128. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__linear.snap +2 -2
  129. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__linear_ext.snap +2 -2
  130. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__multiline_context.snap +3 -3
  131. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__sources.snap +1 -1
  132. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__sources_transparent.snap +1 -1
  133. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__sources_nested.snap +10 -10
  134. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__sources_nested@spantrace-backtrace.snap +10 -10
  135. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__sources_nested_alternate.snap +10 -10
  136. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__sources_nested_alternate@spantrace-backtrace.snap +10 -10
  137. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_serialize__attachment.snap +1 -1
  138. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_serialize__context.snap +1 -1
  139. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_serialize__multiple_sources.snap +2 -2
  140. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_serialize__multiple_sources_at_root.snap +2 -2
  141. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_attach.rs +41 -15
  142. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_attach_printable.rs +14 -15
  143. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_backtrace.rs +0 -1
  144. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_change_context.rs +31 -9
  145. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_compatibility.rs +8 -17
  146. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_conversion.rs +25 -3
  147. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_debug.rs +91 -91
  148. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_display.rs +8 -9
  149. data/ext/cargo-vendor/error-stack-0.8.0/tests/test_downcast.rs +101 -0
  150. data/ext/cargo-vendor/error-stack-0.8.0/tests/test_extend.rs +99 -0
  151. data/ext/cargo-vendor/error-stack-0.8.0/tests/test_frame.rs +136 -0
  152. data/ext/cargo-vendor/error-stack-0.8.0/tests/test_iter.rs +132 -0
  153. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_macros.rs +5 -31
  154. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_provision.rs +3 -2
  155. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_serialize.rs +14 -14
  156. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/test_span_trace.rs +10 -11
  157. data/ext/cargo-vendor/error-stack-0.8.0/tests/ui/attach_diagnostics.rs +21 -0
  158. data/ext/cargo-vendor/error-stack-0.8.0/tests/ui/attach_diagnostics.stderr +23 -0
  159. data/ext/cargo-vendor/error-stack-0.8.0/tests/ui/frames_mut_escape.rs +28 -0
  160. data/ext/cargo-vendor/error-stack-0.8.0/tests/ui/frames_mut_escape.stderr +13 -0
  161. data/ext/cargo-vendor/error-stack-0.8.0/tests/ui/macro_invalid_args.rs +32 -0
  162. data/ext/cargo-vendor/error-stack-0.8.0/tests/ui/macro_invalid_args.stderr +132 -0
  163. data/ext/cargo-vendor/error-stack-0.8.0/tests/ui/missing_args.rs +32 -0
  164. data/ext/cargo-vendor/error-stack-0.8.0/tests/ui/missing_args.stderr +35 -0
  165. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/ui/must_use.rs +3 -3
  166. data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/ui/must_use.stderr +1 -1
  167. data/ext/code_ownership/Cargo.toml +1 -1
  168. data/ext/code_ownership/src/lib.rs +13 -1
  169. data/lib/code_ownership/version.rb +1 -1
  170. data/lib/code_ownership.rb +3 -0
  171. metadata +340 -431
  172. data/ext/cargo-vendor/ahash-0.7.8/.cargo-checksum.json +0 -1
  173. data/ext/cargo-vendor/ahash-0.7.8/.cargo_vcs_info.json +0 -6
  174. data/ext/cargo-vendor/ahash-0.7.8/.github/workflows/rust.yml +0 -151
  175. data/ext/cargo-vendor/ahash-0.7.8/Cargo.toml +0 -149
  176. data/ext/cargo-vendor/ahash-0.7.8/Cargo.toml.orig +0 -96
  177. data/ext/cargo-vendor/ahash-0.7.8/FAQ.md +0 -118
  178. data/ext/cargo-vendor/ahash-0.7.8/LICENSE-APACHE +0 -201
  179. data/ext/cargo-vendor/ahash-0.7.8/LICENSE-MIT +0 -25
  180. data/ext/cargo-vendor/ahash-0.7.8/README.md +0 -110
  181. data/ext/cargo-vendor/ahash-0.7.8/build.rs +0 -47
  182. data/ext/cargo-vendor/ahash-0.7.8/rustfmt.toml +0 -1
  183. data/ext/cargo-vendor/ahash-0.7.8/src/aes_hash.rs +0 -440
  184. data/ext/cargo-vendor/ahash-0.7.8/src/convert.rs +0 -167
  185. data/ext/cargo-vendor/ahash-0.7.8/src/fallback_hash.rs +0 -392
  186. data/ext/cargo-vendor/ahash-0.7.8/src/hash_map.rs +0 -371
  187. data/ext/cargo-vendor/ahash-0.7.8/src/hash_quality_test.rs +0 -517
  188. data/ext/cargo-vendor/ahash-0.7.8/src/hash_set.rs +0 -313
  189. data/ext/cargo-vendor/ahash-0.7.8/src/lib.rs +0 -263
  190. data/ext/cargo-vendor/ahash-0.7.8/src/operations.rs +0 -330
  191. data/ext/cargo-vendor/ahash-0.7.8/src/random_state.rs +0 -363
  192. data/ext/cargo-vendor/ahash-0.7.8/src/specialize.rs +0 -239
  193. data/ext/cargo-vendor/ahash-0.7.8/tests/bench.rs +0 -154
  194. data/ext/cargo-vendor/ahash-0.7.8/tests/map_tests.rs +0 -203
  195. data/ext/cargo-vendor/ahash-0.7.8/tests/nopanic.rs +0 -72
  196. data/ext/cargo-vendor/codeowners-0.3.3/.cargo-checksum.json +0 -1
  197. data/ext/cargo-vendor/codeowners-0.3.3/.github/workflows/audit.yml +0 -19
  198. data/ext/cargo-vendor/codeowners-0.3.3/src/ownership/file_owner_resolver.rs +0 -416
  199. data/ext/cargo-vendor/error-stack-0.5.0/.cargo-checksum.json +0 -1
  200. data/ext/cargo-vendor/error-stack-0.5.0/.cargo_vcs_info.json +0 -6
  201. data/ext/cargo-vendor/error-stack-0.5.0/.justfile +0 -58
  202. data/ext/cargo-vendor/error-stack-0.5.0/Cargo.toml.orig +0 -87
  203. data/ext/cargo-vendor/error-stack-0.5.0/build.rs +0 -29
  204. data/ext/cargo-vendor/error-stack-0.5.0/examples/exit_code.rs +0 -24
  205. data/ext/cargo-vendor/error-stack-0.5.0/rust-toolchain.toml +0 -4
  206. data/ext/cargo-vendor/error-stack-0.5.0/src/context.rs +0 -132
  207. data/ext/cargo-vendor/error-stack-0.5.0/src/macros.rs +0 -253
  208. data/ext/cargo-vendor/error-stack-0.5.0/src/result.rs +0 -267
  209. data/ext/cargo-vendor/error-stack-0.5.0/tests/compiletest.rs +0 -7
  210. data/ext/cargo-vendor/error-stack-0.5.0/tests/snapshots/test_debug__sources_nested@backtrace.snap +0 -104
  211. data/ext/cargo-vendor/error-stack-0.5.0/tests/snapshots/test_debug__sources_nested@spantrace.snap +0 -104
  212. data/ext/cargo-vendor/error-stack-0.5.0/tests/snapshots/test_debug__sources_nested_alternate@backtrace.snap +0 -104
  213. data/ext/cargo-vendor/error-stack-0.5.0/tests/snapshots/test_debug__sources_nested_alternate@spantrace.snap +0 -104
  214. data/ext/cargo-vendor/error-stack-0.5.0/tests/test_downcast.rs +0 -41
  215. data/ext/cargo-vendor/error-stack-0.5.0/tests/test_extend.rs +0 -78
  216. data/ext/cargo-vendor/error-stack-0.5.0/tests/test_frame.rs +0 -126
  217. data/ext/cargo-vendor/error-stack-0.5.0/tests/test_iter.rs +0 -99
  218. data/ext/cargo-vendor/error-stack-0.5.0/tests/ui/macro_invalid_args.rs +0 -60
  219. data/ext/cargo-vendor/error-stack-0.5.0/tests/ui/macro_invalid_args.stderr +0 -101
  220. data/ext/cargo-vendor/getrandom-0.2.16/.cargo-checksum.json +0 -1
  221. data/ext/cargo-vendor/getrandom-0.2.16/.cargo_vcs_info.json +0 -6
  222. data/ext/cargo-vendor/getrandom-0.2.16/CHANGELOG.md +0 -498
  223. data/ext/cargo-vendor/getrandom-0.2.16/Cargo.lock +0 -354
  224. data/ext/cargo-vendor/getrandom-0.2.16/Cargo.toml +0 -121
  225. data/ext/cargo-vendor/getrandom-0.2.16/Cargo.toml.orig +0 -67
  226. data/ext/cargo-vendor/getrandom-0.2.16/LICENSE-APACHE +0 -201
  227. data/ext/cargo-vendor/getrandom-0.2.16/LICENSE-MIT +0 -26
  228. data/ext/cargo-vendor/getrandom-0.2.16/README.md +0 -81
  229. data/ext/cargo-vendor/getrandom-0.2.16/SECURITY.md +0 -13
  230. data/ext/cargo-vendor/getrandom-0.2.16/benches/buffer.rs +0 -71
  231. data/ext/cargo-vendor/getrandom-0.2.16/src/apple-other.rs +0 -24
  232. data/ext/cargo-vendor/getrandom-0.2.16/src/custom.rs +0 -105
  233. data/ext/cargo-vendor/getrandom-0.2.16/src/error.rs +0 -189
  234. data/ext/cargo-vendor/getrandom-0.2.16/src/error_impls.rs +0 -15
  235. data/ext/cargo-vendor/getrandom-0.2.16/src/espidf.rs +0 -18
  236. data/ext/cargo-vendor/getrandom-0.2.16/src/fuchsia.rs +0 -13
  237. data/ext/cargo-vendor/getrandom-0.2.16/src/getentropy.rs +0 -21
  238. data/ext/cargo-vendor/getrandom-0.2.16/src/getrandom.rs +0 -25
  239. data/ext/cargo-vendor/getrandom-0.2.16/src/hermit.rs +0 -29
  240. data/ext/cargo-vendor/getrandom-0.2.16/src/js.rs +0 -155
  241. data/ext/cargo-vendor/getrandom-0.2.16/src/lazy.rs +0 -56
  242. data/ext/cargo-vendor/getrandom-0.2.16/src/lib.rs +0 -407
  243. data/ext/cargo-vendor/getrandom-0.2.16/src/linux_android.rs +0 -7
  244. data/ext/cargo-vendor/getrandom-0.2.16/src/linux_android_with_fallback.rs +0 -33
  245. data/ext/cargo-vendor/getrandom-0.2.16/src/netbsd.rs +0 -46
  246. data/ext/cargo-vendor/getrandom-0.2.16/src/rdrand.rs +0 -121
  247. data/ext/cargo-vendor/getrandom-0.2.16/src/solaris.rs +0 -34
  248. data/ext/cargo-vendor/getrandom-0.2.16/src/solid.rs +0 -18
  249. data/ext/cargo-vendor/getrandom-0.2.16/src/use_file.rs +0 -120
  250. data/ext/cargo-vendor/getrandom-0.2.16/src/util.rs +0 -35
  251. data/ext/cargo-vendor/getrandom-0.2.16/src/util_libc.rs +0 -162
  252. data/ext/cargo-vendor/getrandom-0.2.16/src/vxworks.rs +0 -29
  253. data/ext/cargo-vendor/getrandom-0.2.16/src/wasi.rs +0 -17
  254. data/ext/cargo-vendor/getrandom-0.2.16/src/windows.rs +0 -59
  255. data/ext/cargo-vendor/getrandom-0.2.16/tests/common/mod.rs +0 -100
  256. data/ext/cargo-vendor/getrandom-0.2.16/tests/custom.rs +0 -54
  257. data/ext/cargo-vendor/getrandom-0.2.16/tests/normal.rs +0 -11
  258. data/ext/cargo-vendor/getrandom-0.2.16/tests/rdrand.rs +0 -22
  259. data/ext/cargo-vendor/hashbrown-0.12.3/.cargo-checksum.json +0 -1
  260. data/ext/cargo-vendor/hashbrown-0.12.3/.cargo_vcs_info.json +0 -6
  261. data/ext/cargo-vendor/hashbrown-0.12.3/CHANGELOG.md +0 -402
  262. data/ext/cargo-vendor/hashbrown-0.12.3/Cargo.toml +0 -113
  263. data/ext/cargo-vendor/hashbrown-0.12.3/Cargo.toml.orig +0 -60
  264. data/ext/cargo-vendor/hashbrown-0.12.3/LICENSE-APACHE +0 -201
  265. data/ext/cargo-vendor/hashbrown-0.12.3/LICENSE-MIT +0 -25
  266. data/ext/cargo-vendor/hashbrown-0.12.3/README.md +0 -126
  267. data/ext/cargo-vendor/hashbrown-0.12.3/benches/bench.rs +0 -331
  268. data/ext/cargo-vendor/hashbrown-0.12.3/benches/insert_unique_unchecked.rs +0 -32
  269. data/ext/cargo-vendor/hashbrown-0.12.3/clippy.toml +0 -1
  270. data/ext/cargo-vendor/hashbrown-0.12.3/src/external_trait_impls/mod.rs +0 -4
  271. data/ext/cargo-vendor/hashbrown-0.12.3/src/external_trait_impls/rayon/helpers.rs +0 -27
  272. data/ext/cargo-vendor/hashbrown-0.12.3/src/external_trait_impls/rayon/map.rs +0 -734
  273. data/ext/cargo-vendor/hashbrown-0.12.3/src/external_trait_impls/rayon/mod.rs +0 -4
  274. data/ext/cargo-vendor/hashbrown-0.12.3/src/external_trait_impls/rayon/raw.rs +0 -231
  275. data/ext/cargo-vendor/hashbrown-0.12.3/src/external_trait_impls/rayon/set.rs +0 -659
  276. data/ext/cargo-vendor/hashbrown-0.12.3/src/external_trait_impls/serde.rs +0 -201
  277. data/ext/cargo-vendor/hashbrown-0.12.3/src/lib.rs +0 -150
  278. data/ext/cargo-vendor/hashbrown-0.12.3/src/macros.rs +0 -70
  279. data/ext/cargo-vendor/hashbrown-0.12.3/src/map.rs +0 -8408
  280. data/ext/cargo-vendor/hashbrown-0.12.3/src/raw/alloc.rs +0 -73
  281. data/ext/cargo-vendor/hashbrown-0.12.3/src/raw/bitmask.rs +0 -122
  282. data/ext/cargo-vendor/hashbrown-0.12.3/src/raw/generic.rs +0 -154
  283. data/ext/cargo-vendor/hashbrown-0.12.3/src/raw/mod.rs +0 -2460
  284. data/ext/cargo-vendor/hashbrown-0.12.3/src/raw/sse2.rs +0 -146
  285. data/ext/cargo-vendor/hashbrown-0.12.3/src/rustc_entry.rs +0 -630
  286. data/ext/cargo-vendor/hashbrown-0.12.3/src/scopeguard.rs +0 -74
  287. data/ext/cargo-vendor/hashbrown-0.12.3/src/set.rs +0 -2790
  288. data/ext/cargo-vendor/hashbrown-0.12.3/tests/hasher.rs +0 -65
  289. data/ext/cargo-vendor/hashbrown-0.12.3/tests/rayon.rs +0 -533
  290. data/ext/cargo-vendor/hashbrown-0.12.3/tests/serde.rs +0 -65
  291. data/ext/cargo-vendor/hashbrown-0.12.3/tests/set.rs +0 -34
  292. data/ext/cargo-vendor/lru-0.7.8/.cargo-checksum.json +0 -1
  293. data/ext/cargo-vendor/lru-0.7.8/.cargo_vcs_info.json +0 -6
  294. data/ext/cargo-vendor/lru-0.7.8/.github/workflows/main.yml +0 -54
  295. data/ext/cargo-vendor/lru-0.7.8/CHANGELOG.md +0 -194
  296. data/ext/cargo-vendor/lru-0.7.8/Cargo.toml +0 -42
  297. data/ext/cargo-vendor/lru-0.7.8/Cargo.toml.orig +0 -22
  298. data/ext/cargo-vendor/lru-0.7.8/LICENSE +0 -21
  299. data/ext/cargo-vendor/lru-0.7.8/README.md +0 -62
  300. data/ext/cargo-vendor/lru-0.7.8/src/lib.rs +0 -1872
  301. data/ext/cargo-vendor/version_check-0.9.5/.cargo-checksum.json +0 -1
  302. data/ext/cargo-vendor/version_check-0.9.5/.cargo_vcs_info.json +0 -6
  303. data/ext/cargo-vendor/version_check-0.9.5/.github/workflows/ci.yml +0 -42
  304. data/ext/cargo-vendor/version_check-0.9.5/.travis.yml +0 -6
  305. data/ext/cargo-vendor/version_check-0.9.5/Cargo.toml +0 -38
  306. data/ext/cargo-vendor/version_check-0.9.5/Cargo.toml.orig +0 -13
  307. data/ext/cargo-vendor/version_check-0.9.5/LICENSE-APACHE +0 -201
  308. data/ext/cargo-vendor/version_check-0.9.5/LICENSE-MIT +0 -19
  309. data/ext/cargo-vendor/version_check-0.9.5/README.md +0 -80
  310. data/ext/cargo-vendor/version_check-0.9.5/src/channel.rs +0 -195
  311. data/ext/cargo-vendor/version_check-0.9.5/src/date.rs +0 -203
  312. data/ext/cargo-vendor/version_check-0.9.5/src/lib.rs +0 -528
  313. data/ext/cargo-vendor/version_check-0.9.5/src/version.rs +0 -316
  314. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/.cargo-checksum.json +0 -1
  315. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/.cargo_vcs_info.json +0 -6
  316. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/.github/workflows/main.yml +0 -44
  317. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/.gitmodules +0 -3
  318. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/CODE_OF_CONDUCT.md +0 -49
  319. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/CONTRIBUTING.md +0 -8
  320. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/Cargo.lock +0 -23
  321. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/Cargo.toml +0 -59
  322. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/Cargo.toml.orig +0 -29
  323. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/LICENSE-APACHE +0 -201
  324. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/LICENSE-Apache-2.0_WITH_LLVM-exception +0 -220
  325. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/LICENSE-MIT +0 -23
  326. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md +0 -143
  327. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/README.md +0 -94
  328. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/SECURITY.md +0 -29
  329. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/src/lib.rs +0 -47
  330. data/ext/cargo-vendor/wasi-0.11.1+wasi-snapshot-preview1/src/lib_generated.rs +0 -2366
  331. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/.github/CODEOWNERS +0 -0
  332. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/.github/workflows/dotslash-config.json +0 -0
  333. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/.rustfmt.toml +0 -0
  334. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/.rusty-hook.toml +0 -0
  335. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/AGENTS.md +0 -0
  336. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/CLAUDE.md +0 -0
  337. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/README.md +0 -0
  338. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/dev/run_benchmarks_for_file.sh +0 -0
  339. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/dev/run_benchmarks_for_gv.sh +0 -0
  340. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/common_test.rs +0 -0
  341. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/config.rs +0 -0
  342. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/crosscheck.rs +0 -0
  343. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/lib.rs +0 -0
  344. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/codeowners_file_parser.rs +0 -0
  345. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/codeowners_query.rs +0 -0
  346. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/file_generator.rs +0 -0
  347. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/file_owner_finder.rs +0 -0
  348. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/mapper/annotated_file_mapper.rs +0 -0
  349. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/mapper/directory_mapper.rs +0 -0
  350. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/mapper/escaper.rs +0 -0
  351. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/mapper/package_mapper.rs +0 -0
  352. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/mapper/team_gem_mapper.rs +0 -0
  353. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/mapper/team_glob_mapper.rs +0 -0
  354. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/mapper/team_yml_mapper.rs +0 -0
  355. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/ownership/mapper.rs +0 -0
  356. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/path_utils.rs +0 -0
  357. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/src/tracked_files.rs +0 -0
  358. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/cache_test.rs +0 -0
  359. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/codeowners_path_test.rs +0 -0
  360. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/crosscheck_owners_test.rs +0 -0
  361. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/executable_name_config_test.rs +10 -10
  362. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_codeowners_path/config/code_ownership.yml +0 -0
  363. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_codeowners_path/config/teams/test_team.yml +0 -0
  364. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_codeowners_path/docs/CODEOWNERS +3 -3
  365. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_codeowners_path/expected/CODEOWNERS +3 -3
  366. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_codeowners_path/ruby/app/models/test.rb +0 -0
  367. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_executable_name/.github/CODEOWNERS +0 -0
  368. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_executable_name/app/foo.rb +0 -0
  369. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_executable_name/config/code_ownership.yml +0 -0
  370. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_executable_name/config/teams/foo.yml +0 -0
  371. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_executable_name/config/teams/payments.yml +0 -0
  372. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/custom_executable_name/ruby/app/payments/foo.rb +0 -0
  373. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/default_executable_name/.github/CODEOWNERS +0 -0
  374. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/default_executable_name/app/bar.rb +0 -0
  375. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/default_executable_name/config/code_ownership.yml +0 -0
  376. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/default_executable_name/config/teams/bar.yml +0 -0
  377. data/ext/cargo-vendor/{codeowners-0.3.3/tests/fixtures/multiple-directory-owners/app/services → codeowners-0.5.0/tests/fixtures/directory-codeowner-github-team/app/by_name}/.codeowner +0 -0
  378. data/ext/cargo-vendor/{codeowners-0.3.3/tests/fixtures/multiple-directory-owners → codeowners-0.5.0/tests/fixtures/directory-codeowner-github-team}/config/code_ownership.yml +0 -0
  379. data/ext/cargo-vendor/{codeowners-0.3.3/tests/fixtures/multiple-directory-owners → codeowners-0.5.0/tests/fixtures/directory-codeowner-github-team}/config/teams/foo.yml +0 -0
  380. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/.github/CODEOWNERS +0 -0
  381. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/config/code_ownership.yml +0 -0
  382. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/config/teams/payments.yml +0 -0
  383. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/config/teams/payroll.yml +0 -0
  384. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/gems/payroll_calculator/calculator.rb +0 -0
  385. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/ruby/app/models/bank_account.rb +0 -0
  386. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/ruby/app/models/blockchain.rb +0 -0
  387. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/ruby/app/models/payroll.rb +0 -0
  388. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/ruby/app/payments/nacha.rb +0 -0
  389. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/ruby/app/services/.codeowner +0 -0
  390. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/ruby/app/services/multi_owned.rb +0 -0
  391. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/ruby/app/unowned.rb +0 -0
  392. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/invalid_project/ruby/packages/payroll_flow/package.yml +0 -0
  393. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/.github/CODEOWNERS +0 -0
  394. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/.keep +0 -0
  395. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/config/code_ownership.yml +0 -0
  396. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/config/teams/design.yml +0 -0
  397. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/config/teams/frontend.yml +0 -0
  398. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/frontend/apps/public/index.tsx +0 -0
  399. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/package.json +0 -0
  400. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/src/index.tsx +0 -0
  401. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/.codeowner +0 -0
  402. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/src/button.tsx +0 -0
  403. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/missing_github_team/.github/CODEOWNERS +0 -0
  404. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/missing_github_team/config/code_ownership.yml +0 -0
  405. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/missing_github_team/config/teams/bad_team.yml +0 -0
  406. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/missing_github_team/config/teams/good.yml +0 -0
  407. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/missing_github_team/gems/pets/dog.rb +0 -0
  408. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/multiple-directory-owners/.github/CODEOWNERS +0 -0
  409. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/multiple-directory-owners/app/consumers/.codeowner +0 -0
  410. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/multiple-directory-owners/app/consumers/deep/nesting/nestdir/deep_file.rb +0 -0
  411. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/multiple-directory-owners/app/consumers/one_owner.rb +0 -0
  412. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/multiple-directory-owners/app/services/exciting/.codeowner +0 -0
  413. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/multiple-directory-owners/app/services/exciting/some_other_file.rb +0 -0
  414. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/multiple-directory-owners/config/teams/bar.yml +0 -0
  415. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/.github/CODEOWNERS +9 -9
  416. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/.ignore +0 -0
  417. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/config/code_ownership.yml +0 -0
  418. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/config/teams/payments.yml +0 -0
  419. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/config/teams/payroll.yml +0 -0
  420. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/config/teams/ux.yml +0 -0
  421. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/gems/payroll_calculator/calculator.rb +0 -0
  422. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/gems/pets/dog.rb +0 -0
  423. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/index.tsx +0 -0
  424. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/package.json +0 -0
  425. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/javascript/packages/items/(special)/.codeowner +0 -0
  426. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/javascript/packages/items/(special)/pay.ts +0 -0
  427. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/javascript/packages/items/.codeowner +0 -0
  428. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/javascript/packages/items/item.ts +0 -0
  429. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/javascript/packages/list/page-admin.tsx +0 -0
  430. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/models/bank_account.rb +0 -0
  431. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/models/payroll.rb +0 -0
  432. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/payments/foo/.codeowner +0 -0
  433. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/payments/foo/ownedby_payroll.rb +0 -0
  434. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/payments/nacha.rb +0 -0
  435. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/payroll/.codeowner +0 -0
  436. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/payroll/payroll.rb +0 -0
  437. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/views/foos/edit.erb +0 -0
  438. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/views/foos/index.html.erb +0 -0
  439. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/app/views/foos/new.html.erb +0 -0
  440. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/ignored_files/git_ignored.rb +0 -0
  441. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/ruby/packages/payroll_flow/package.yml +0 -0
  442. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project/should_be_ignored/an_ignored_file.rb +0 -0
  443. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/.github/CODEOWNERS +12 -12
  444. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/config/code_ownership.yml +0 -0
  445. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/config/teams/brewers.yml +0 -0
  446. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/config/teams/cubs.yml +0 -0
  447. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/config/teams/giants.yml +0 -0
  448. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/config/teams/rockies.yml +0 -0
  449. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/package.json +0 -0
  450. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/src/picks/dp.tsx +0 -0
  451. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/package.json +0 -0
  452. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/src/item.tsx +0 -0
  453. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/package.json +0 -0
  454. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/field.tsx +0 -0
  455. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/fields/small.tsx +0 -0
  456. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/gems/apollo/lib/apollo.rb +0 -0
  457. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/gems/ivy/lib/ivy.rb +0 -0
  458. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/gems/lager/lib/lager.rb +0 -0
  459. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/gems/summit/lib/summit.rb +0 -0
  460. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/packs/games/app/services/stats.rb +0 -0
  461. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/packs/games/package.yml +0 -0
  462. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/packs/locations/app/services/capacity.rb +0 -0
  463. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/packs/locations/package.yml +0 -0
  464. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/packs/schedule/app/services/date.rb +0 -0
  465. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/packs/schedule/package.yml +0 -0
  466. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/lib/util.rb +0 -0
  467. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/services/play.rb +0 -0
  468. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/.codeowner +0 -0
  469. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/.codeowner +0 -0
  470. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/db/price.rb +0 -0
  471. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/entertainment.rb +0 -0
  472. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/play.rb +0 -0
  473. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/giants/services/play.rb +0 -0
  474. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/fixtures/valid_project_with_overrides/ruby/app/rockies/services/play.rb +0 -0
  475. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/git_stage_test.rs +0 -0
  476. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/invalid_project_structure_test.rs +0 -0
  477. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/missing_github_team_test.rs +0 -0
  478. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/multiple_directory_owners_test.rs +0 -0
  479. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/run_config_executable_override_test.rs +0 -0
  480. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/runner_api.rs +0 -0
  481. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/untracked_files_test.rs +0 -0
  482. data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/valid_project_test.rs +6 -6
  483. /data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/valid_project_with_overrides_test.rs +0 -0
  484. /data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tests/validate_files_test.rs +0 -0
  485. /data/ext/cargo-vendor/{codeowners-0.3.3 → codeowners-0.5.0}/tmp/.gitkeep +0 -0
  486. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/LICENSE-APACHE.md +0 -0
  487. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/LICENSE-MIT.md +0 -0
  488. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/LICENSE.md +0 -0
  489. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/src/fmt/override.rs +0 -0
  490. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/hook__location_hook.snap +0 -0
  491. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/report_display__doc.snap +0 -0
  492. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/doc/report_display_alt__doc.snap +0 -0
  493. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__alt.snap +0 -0
  494. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__charset_ascii.snap +0 -0
  495. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__color_mode_color.snap +0 -0
  496. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__color_mode_emphasis.snap +0 -0
  497. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__hook.snap +0 -0
  498. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__hook_context.snap +0 -0
  499. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__hook_decr.snap +0 -0
  500. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__hook_for_context.snap +0 -0
  501. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__hook_incr.snap +0 -0
  502. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__hook_multiple.snap +0 -0
  503. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__hook_provider.snap +0 -0
  504. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__multiline.snap +0 -0
  505. /data/ext/cargo-vendor/{error-stack-0.5.0 → error-stack-0.8.0}/tests/snapshots/test_debug__full__norm.snap +0 -0
@@ -1,1872 +0,0 @@
1
- // MIT License
2
-
3
- // Copyright (c) 2016 Jerome Froelich
4
-
5
- // Permission is hereby granted, free of charge, to any person obtaining a copy
6
- // of this software and associated documentation files (the "Software"), to deal
7
- // in the Software without restriction, including without limitation the rights
8
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- // copies of the Software, and to permit persons to whom the Software is
10
- // furnished to do so, subject to the following conditions:
11
-
12
- // The above copyright notice and this permission notice shall be included in all
13
- // copies or substantial portions of the Software.
14
-
15
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- // SOFTWARE.
22
-
23
- //! An implementation of a LRU cache. The cache supports `get`, `get_mut`, `put`,
24
- //! and `pop` operations, all of which are O(1). This crate was heavily influenced
25
- //! by the [LRU Cache implementation in an earlier version of Rust's std::collections crate](https://doc.rust-lang.org/0.12.0/std/collections/lru_cache/struct.LruCache.html).
26
- //!
27
- //! ## Example
28
- //!
29
- //! ```rust
30
- //! extern crate lru;
31
- //!
32
- //! use lru::LruCache;
33
- //!
34
- //! fn main() {
35
- //! let mut cache = LruCache::new(2);
36
- //! cache.put("apple", 3);
37
- //! cache.put("banana", 2);
38
- //!
39
- //! assert_eq!(*cache.get(&"apple").unwrap(), 3);
40
- //! assert_eq!(*cache.get(&"banana").unwrap(), 2);
41
- //! assert!(cache.get(&"pear").is_none());
42
- //!
43
- //! assert_eq!(cache.put("banana", 4), Some(2));
44
- //! assert_eq!(cache.put("pear", 5), None);
45
- //!
46
- //! assert_eq!(*cache.get(&"pear").unwrap(), 5);
47
- //! assert_eq!(*cache.get(&"banana").unwrap(), 4);
48
- //! assert!(cache.get(&"apple").is_none());
49
- //!
50
- //! {
51
- //! let v = cache.get_mut(&"banana").unwrap();
52
- //! *v = 6;
53
- //! }
54
- //!
55
- //! assert_eq!(*cache.get(&"banana").unwrap(), 6);
56
- //! }
57
- //! ```
58
-
59
- #![no_std]
60
- #![cfg_attr(feature = "nightly", feature(negative_impls, auto_traits))]
61
-
62
- #[cfg(feature = "hashbrown")]
63
- extern crate hashbrown;
64
-
65
- #[cfg(test)]
66
- extern crate scoped_threadpool;
67
-
68
- use alloc::borrow::Borrow;
69
- use alloc::boxed::Box;
70
- use core::fmt;
71
- use core::hash::{BuildHasher, Hash, Hasher};
72
- use core::iter::FusedIterator;
73
- use core::marker::PhantomData;
74
- use core::mem;
75
- use core::ptr;
76
- use core::usize;
77
-
78
- #[cfg(any(test, not(feature = "hashbrown")))]
79
- extern crate std;
80
-
81
- #[cfg(feature = "hashbrown")]
82
- use hashbrown::HashMap;
83
- #[cfg(not(feature = "hashbrown"))]
84
- use std::collections::HashMap;
85
-
86
- extern crate alloc;
87
-
88
- // Struct used to hold a reference to a key
89
- #[doc(hidden)]
90
- pub struct KeyRef<K> {
91
- k: *const K,
92
- }
93
-
94
- impl<K: Hash> Hash for KeyRef<K> {
95
- fn hash<H: Hasher>(&self, state: &mut H) {
96
- unsafe { (*self.k).hash(state) }
97
- }
98
- }
99
-
100
- impl<K: PartialEq> PartialEq for KeyRef<K> {
101
- fn eq(&self, other: &KeyRef<K>) -> bool {
102
- unsafe { (*self.k).eq(&*other.k) }
103
- }
104
- }
105
-
106
- impl<K: Eq> Eq for KeyRef<K> {}
107
-
108
- #[cfg(feature = "nightly")]
109
- #[doc(hidden)]
110
- pub auto trait NotKeyRef {}
111
-
112
- #[cfg(feature = "nightly")]
113
- impl<K> !NotKeyRef for KeyRef<K> {}
114
-
115
- #[cfg(feature = "nightly")]
116
- impl<K, D> Borrow<D> for KeyRef<K>
117
- where
118
- K: Borrow<D>,
119
- D: NotKeyRef + ?Sized,
120
- {
121
- fn borrow(&self) -> &D {
122
- unsafe { &*self.k }.borrow()
123
- }
124
- }
125
-
126
- #[cfg(not(feature = "nightly"))]
127
- impl<K> Borrow<K> for KeyRef<K> {
128
- fn borrow(&self) -> &K {
129
- unsafe { &*self.k }
130
- }
131
- }
132
-
133
- #[cfg(not(feature = "nightly"))]
134
- impl Borrow<str> for KeyRef<alloc::string::String> {
135
- fn borrow(&self) -> &str {
136
- unsafe { &*self.k }
137
- }
138
- }
139
-
140
- #[cfg(not(feature = "nightly"))]
141
- impl<T: ?Sized> Borrow<T> for KeyRef<Box<T>> {
142
- fn borrow(&self) -> &T {
143
- unsafe { &*self.k }
144
- }
145
- }
146
-
147
- #[cfg(not(feature = "nightly"))]
148
- impl<T> Borrow<[T]> for KeyRef<alloc::vec::Vec<T>> {
149
- fn borrow(&self) -> &[T] {
150
- unsafe { &*self.k }
151
- }
152
- }
153
-
154
- // Struct used to hold a key value pair. Also contains references to previous and next entries
155
- // so we can maintain the entries in a linked list ordered by their use.
156
- struct LruEntry<K, V> {
157
- key: mem::MaybeUninit<K>,
158
- val: mem::MaybeUninit<V>,
159
- prev: *mut LruEntry<K, V>,
160
- next: *mut LruEntry<K, V>,
161
- }
162
-
163
- impl<K, V> LruEntry<K, V> {
164
- fn new(key: K, val: V) -> Self {
165
- LruEntry {
166
- key: mem::MaybeUninit::new(key),
167
- val: mem::MaybeUninit::new(val),
168
- prev: ptr::null_mut(),
169
- next: ptr::null_mut(),
170
- }
171
- }
172
-
173
- fn new_sigil() -> Self {
174
- LruEntry {
175
- key: mem::MaybeUninit::uninit(),
176
- val: mem::MaybeUninit::uninit(),
177
- prev: ptr::null_mut(),
178
- next: ptr::null_mut(),
179
- }
180
- }
181
- }
182
-
183
- #[cfg(feature = "hashbrown")]
184
- pub type DefaultHasher = hashbrown::hash_map::DefaultHashBuilder;
185
- #[cfg(not(feature = "hashbrown"))]
186
- pub type DefaultHasher = std::collections::hash_map::RandomState;
187
-
188
- /// An LRU Cache
189
- pub struct LruCache<K, V, S = DefaultHasher> {
190
- map: HashMap<KeyRef<K>, Box<LruEntry<K, V>>, S>,
191
- cap: usize,
192
-
193
- // head and tail are sigil nodes to faciliate inserting entries
194
- head: *mut LruEntry<K, V>,
195
- tail: *mut LruEntry<K, V>,
196
- }
197
-
198
- impl<K: Hash + Eq, V> LruCache<K, V> {
199
- /// Creates a new LRU Cache that holds at most `cap` items.
200
- ///
201
- /// # Example
202
- ///
203
- /// ```
204
- /// use lru::LruCache;
205
- /// let mut cache: LruCache<isize, &str> = LruCache::new(10);
206
- /// ```
207
- pub fn new(cap: usize) -> LruCache<K, V> {
208
- LruCache::construct(cap, HashMap::with_capacity(cap))
209
- }
210
-
211
- /// Creates a new LRU Cache that never automatically evicts items.
212
- ///
213
- /// # Example
214
- ///
215
- /// ```
216
- /// use lru::LruCache;
217
- /// let mut cache: LruCache<isize, &str> = LruCache::unbounded();
218
- /// ```
219
- pub fn unbounded() -> LruCache<K, V> {
220
- LruCache::construct(usize::MAX, HashMap::default())
221
- }
222
- }
223
-
224
- impl<K: Hash + Eq, V, S: BuildHasher> LruCache<K, V, S> {
225
- /// Creates a new LRU Cache that holds at most `cap` items and
226
- /// uses the provided hash builder to hash keys.
227
- ///
228
- /// # Example
229
- ///
230
- /// ```
231
- /// use lru::{LruCache, DefaultHasher};
232
- ///
233
- /// let s = DefaultHasher::default();
234
- /// let mut cache: LruCache<isize, &str> = LruCache::with_hasher(10, s);
235
- /// ```
236
- pub fn with_hasher(cap: usize, hash_builder: S) -> LruCache<K, V, S> {
237
- LruCache::construct(cap, HashMap::with_capacity_and_hasher(cap, hash_builder))
238
- }
239
-
240
- /// Creates a new LRU Cache that never automatically evicts items and
241
- /// uses the provided hash builder to hash keys.
242
- ///
243
- /// # Example
244
- ///
245
- /// ```
246
- /// use lru::{LruCache, DefaultHasher};
247
- ///
248
- /// let s = DefaultHasher::default();
249
- /// let mut cache: LruCache<isize, &str> = LruCache::unbounded_with_hasher(s);
250
- /// ```
251
- pub fn unbounded_with_hasher(hash_builder: S) -> LruCache<K, V, S> {
252
- LruCache::construct(usize::MAX, HashMap::with_hasher(hash_builder))
253
- }
254
-
255
- /// Creates a new LRU Cache with the given capacity.
256
- fn construct(cap: usize, map: HashMap<KeyRef<K>, Box<LruEntry<K, V>>, S>) -> LruCache<K, V, S> {
257
- // NB: The compiler warns that cache does not need to be marked as mutable if we
258
- // declare it as such since we only mutate it inside the unsafe block.
259
- let cache = LruCache {
260
- map,
261
- cap,
262
- head: Box::into_raw(Box::new(LruEntry::new_sigil())),
263
- tail: Box::into_raw(Box::new(LruEntry::new_sigil())),
264
- };
265
-
266
- unsafe {
267
- (*cache.head).next = cache.tail;
268
- (*cache.tail).prev = cache.head;
269
- }
270
-
271
- cache
272
- }
273
-
274
- /// Puts a key-value pair into cache. If the key already exists in the cache, then it updates
275
- /// the key's value and returns the old value. Otherwise, `None` is returned.
276
- ///
277
- /// # Example
278
- ///
279
- /// ```
280
- /// use lru::LruCache;
281
- /// let mut cache = LruCache::new(2);
282
- ///
283
- /// assert_eq!(None, cache.put(1, "a"));
284
- /// assert_eq!(None, cache.put(2, "b"));
285
- /// assert_eq!(Some("b"), cache.put(2, "beta"));
286
- ///
287
- /// assert_eq!(cache.get(&1), Some(&"a"));
288
- /// assert_eq!(cache.get(&2), Some(&"beta"));
289
- /// ```
290
- pub fn put(&mut self, k: K, v: V) -> Option<V> {
291
- self.capturing_put(k, v, false).map(|(_, v)| v)
292
- }
293
-
294
- /// Pushes a key-value pair into the cache. If an entry with key `k` already exists in
295
- /// the cache or another cache entry is removed (due to the lru's capacity),
296
- /// then it returns the old entry's key-value pair. Otherwise, returns `None`.
297
- ///
298
- /// # Example
299
- ///
300
- /// ```
301
- /// use lru::LruCache;
302
- /// let mut cache = LruCache::new(2);
303
- ///
304
- /// assert_eq!(None, cache.push(1, "a"));
305
- /// assert_eq!(None, cache.push(2, "b"));
306
- ///
307
- /// // This push call returns (2, "b") because that was previously 2's entry in the cache.
308
- /// assert_eq!(Some((2, "b")), cache.push(2, "beta"));
309
- ///
310
- /// // This push call returns (1, "a") because the cache is at capacity and 1's entry was the lru entry.
311
- /// assert_eq!(Some((1, "a")), cache.push(3, "alpha"));
312
- ///
313
- /// assert_eq!(cache.get(&1), None);
314
- /// assert_eq!(cache.get(&2), Some(&"beta"));
315
- /// assert_eq!(cache.get(&3), Some(&"alpha"));
316
- /// ```
317
- pub fn push(&mut self, k: K, v: V) -> Option<(K, V)> {
318
- self.capturing_put(k, v, true)
319
- }
320
-
321
- // Used internally by `put` and `push` to add a new entry to the lru.
322
- // Takes ownership of and returns entries replaced due to the cache's capacity
323
- // when `capture` is true.
324
- fn capturing_put(&mut self, k: K, mut v: V, capture: bool) -> Option<(K, V)> {
325
- let node_ref = self.map.get_mut(&KeyRef { k: &k });
326
-
327
- match node_ref {
328
- Some(node_ref) => {
329
- let node_ptr: *mut LruEntry<K, V> = &mut **node_ref;
330
-
331
- // if the key is already in the cache just update its value and move it to the
332
- // front of the list
333
- unsafe { mem::swap(&mut v, &mut (*(*node_ptr).val.as_mut_ptr()) as &mut V) }
334
- self.detach(node_ptr);
335
- self.attach(node_ptr);
336
- Some((k, v))
337
- }
338
- None => {
339
- // if the capacity is zero, do nothing
340
- if self.cap() == 0 {
341
- return None;
342
- }
343
-
344
- let (replaced, mut node) = self.replace_or_create_node(k, v);
345
-
346
- let node_ptr: *mut LruEntry<K, V> = &mut *node;
347
- self.attach(node_ptr);
348
-
349
- let keyref = unsafe { (*node_ptr).key.as_ptr() };
350
- self.map.insert(KeyRef { k: keyref }, node);
351
-
352
- replaced.filter(|_| capture)
353
- }
354
- }
355
- }
356
-
357
- // Used internally to swap out a node if the cache is full or to create a new node if space
358
- // is available. Shared between `put`, `push`, and `get_or_insert`.
359
- fn replace_or_create_node(&mut self, k: K, v: V) -> (Option<(K, V)>, Box<LruEntry<K, V>>) {
360
- if self.len() == self.cap() {
361
- // if the cache is full, remove the last entry so we can use it for the new key
362
- let old_key = KeyRef {
363
- k: unsafe { &(*(*(*self.tail).prev).key.as_ptr()) },
364
- };
365
- let mut old_node = self.map.remove(&old_key).unwrap();
366
-
367
- // read out the node's old key and value and then replace it
368
- let replaced = unsafe { (old_node.key.assume_init(), old_node.val.assume_init()) };
369
-
370
- old_node.key = mem::MaybeUninit::new(k);
371
- old_node.val = mem::MaybeUninit::new(v);
372
-
373
- let node_ptr: *mut LruEntry<K, V> = &mut *old_node;
374
- self.detach(node_ptr);
375
-
376
- (Some(replaced), old_node)
377
- } else {
378
- // if the cache is not full allocate a new LruEntry
379
- (None, Box::new(LruEntry::new(k, v)))
380
- }
381
- }
382
-
383
- /// Returns a reference to the value of the key in the cache or `None` if it is not
384
- /// present in the cache. Moves the key to the head of the LRU list if it exists.
385
- ///
386
- /// # Example
387
- ///
388
- /// ```
389
- /// use lru::LruCache;
390
- /// let mut cache = LruCache::new(2);
391
- ///
392
- /// cache.put(1, "a");
393
- /// cache.put(2, "b");
394
- /// cache.put(2, "c");
395
- /// cache.put(3, "d");
396
- ///
397
- /// assert_eq!(cache.get(&1), None);
398
- /// assert_eq!(cache.get(&2), Some(&"c"));
399
- /// assert_eq!(cache.get(&3), Some(&"d"));
400
- /// ```
401
- pub fn get<'a, Q>(&'a mut self, k: &Q) -> Option<&'a V>
402
- where
403
- KeyRef<K>: Borrow<Q>,
404
- Q: Hash + Eq + ?Sized,
405
- {
406
- if let Some(node) = self.map.get_mut(k) {
407
- let node_ptr: *mut LruEntry<K, V> = &mut **node;
408
-
409
- self.detach(node_ptr);
410
- self.attach(node_ptr);
411
-
412
- Some(unsafe { &(*(*node_ptr).val.as_ptr()) as &V })
413
- } else {
414
- None
415
- }
416
- }
417
-
418
- /// Returns a mutable reference to the value of the key in the cache or `None` if it
419
- /// is not present in the cache. Moves the key to the head of the LRU list if it exists.
420
- ///
421
- /// # Example
422
- ///
423
- /// ```
424
- /// use lru::LruCache;
425
- /// let mut cache = LruCache::new(2);
426
- ///
427
- /// cache.put("apple", 8);
428
- /// cache.put("banana", 4);
429
- /// cache.put("banana", 6);
430
- /// cache.put("pear", 2);
431
- ///
432
- /// assert_eq!(cache.get_mut(&"apple"), None);
433
- /// assert_eq!(cache.get_mut(&"banana"), Some(&mut 6));
434
- /// assert_eq!(cache.get_mut(&"pear"), Some(&mut 2));
435
- /// ```
436
- pub fn get_mut<'a, Q>(&'a mut self, k: &Q) -> Option<&'a mut V>
437
- where
438
- KeyRef<K>: Borrow<Q>,
439
- Q: Hash + Eq + ?Sized,
440
- {
441
- if let Some(node) = self.map.get_mut(k) {
442
- let node_ptr: *mut LruEntry<K, V> = &mut **node;
443
-
444
- self.detach(node_ptr);
445
- self.attach(node_ptr);
446
-
447
- Some(unsafe { &mut (*(*node_ptr).val.as_mut_ptr()) as &mut V })
448
- } else {
449
- None
450
- }
451
- }
452
-
453
- /// Returns a reference to the value of the key in the cache if it is
454
- /// present in the cache and moves the key to the head of the LRU list.
455
- /// If the key does not exist the provided `FnOnce` is used to populate
456
- /// the list and a reference is returned.
457
- ///
458
- /// This method will only return `None` when the capacity of the cache is 0 and no entries
459
- /// can be populated.
460
- ///
461
- /// # Example
462
- ///
463
- /// ```
464
- /// use lru::LruCache;
465
- /// let mut cache = LruCache::new(2);
466
- ///
467
- /// cache.put(1, "a");
468
- /// cache.put(2, "b");
469
- /// cache.put(2, "c");
470
- /// cache.put(3, "d");
471
- ///
472
- /// assert_eq!(cache.get_or_insert(2, ||"a"), Some(&"c"));
473
- /// assert_eq!(cache.get_or_insert(3, ||"a"), Some(&"d"));
474
- /// assert_eq!(cache.get_or_insert(1, ||"a"), Some(&"a"));
475
- /// assert_eq!(cache.get_or_insert(1, ||"b"), Some(&"a"));
476
- /// ```
477
- pub fn get_or_insert<'a, F>(&'a mut self, k: K, f: F) -> Option<&'a V>
478
- where
479
- F: FnOnce() -> V,
480
- {
481
- if let Some(node) = self.map.get_mut(&KeyRef { k: &k }) {
482
- let node_ptr: *mut LruEntry<K, V> = &mut **node;
483
-
484
- self.detach(node_ptr);
485
- self.attach(node_ptr);
486
-
487
- Some(unsafe { &(*(*node_ptr).val.as_ptr()) as &V })
488
- } else {
489
- // If the capacity is 0 we do nothing,
490
- // this is the only circumstance that should return None
491
- if self.cap() == 0 {
492
- return None;
493
- }
494
- let v = f();
495
- let (_, mut node) = self.replace_or_create_node(k, v);
496
-
497
- let node_ptr: *mut LruEntry<K, V> = &mut *node;
498
- self.attach(node_ptr);
499
-
500
- let keyref = unsafe { (*node_ptr).key.as_ptr() };
501
- self.map.insert(KeyRef { k: keyref }, node);
502
- Some(unsafe { &(*(*node_ptr).val.as_ptr()) as &V })
503
- }
504
- }
505
-
506
- /// Returns a reference to the value corresponding to the key in the cache or `None` if it is
507
- /// not present in the cache. Unlike `get`, `peek` does not update the LRU list so the key's
508
- /// position will be unchanged.
509
- ///
510
- /// # Example
511
- ///
512
- /// ```
513
- /// use lru::LruCache;
514
- /// let mut cache = LruCache::new(2);
515
- ///
516
- /// cache.put(1, "a");
517
- /// cache.put(2, "b");
518
- ///
519
- /// assert_eq!(cache.peek(&1), Some(&"a"));
520
- /// assert_eq!(cache.peek(&2), Some(&"b"));
521
- /// ```
522
- pub fn peek<'a, Q>(&'a self, k: &Q) -> Option<&'a V>
523
- where
524
- KeyRef<K>: Borrow<Q>,
525
- Q: Hash + Eq + ?Sized,
526
- {
527
- self.map
528
- .get(k)
529
- .map(|node| unsafe { &(*(*node).val.as_ptr()) as &V })
530
- }
531
-
532
- /// Returns a mutable reference to the value corresponding to the key in the cache or `None`
533
- /// if it is not present in the cache. Unlike `get_mut`, `peek_mut` does not update the LRU
534
- /// list so the key's position will be unchanged.
535
- ///
536
- /// # Example
537
- ///
538
- /// ```
539
- /// use lru::LruCache;
540
- /// let mut cache = LruCache::new(2);
541
- ///
542
- /// cache.put(1, "a");
543
- /// cache.put(2, "b");
544
- ///
545
- /// assert_eq!(cache.peek_mut(&1), Some(&mut "a"));
546
- /// assert_eq!(cache.peek_mut(&2), Some(&mut "b"));
547
- /// ```
548
- pub fn peek_mut<'a, Q>(&'a mut self, k: &Q) -> Option<&'a mut V>
549
- where
550
- KeyRef<K>: Borrow<Q>,
551
- Q: Hash + Eq + ?Sized,
552
- {
553
- match self.map.get_mut(k) {
554
- None => None,
555
- Some(node) => Some(unsafe { &mut (*(*node).val.as_mut_ptr()) as &mut V }),
556
- }
557
- }
558
-
559
- /// Returns the value corresponding to the least recently used item or `None` if the
560
- /// cache is empty. Like `peek`, `peek_lru` does not update the LRU list so the item's
561
- /// position will be unchanged.
562
- ///
563
- /// # Example
564
- ///
565
- /// ```
566
- /// use lru::LruCache;
567
- /// let mut cache = LruCache::new(2);
568
- ///
569
- /// cache.put(1, "a");
570
- /// cache.put(2, "b");
571
- ///
572
- /// assert_eq!(cache.peek_lru(), Some((&1, &"a")));
573
- /// ```
574
- pub fn peek_lru<'a>(&'_ self) -> Option<(&'a K, &'a V)> {
575
- if self.is_empty() {
576
- return None;
577
- }
578
-
579
- let (key, val);
580
- unsafe {
581
- let node = (*self.tail).prev;
582
- key = &(*(*node).key.as_ptr()) as &K;
583
- val = &(*(*node).val.as_ptr()) as &V;
584
- }
585
-
586
- Some((key, val))
587
- }
588
-
589
- /// Returns a bool indicating whether the given key is in the cache. Does not update the
590
- /// LRU list.
591
- ///
592
- /// # Example
593
- ///
594
- /// ```
595
- /// use lru::LruCache;
596
- /// let mut cache = LruCache::new(2);
597
- ///
598
- /// cache.put(1, "a");
599
- /// cache.put(2, "b");
600
- /// cache.put(3, "c");
601
- ///
602
- /// assert!(!cache.contains(&1));
603
- /// assert!(cache.contains(&2));
604
- /// assert!(cache.contains(&3));
605
- /// ```
606
- pub fn contains<Q>(&self, k: &Q) -> bool
607
- where
608
- KeyRef<K>: Borrow<Q>,
609
- Q: Hash + Eq + ?Sized,
610
- {
611
- self.map.contains_key(k)
612
- }
613
-
614
- /// Removes and returns the value corresponding to the key from the cache or
615
- /// `None` if it does not exist.
616
- ///
617
- /// # Example
618
- ///
619
- /// ```
620
- /// use lru::LruCache;
621
- /// let mut cache = LruCache::new(2);
622
- ///
623
- /// cache.put(2, "a");
624
- ///
625
- /// assert_eq!(cache.pop(&1), None);
626
- /// assert_eq!(cache.pop(&2), Some("a"));
627
- /// assert_eq!(cache.pop(&2), None);
628
- /// assert_eq!(cache.len(), 0);
629
- /// ```
630
- pub fn pop<Q>(&mut self, k: &Q) -> Option<V>
631
- where
632
- KeyRef<K>: Borrow<Q>,
633
- Q: Hash + Eq + ?Sized,
634
- {
635
- match self.map.remove(k) {
636
- None => None,
637
- Some(mut old_node) => {
638
- unsafe {
639
- ptr::drop_in_place(old_node.key.as_mut_ptr());
640
- }
641
- let node_ptr: *mut LruEntry<K, V> = &mut *old_node;
642
- self.detach(node_ptr);
643
- unsafe { Some(old_node.val.assume_init()) }
644
- }
645
- }
646
- }
647
-
648
- /// Removes and returns the key and the value corresponding to the key from the cache or
649
- /// `None` if it does not exist.
650
- ///
651
- /// # Example
652
- ///
653
- /// ```
654
- /// use lru::LruCache;
655
- /// let mut cache = LruCache::new(2);
656
- ///
657
- /// cache.put(1, "a");
658
- /// cache.put(2, "a");
659
- ///
660
- /// assert_eq!(cache.pop(&1), Some("a"));
661
- /// assert_eq!(cache.pop_entry(&2), Some((2, "a")));
662
- /// assert_eq!(cache.pop(&1), None);
663
- /// assert_eq!(cache.pop_entry(&2), None);
664
- /// assert_eq!(cache.len(), 0);
665
- /// ```
666
- pub fn pop_entry<Q>(&mut self, k: &Q) -> Option<(K, V)>
667
- where
668
- KeyRef<K>: Borrow<Q>,
669
- Q: Hash + Eq + ?Sized,
670
- {
671
- match self.map.remove(k) {
672
- None => None,
673
- Some(mut old_node) => {
674
- let node_ptr: *mut LruEntry<K, V> = &mut *old_node;
675
- self.detach(node_ptr);
676
- unsafe { Some((old_node.key.assume_init(), old_node.val.assume_init())) }
677
- }
678
- }
679
- }
680
-
681
- /// Removes and returns the key and value corresponding to the least recently
682
- /// used item or `None` if the cache is empty.
683
- ///
684
- /// # Example
685
- ///
686
- /// ```
687
- /// use lru::LruCache;
688
- /// let mut cache = LruCache::new(2);
689
- ///
690
- /// cache.put(2, "a");
691
- /// cache.put(3, "b");
692
- /// cache.put(4, "c");
693
- /// cache.get(&3);
694
- ///
695
- /// assert_eq!(cache.pop_lru(), Some((4, "c")));
696
- /// assert_eq!(cache.pop_lru(), Some((3, "b")));
697
- /// assert_eq!(cache.pop_lru(), None);
698
- /// assert_eq!(cache.len(), 0);
699
- /// ```
700
- pub fn pop_lru(&mut self) -> Option<(K, V)> {
701
- let node = self.remove_last()?;
702
- // N.B.: Can't destructure directly because of https://github.com/rust-lang/rust/issues/28536
703
- let node = *node;
704
- let LruEntry { key, val, .. } = node;
705
- unsafe { Some((key.assume_init(), val.assume_init())) }
706
- }
707
-
708
- /// Returns the number of key-value pairs that are currently in the the cache.
709
- ///
710
- /// # Example
711
- ///
712
- /// ```
713
- /// use lru::LruCache;
714
- /// let mut cache = LruCache::new(2);
715
- /// assert_eq!(cache.len(), 0);
716
- ///
717
- /// cache.put(1, "a");
718
- /// assert_eq!(cache.len(), 1);
719
- ///
720
- /// cache.put(2, "b");
721
- /// assert_eq!(cache.len(), 2);
722
- ///
723
- /// cache.put(3, "c");
724
- /// assert_eq!(cache.len(), 2);
725
- /// ```
726
- pub fn len(&self) -> usize {
727
- self.map.len()
728
- }
729
-
730
- /// Returns a bool indicating whether the cache is empty or not.
731
- ///
732
- /// # Example
733
- ///
734
- /// ```
735
- /// use lru::LruCache;
736
- /// let mut cache = LruCache::new(2);
737
- /// assert!(cache.is_empty());
738
- ///
739
- /// cache.put(1, "a");
740
- /// assert!(!cache.is_empty());
741
- /// ```
742
- pub fn is_empty(&self) -> bool {
743
- self.map.len() == 0
744
- }
745
-
746
- /// Returns the maximum number of key-value pairs the cache can hold.
747
- ///
748
- /// # Example
749
- ///
750
- /// ```
751
- /// use lru::LruCache;
752
- /// let mut cache: LruCache<isize, &str> = LruCache::new(2);
753
- /// assert_eq!(cache.cap(), 2);
754
- /// ```
755
- pub fn cap(&self) -> usize {
756
- self.cap
757
- }
758
-
759
- /// Resizes the cache. If the new capacity is smaller than the size of the current
760
- /// cache any entries past the new capacity are discarded.
761
- ///
762
- /// # Example
763
- ///
764
- /// ```
765
- /// use lru::LruCache;
766
- /// let mut cache: LruCache<isize, &str> = LruCache::new(2);
767
- ///
768
- /// cache.put(1, "a");
769
- /// cache.put(2, "b");
770
- /// cache.resize(4);
771
- /// cache.put(3, "c");
772
- /// cache.put(4, "d");
773
- ///
774
- /// assert_eq!(cache.len(), 4);
775
- /// assert_eq!(cache.get(&1), Some(&"a"));
776
- /// assert_eq!(cache.get(&2), Some(&"b"));
777
- /// assert_eq!(cache.get(&3), Some(&"c"));
778
- /// assert_eq!(cache.get(&4), Some(&"d"));
779
- /// ```
780
- pub fn resize(&mut self, cap: usize) {
781
- // return early if capacity doesn't change
782
- if cap == self.cap {
783
- return;
784
- }
785
-
786
- while self.map.len() > cap {
787
- self.pop_lru();
788
- }
789
- self.map.shrink_to_fit();
790
-
791
- self.cap = cap;
792
- }
793
-
794
- /// Clears the contents of the cache.
795
- ///
796
- /// # Example
797
- ///
798
- /// ```
799
- /// use lru::LruCache;
800
- /// let mut cache: LruCache<isize, &str> = LruCache::new(2);
801
- /// assert_eq!(cache.len(), 0);
802
- ///
803
- /// cache.put(1, "a");
804
- /// assert_eq!(cache.len(), 1);
805
- ///
806
- /// cache.put(2, "b");
807
- /// assert_eq!(cache.len(), 2);
808
- ///
809
- /// cache.clear();
810
- /// assert_eq!(cache.len(), 0);
811
- /// ```
812
- pub fn clear(&mut self) {
813
- while self.pop_lru().is_some() {}
814
- }
815
-
816
- /// An iterator visiting all entries in most-recently used order. The iterator element type is
817
- /// `(&K, &V)`.
818
- ///
819
- /// # Examples
820
- ///
821
- /// ```
822
- /// use lru::LruCache;
823
- ///
824
- /// let mut cache = LruCache::new(3);
825
- /// cache.put("a", 1);
826
- /// cache.put("b", 2);
827
- /// cache.put("c", 3);
828
- ///
829
- /// for (key, val) in cache.iter() {
830
- /// println!("key: {} val: {}", key, val);
831
- /// }
832
- /// ```
833
- pub fn iter(&self) -> Iter<'_, K, V> {
834
- Iter {
835
- len: self.len(),
836
- ptr: unsafe { (*self.head).next },
837
- end: unsafe { (*self.tail).prev },
838
- phantom: PhantomData,
839
- }
840
- }
841
-
842
- /// An iterator visiting all entries in most-recently-used order, giving a mutable reference on
843
- /// V. The iterator element type is `(&K, &mut V)`.
844
- ///
845
- /// # Examples
846
- ///
847
- /// ```
848
- /// use lru::LruCache;
849
- ///
850
- /// struct HddBlock {
851
- /// dirty: bool,
852
- /// data: [u8; 512]
853
- /// }
854
- ///
855
- /// let mut cache = LruCache::new(3);
856
- /// cache.put(0, HddBlock { dirty: false, data: [0x00; 512]});
857
- /// cache.put(1, HddBlock { dirty: true, data: [0x55; 512]});
858
- /// cache.put(2, HddBlock { dirty: true, data: [0x77; 512]});
859
- ///
860
- /// // write dirty blocks to disk.
861
- /// for (block_id, block) in cache.iter_mut() {
862
- /// if block.dirty {
863
- /// // write block to disk
864
- /// block.dirty = false
865
- /// }
866
- /// }
867
- /// ```
868
- pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
869
- IterMut {
870
- len: self.len(),
871
- ptr: unsafe { (*self.head).next },
872
- end: unsafe { (*self.tail).prev },
873
- phantom: PhantomData,
874
- }
875
- }
876
-
877
- fn remove_last(&mut self) -> Option<Box<LruEntry<K, V>>> {
878
- let prev;
879
- unsafe { prev = (*self.tail).prev }
880
- if prev != self.head {
881
- let old_key = KeyRef {
882
- k: unsafe { &(*(*(*self.tail).prev).key.as_ptr()) },
883
- };
884
- let mut old_node = self.map.remove(&old_key).unwrap();
885
- let node_ptr: *mut LruEntry<K, V> = &mut *old_node;
886
- self.detach(node_ptr);
887
- Some(old_node)
888
- } else {
889
- None
890
- }
891
- }
892
-
893
- fn detach(&mut self, node: *mut LruEntry<K, V>) {
894
- unsafe {
895
- (*(*node).prev).next = (*node).next;
896
- (*(*node).next).prev = (*node).prev;
897
- }
898
- }
899
-
900
- fn attach(&mut self, node: *mut LruEntry<K, V>) {
901
- unsafe {
902
- (*node).next = (*self.head).next;
903
- (*node).prev = self.head;
904
- (*self.head).next = node;
905
- (*(*node).next).prev = node;
906
- }
907
- }
908
- }
909
-
910
- impl<K, V, S> Drop for LruCache<K, V, S> {
911
- fn drop(&mut self) {
912
- self.map.values_mut().for_each(|e| unsafe {
913
- ptr::drop_in_place(e.key.as_mut_ptr());
914
- ptr::drop_in_place(e.val.as_mut_ptr());
915
- });
916
- // We rebox the head/tail, and because these are maybe-uninit
917
- // they do not have the absent k/v dropped.
918
-
919
- let _head = unsafe { *Box::from_raw(self.head) };
920
- let _tail = unsafe { *Box::from_raw(self.tail) };
921
-
922
- }
923
- }
924
-
925
- impl<'a, K: Hash + Eq, V, S: BuildHasher> IntoIterator for &'a LruCache<K, V, S> {
926
- type Item = (&'a K, &'a V);
927
- type IntoIter = Iter<'a, K, V>;
928
-
929
- fn into_iter(self) -> Iter<'a, K, V> {
930
- self.iter()
931
- }
932
- }
933
-
934
- impl<'a, K: Hash + Eq, V, S: BuildHasher> IntoIterator for &'a mut LruCache<K, V, S> {
935
- type Item = (&'a K, &'a mut V);
936
- type IntoIter = IterMut<'a, K, V>;
937
-
938
- fn into_iter(self) -> IterMut<'a, K, V> {
939
- self.iter_mut()
940
- }
941
- }
942
-
943
- // The compiler does not automatically derive Send and Sync for LruCache because it contains
944
- // raw pointers. The raw pointers are safely encapsulated by LruCache though so we can
945
- // implement Send and Sync for it below.
946
- unsafe impl<K: Send, V: Send, S: Send> Send for LruCache<K, V, S> {}
947
- unsafe impl<K: Sync, V: Sync, S: Sync> Sync for LruCache<K, V, S> {}
948
-
949
- impl<K: Hash + Eq, V> fmt::Debug for LruCache<K, V> {
950
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
951
- f.debug_struct("LruCache")
952
- .field("len", &self.len())
953
- .field("cap", &self.cap())
954
- .finish()
955
- }
956
- }
957
-
958
- /// An iterator over the entries of a `LruCache`.
959
- ///
960
- /// This `struct` is created by the [`iter`] method on [`LruCache`][`LruCache`]. See its
961
- /// documentation for more.
962
- ///
963
- /// [`iter`]: struct.LruCache.html#method.iter
964
- /// [`LruCache`]: struct.LruCache.html
965
- pub struct Iter<'a, K: 'a, V: 'a> {
966
- len: usize,
967
-
968
- ptr: *const LruEntry<K, V>,
969
- end: *const LruEntry<K, V>,
970
-
971
- phantom: PhantomData<&'a K>,
972
- }
973
-
974
- impl<'a, K, V> Iterator for Iter<'a, K, V> {
975
- type Item = (&'a K, &'a V);
976
-
977
- fn next(&mut self) -> Option<(&'a K, &'a V)> {
978
- if self.len == 0 {
979
- return None;
980
- }
981
-
982
- let key = unsafe { &(*(*self.ptr).key.as_ptr()) as &K };
983
- let val = unsafe { &(*(*self.ptr).val.as_ptr()) as &V };
984
-
985
- self.len -= 1;
986
- self.ptr = unsafe { (*self.ptr).next };
987
-
988
- Some((key, val))
989
- }
990
-
991
- fn size_hint(&self) -> (usize, Option<usize>) {
992
- (self.len, Some(self.len))
993
- }
994
-
995
- fn count(self) -> usize {
996
- self.len
997
- }
998
- }
999
-
1000
- impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
1001
- fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
1002
- if self.len == 0 {
1003
- return None;
1004
- }
1005
-
1006
- let key = unsafe { &(*(*self.end).key.as_ptr()) as &K };
1007
- let val = unsafe { &(*(*self.end).val.as_ptr()) as &V };
1008
-
1009
- self.len -= 1;
1010
- self.end = unsafe { (*self.end).prev };
1011
-
1012
- Some((key, val))
1013
- }
1014
- }
1015
-
1016
- impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {}
1017
- impl<'a, K, V> FusedIterator for Iter<'a, K, V> {}
1018
-
1019
- impl<'a, K, V> Clone for Iter<'a, K, V> {
1020
- fn clone(&self) -> Iter<'a, K, V> {
1021
- Iter {
1022
- len: self.len,
1023
- ptr: self.ptr,
1024
- end: self.end,
1025
- phantom: PhantomData,
1026
- }
1027
- }
1028
- }
1029
-
1030
- // The compiler does not automatically derive Send and Sync for Iter because it contains
1031
- // raw pointers.
1032
- unsafe impl<'a, K: Send, V: Send> Send for Iter<'a, K, V> {}
1033
- unsafe impl<'a, K: Sync, V: Sync> Sync for Iter<'a, K, V> {}
1034
-
1035
- /// An iterator over mutables entries of a `LruCache`.
1036
- ///
1037
- /// This `struct` is created by the [`iter_mut`] method on [`LruCache`][`LruCache`]. See its
1038
- /// documentation for more.
1039
- ///
1040
- /// [`iter_mut`]: struct.LruCache.html#method.iter_mut
1041
- /// [`LruCache`]: struct.LruCache.html
1042
- pub struct IterMut<'a, K: 'a, V: 'a> {
1043
- len: usize,
1044
-
1045
- ptr: *mut LruEntry<K, V>,
1046
- end: *mut LruEntry<K, V>,
1047
-
1048
- phantom: PhantomData<&'a K>,
1049
- }
1050
-
1051
- impl<'a, K, V> Iterator for IterMut<'a, K, V> {
1052
- type Item = (&'a K, &'a mut V);
1053
-
1054
- fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
1055
- if self.len == 0 {
1056
- return None;
1057
- }
1058
-
1059
- let key = unsafe { &mut (*(*self.ptr).key.as_mut_ptr()) as &mut K };
1060
- let val = unsafe { &mut (*(*self.ptr).val.as_mut_ptr()) as &mut V };
1061
-
1062
- self.len -= 1;
1063
- self.ptr = unsafe { (*self.ptr).next };
1064
-
1065
- Some((key, val))
1066
- }
1067
-
1068
- fn size_hint(&self) -> (usize, Option<usize>) {
1069
- (self.len, Some(self.len))
1070
- }
1071
-
1072
- fn count(self) -> usize {
1073
- self.len
1074
- }
1075
- }
1076
-
1077
- impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
1078
- fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
1079
- if self.len == 0 {
1080
- return None;
1081
- }
1082
-
1083
- let key = unsafe { &mut (*(*self.end).key.as_mut_ptr()) as &mut K };
1084
- let val = unsafe { &mut (*(*self.end).val.as_mut_ptr()) as &mut V };
1085
-
1086
- self.len -= 1;
1087
- self.end = unsafe { (*self.end).prev };
1088
-
1089
- Some((key, val))
1090
- }
1091
- }
1092
-
1093
- impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {}
1094
- impl<'a, K, V> FusedIterator for IterMut<'a, K, V> {}
1095
-
1096
- // The compiler does not automatically derive Send and Sync for Iter because it contains
1097
- // raw pointers.
1098
- unsafe impl<'a, K: Send, V: Send> Send for IterMut<'a, K, V> {}
1099
- unsafe impl<'a, K: Sync, V: Sync> Sync for IterMut<'a, K, V> {}
1100
-
1101
- /// An iterator that moves out of a `LruCache`.
1102
- ///
1103
- /// This `struct` is created by the [`into_iter`] method on [`LruCache`][`LruCache`]. See its
1104
- /// documentation for more.
1105
- ///
1106
- /// [`into_iter`]: struct.LruCache.html#method.into_iter
1107
- /// [`LruCache`]: struct.LruCache.html
1108
- pub struct IntoIter<K, V>
1109
- where
1110
- K: Hash + Eq,
1111
- {
1112
- cache: LruCache<K, V>,
1113
- }
1114
-
1115
- impl<K, V> Iterator for IntoIter<K, V>
1116
- where
1117
- K: Hash + Eq,
1118
- {
1119
- type Item = (K, V);
1120
-
1121
- fn next(&mut self) -> Option<(K, V)> {
1122
- self.cache.pop_lru()
1123
- }
1124
-
1125
- fn size_hint(&self) -> (usize, Option<usize>) {
1126
- let len = self.cache.len();
1127
- (len, Some(len))
1128
- }
1129
-
1130
- fn count(self) -> usize {
1131
- self.cache.len()
1132
- }
1133
- }
1134
-
1135
- impl<K, V> ExactSizeIterator for IntoIter<K, V> where K: Hash + Eq {}
1136
- impl<K, V> FusedIterator for IntoIter<K, V> where K: Hash + Eq {}
1137
-
1138
- impl<K: Hash + Eq, V> IntoIterator for LruCache<K, V> {
1139
- type Item = (K, V);
1140
- type IntoIter = IntoIter<K, V>;
1141
-
1142
- fn into_iter(self) -> IntoIter<K, V> {
1143
- IntoIter { cache: self }
1144
- }
1145
- }
1146
-
1147
- #[cfg(test)]
1148
- mod tests {
1149
- use super::LruCache;
1150
- use core::fmt::Debug;
1151
- use scoped_threadpool::Pool;
1152
- use std::sync::atomic::{AtomicUsize, Ordering};
1153
-
1154
- fn assert_opt_eq<V: PartialEq + Debug>(opt: Option<&V>, v: V) {
1155
- assert!(opt.is_some());
1156
- assert_eq!(opt.unwrap(), &v);
1157
- }
1158
-
1159
- fn assert_opt_eq_mut<V: PartialEq + Debug>(opt: Option<&mut V>, v: V) {
1160
- assert!(opt.is_some());
1161
- assert_eq!(opt.unwrap(), &v);
1162
- }
1163
-
1164
- fn assert_opt_eq_tuple<K: PartialEq + Debug, V: PartialEq + Debug>(
1165
- opt: Option<(&K, &V)>,
1166
- kv: (K, V),
1167
- ) {
1168
- assert!(opt.is_some());
1169
- let res = opt.unwrap();
1170
- assert_eq!(res.0, &kv.0);
1171
- assert_eq!(res.1, &kv.1);
1172
- }
1173
-
1174
- fn assert_opt_eq_mut_tuple<K: PartialEq + Debug, V: PartialEq + Debug>(
1175
- opt: Option<(&K, &mut V)>,
1176
- kv: (K, V),
1177
- ) {
1178
- assert!(opt.is_some());
1179
- let res = opt.unwrap();
1180
- assert_eq!(res.0, &kv.0);
1181
- assert_eq!(res.1, &kv.1);
1182
- }
1183
-
1184
- #[test]
1185
- fn test_unbounded() {
1186
- let mut cache = LruCache::unbounded();
1187
- for i in 0..13370 {
1188
- cache.put(i, ());
1189
- }
1190
- assert_eq!(cache.len(), 13370);
1191
- }
1192
-
1193
- #[test]
1194
- #[cfg(feature = "hashbrown")]
1195
- fn test_with_hasher() {
1196
- use hashbrown::hash_map::DefaultHashBuilder;
1197
-
1198
- let s = DefaultHashBuilder::default();
1199
- let mut cache = LruCache::with_hasher(16, s);
1200
-
1201
- for i in 0..13370 {
1202
- cache.put(i, ());
1203
- }
1204
- assert_eq!(cache.len(), 16);
1205
- }
1206
-
1207
- #[test]
1208
- fn test_put_and_get() {
1209
- let mut cache = LruCache::new(2);
1210
- assert!(cache.is_empty());
1211
-
1212
- assert_eq!(cache.put("apple", "red"), None);
1213
- assert_eq!(cache.put("banana", "yellow"), None);
1214
-
1215
- assert_eq!(cache.cap(), 2);
1216
- assert_eq!(cache.len(), 2);
1217
- assert!(!cache.is_empty());
1218
- assert_opt_eq(cache.get(&"apple"), "red");
1219
- assert_opt_eq(cache.get(&"banana"), "yellow");
1220
- }
1221
-
1222
- #[test]
1223
- fn test_put_and_get_or_insert() {
1224
- let mut cache = LruCache::new(2);
1225
- assert!(cache.is_empty());
1226
-
1227
- assert_eq!(cache.put("apple", "red"), None);
1228
- assert_eq!(cache.put("banana", "yellow"), None);
1229
-
1230
- assert_eq!(cache.cap(), 2);
1231
- assert_eq!(cache.len(), 2);
1232
- assert!(!cache.is_empty());
1233
- assert_opt_eq(cache.get_or_insert(&"apple", || "orange"), &"red");
1234
- assert_opt_eq(cache.get_or_insert(&"banana", || "orange"), &"yellow");
1235
- assert_opt_eq(cache.get_or_insert(&"lemon", || "orange"), &"orange");
1236
- assert_opt_eq(cache.get_or_insert(&"lemon", || "red"), &"orange");
1237
- }
1238
-
1239
- #[test]
1240
- fn test_put_and_get_mut() {
1241
- let mut cache = LruCache::new(2);
1242
-
1243
- cache.put("apple", "red");
1244
- cache.put("banana", "yellow");
1245
-
1246
- assert_eq!(cache.cap(), 2);
1247
- assert_eq!(cache.len(), 2);
1248
- assert_opt_eq_mut(cache.get_mut(&"apple"), "red");
1249
- assert_opt_eq_mut(cache.get_mut(&"banana"), "yellow");
1250
- }
1251
-
1252
- #[test]
1253
- fn test_get_mut_and_update() {
1254
- let mut cache = LruCache::new(2);
1255
-
1256
- cache.put("apple", 1);
1257
- cache.put("banana", 3);
1258
-
1259
- {
1260
- let v = cache.get_mut(&"apple").unwrap();
1261
- *v = 4;
1262
- }
1263
-
1264
- assert_eq!(cache.cap(), 2);
1265
- assert_eq!(cache.len(), 2);
1266
- assert_opt_eq_mut(cache.get_mut(&"apple"), 4);
1267
- assert_opt_eq_mut(cache.get_mut(&"banana"), 3);
1268
- }
1269
-
1270
- #[test]
1271
- fn test_put_update() {
1272
- let mut cache = LruCache::new(1);
1273
-
1274
- assert_eq!(cache.put("apple", "red"), None);
1275
- assert_eq!(cache.put("apple", "green"), Some("red"));
1276
-
1277
- assert_eq!(cache.len(), 1);
1278
- assert_opt_eq(cache.get(&"apple"), "green");
1279
- }
1280
-
1281
- #[test]
1282
- fn test_put_removes_oldest() {
1283
- let mut cache = LruCache::new(2);
1284
-
1285
- assert_eq!(cache.put("apple", "red"), None);
1286
- assert_eq!(cache.put("banana", "yellow"), None);
1287
- assert_eq!(cache.put("pear", "green"), None);
1288
-
1289
- assert!(cache.get(&"apple").is_none());
1290
- assert_opt_eq(cache.get(&"banana"), "yellow");
1291
- assert_opt_eq(cache.get(&"pear"), "green");
1292
-
1293
- // Even though we inserted "apple" into the cache earlier it has since been removed from
1294
- // the cache so there is no current value for `put` to return.
1295
- assert_eq!(cache.put("apple", "green"), None);
1296
- assert_eq!(cache.put("tomato", "red"), None);
1297
-
1298
- assert!(cache.get(&"pear").is_none());
1299
- assert_opt_eq(cache.get(&"apple"), "green");
1300
- assert_opt_eq(cache.get(&"tomato"), "red");
1301
- }
1302
-
1303
- #[test]
1304
- fn test_peek() {
1305
- let mut cache = LruCache::new(2);
1306
-
1307
- cache.put("apple", "red");
1308
- cache.put("banana", "yellow");
1309
-
1310
- assert_opt_eq(cache.peek(&"banana"), "yellow");
1311
- assert_opt_eq(cache.peek(&"apple"), "red");
1312
-
1313
- cache.put("pear", "green");
1314
-
1315
- assert!(cache.peek(&"apple").is_none());
1316
- assert_opt_eq(cache.peek(&"banana"), "yellow");
1317
- assert_opt_eq(cache.peek(&"pear"), "green");
1318
- }
1319
-
1320
- #[test]
1321
- fn test_peek_mut() {
1322
- let mut cache = LruCache::new(2);
1323
-
1324
- cache.put("apple", "red");
1325
- cache.put("banana", "yellow");
1326
-
1327
- assert_opt_eq_mut(cache.peek_mut(&"banana"), "yellow");
1328
- assert_opt_eq_mut(cache.peek_mut(&"apple"), "red");
1329
- assert!(cache.peek_mut(&"pear").is_none());
1330
-
1331
- cache.put("pear", "green");
1332
-
1333
- assert!(cache.peek_mut(&"apple").is_none());
1334
- assert_opt_eq_mut(cache.peek_mut(&"banana"), "yellow");
1335
- assert_opt_eq_mut(cache.peek_mut(&"pear"), "green");
1336
-
1337
- {
1338
- let v = cache.peek_mut(&"banana").unwrap();
1339
- *v = "green";
1340
- }
1341
-
1342
- assert_opt_eq_mut(cache.peek_mut(&"banana"), "green");
1343
- }
1344
-
1345
- #[test]
1346
- fn test_peek_lru() {
1347
- let mut cache = LruCache::new(2);
1348
-
1349
- assert!(cache.peek_lru().is_none());
1350
-
1351
- cache.put("apple", "red");
1352
- cache.put("banana", "yellow");
1353
- assert_opt_eq_tuple(cache.peek_lru(), ("apple", "red"));
1354
-
1355
- cache.get(&"apple");
1356
- assert_opt_eq_tuple(cache.peek_lru(), ("banana", "yellow"));
1357
-
1358
- cache.clear();
1359
- assert!(cache.peek_lru().is_none());
1360
- }
1361
-
1362
- #[test]
1363
- fn test_contains() {
1364
- let mut cache = LruCache::new(2);
1365
-
1366
- cache.put("apple", "red");
1367
- cache.put("banana", "yellow");
1368
- cache.put("pear", "green");
1369
-
1370
- assert!(!cache.contains(&"apple"));
1371
- assert!(cache.contains(&"banana"));
1372
- assert!(cache.contains(&"pear"));
1373
- }
1374
-
1375
- #[test]
1376
- fn test_pop() {
1377
- let mut cache = LruCache::new(2);
1378
-
1379
- cache.put("apple", "red");
1380
- cache.put("banana", "yellow");
1381
-
1382
- assert_eq!(cache.len(), 2);
1383
- assert_opt_eq(cache.get(&"apple"), "red");
1384
- assert_opt_eq(cache.get(&"banana"), "yellow");
1385
-
1386
- let popped = cache.pop(&"apple");
1387
- assert!(popped.is_some());
1388
- assert_eq!(popped.unwrap(), "red");
1389
- assert_eq!(cache.len(), 1);
1390
- assert!(cache.get(&"apple").is_none());
1391
- assert_opt_eq(cache.get(&"banana"), "yellow");
1392
- }
1393
-
1394
- #[test]
1395
- fn test_pop_entry() {
1396
- let mut cache = LruCache::new(2);
1397
- cache.put("apple", "red");
1398
- cache.put("banana", "yellow");
1399
-
1400
- assert_eq!(cache.len(), 2);
1401
- assert_opt_eq(cache.get(&"apple"), "red");
1402
- assert_opt_eq(cache.get(&"banana"), "yellow");
1403
-
1404
- let popped = cache.pop_entry(&"apple");
1405
- assert!(popped.is_some());
1406
- assert_eq!(popped.unwrap(), ("apple", "red"));
1407
- assert_eq!(cache.len(), 1);
1408
- assert!(cache.get(&"apple").is_none());
1409
- assert_opt_eq(cache.get(&"banana"), "yellow");
1410
- }
1411
-
1412
- #[test]
1413
- fn test_pop_lru() {
1414
- let mut cache = LruCache::new(200);
1415
-
1416
- for i in 0..75 {
1417
- cache.put(i, "A");
1418
- }
1419
- for i in 0..75 {
1420
- cache.put(i + 100, "B");
1421
- }
1422
- for i in 0..75 {
1423
- cache.put(i + 200, "C");
1424
- }
1425
- assert_eq!(cache.len(), 200);
1426
-
1427
- for i in 0..75 {
1428
- assert_opt_eq(cache.get(&(74 - i + 100)), "B");
1429
- }
1430
- assert_opt_eq(cache.get(&25), "A");
1431
-
1432
- for i in 26..75 {
1433
- assert_eq!(cache.pop_lru(), Some((i, "A")));
1434
- }
1435
- for i in 0..75 {
1436
- assert_eq!(cache.pop_lru(), Some((i + 200, "C")));
1437
- }
1438
- for i in 0..75 {
1439
- assert_eq!(cache.pop_lru(), Some((74 - i + 100, "B")));
1440
- }
1441
- assert_eq!(cache.pop_lru(), Some((25, "A")));
1442
- for _ in 0..50 {
1443
- assert_eq!(cache.pop_lru(), None);
1444
- }
1445
- }
1446
-
1447
- #[test]
1448
- fn test_clear() {
1449
- let mut cache = LruCache::new(2);
1450
-
1451
- cache.put("apple", "red");
1452
- cache.put("banana", "yellow");
1453
-
1454
- assert_eq!(cache.len(), 2);
1455
- assert_opt_eq(cache.get(&"apple"), "red");
1456
- assert_opt_eq(cache.get(&"banana"), "yellow");
1457
-
1458
- cache.clear();
1459
- assert_eq!(cache.len(), 0);
1460
- }
1461
-
1462
- #[test]
1463
- fn test_resize_larger() {
1464
- let mut cache = LruCache::new(2);
1465
-
1466
- cache.put(1, "a");
1467
- cache.put(2, "b");
1468
- cache.resize(4);
1469
- cache.put(3, "c");
1470
- cache.put(4, "d");
1471
-
1472
- assert_eq!(cache.len(), 4);
1473
- assert_eq!(cache.get(&1), Some(&"a"));
1474
- assert_eq!(cache.get(&2), Some(&"b"));
1475
- assert_eq!(cache.get(&3), Some(&"c"));
1476
- assert_eq!(cache.get(&4), Some(&"d"));
1477
- }
1478
-
1479
- #[test]
1480
- fn test_resize_smaller() {
1481
- let mut cache = LruCache::new(4);
1482
-
1483
- cache.put(1, "a");
1484
- cache.put(2, "b");
1485
- cache.put(3, "c");
1486
- cache.put(4, "d");
1487
-
1488
- cache.resize(2);
1489
-
1490
- assert_eq!(cache.len(), 2);
1491
- assert!(cache.get(&1).is_none());
1492
- assert!(cache.get(&2).is_none());
1493
- assert_eq!(cache.get(&3), Some(&"c"));
1494
- assert_eq!(cache.get(&4), Some(&"d"));
1495
- }
1496
-
1497
- #[test]
1498
- fn test_send() {
1499
- use std::thread;
1500
-
1501
- let mut cache = LruCache::new(4);
1502
- cache.put(1, "a");
1503
-
1504
- let handle = thread::spawn(move || {
1505
- assert_eq!(cache.get(&1), Some(&"a"));
1506
- });
1507
-
1508
- assert!(handle.join().is_ok());
1509
- }
1510
-
1511
- #[test]
1512
- fn test_multiple_threads() {
1513
- let mut pool = Pool::new(1);
1514
- let mut cache = LruCache::new(4);
1515
- cache.put(1, "a");
1516
-
1517
- let cache_ref = &cache;
1518
- pool.scoped(|scoped| {
1519
- scoped.execute(move || {
1520
- assert_eq!(cache_ref.peek(&1), Some(&"a"));
1521
- });
1522
- });
1523
-
1524
- assert_eq!((cache_ref).peek(&1), Some(&"a"));
1525
- }
1526
-
1527
- #[test]
1528
- fn test_iter_forwards() {
1529
- let mut cache = LruCache::new(3);
1530
- cache.put("a", 1);
1531
- cache.put("b", 2);
1532
- cache.put("c", 3);
1533
-
1534
- {
1535
- // iter const
1536
- let mut iter = cache.iter();
1537
- assert_eq!(iter.len(), 3);
1538
- assert_opt_eq_tuple(iter.next(), ("c", 3));
1539
-
1540
- assert_eq!(iter.len(), 2);
1541
- assert_opt_eq_tuple(iter.next(), ("b", 2));
1542
-
1543
- assert_eq!(iter.len(), 1);
1544
- assert_opt_eq_tuple(iter.next(), ("a", 1));
1545
-
1546
- assert_eq!(iter.len(), 0);
1547
- assert_eq!(iter.next(), None);
1548
- }
1549
- {
1550
- // iter mut
1551
- let mut iter = cache.iter_mut();
1552
- assert_eq!(iter.len(), 3);
1553
- assert_opt_eq_mut_tuple(iter.next(), ("c", 3));
1554
-
1555
- assert_eq!(iter.len(), 2);
1556
- assert_opt_eq_mut_tuple(iter.next(), ("b", 2));
1557
-
1558
- assert_eq!(iter.len(), 1);
1559
- assert_opt_eq_mut_tuple(iter.next(), ("a", 1));
1560
-
1561
- assert_eq!(iter.len(), 0);
1562
- assert_eq!(iter.next(), None);
1563
- }
1564
- }
1565
-
1566
- #[test]
1567
- fn test_iter_backwards() {
1568
- let mut cache = LruCache::new(3);
1569
- cache.put("a", 1);
1570
- cache.put("b", 2);
1571
- cache.put("c", 3);
1572
-
1573
- {
1574
- // iter const
1575
- let mut iter = cache.iter();
1576
- assert_eq!(iter.len(), 3);
1577
- assert_opt_eq_tuple(iter.next_back(), ("a", 1));
1578
-
1579
- assert_eq!(iter.len(), 2);
1580
- assert_opt_eq_tuple(iter.next_back(), ("b", 2));
1581
-
1582
- assert_eq!(iter.len(), 1);
1583
- assert_opt_eq_tuple(iter.next_back(), ("c", 3));
1584
-
1585
- assert_eq!(iter.len(), 0);
1586
- assert_eq!(iter.next_back(), None);
1587
- }
1588
-
1589
- {
1590
- // iter mut
1591
- let mut iter = cache.iter_mut();
1592
- assert_eq!(iter.len(), 3);
1593
- assert_opt_eq_mut_tuple(iter.next_back(), ("a", 1));
1594
-
1595
- assert_eq!(iter.len(), 2);
1596
- assert_opt_eq_mut_tuple(iter.next_back(), ("b", 2));
1597
-
1598
- assert_eq!(iter.len(), 1);
1599
- assert_opt_eq_mut_tuple(iter.next_back(), ("c", 3));
1600
-
1601
- assert_eq!(iter.len(), 0);
1602
- assert_eq!(iter.next_back(), None);
1603
- }
1604
- }
1605
-
1606
- #[test]
1607
- fn test_iter_forwards_and_backwards() {
1608
- let mut cache = LruCache::new(3);
1609
- cache.put("a", 1);
1610
- cache.put("b", 2);
1611
- cache.put("c", 3);
1612
-
1613
- {
1614
- // iter const
1615
- let mut iter = cache.iter();
1616
- assert_eq!(iter.len(), 3);
1617
- assert_opt_eq_tuple(iter.next(), ("c", 3));
1618
-
1619
- assert_eq!(iter.len(), 2);
1620
- assert_opt_eq_tuple(iter.next_back(), ("a", 1));
1621
-
1622
- assert_eq!(iter.len(), 1);
1623
- assert_opt_eq_tuple(iter.next(), ("b", 2));
1624
-
1625
- assert_eq!(iter.len(), 0);
1626
- assert_eq!(iter.next_back(), None);
1627
- }
1628
- {
1629
- // iter mut
1630
- let mut iter = cache.iter_mut();
1631
- assert_eq!(iter.len(), 3);
1632
- assert_opt_eq_mut_tuple(iter.next(), ("c", 3));
1633
-
1634
- assert_eq!(iter.len(), 2);
1635
- assert_opt_eq_mut_tuple(iter.next_back(), ("a", 1));
1636
-
1637
- assert_eq!(iter.len(), 1);
1638
- assert_opt_eq_mut_tuple(iter.next(), ("b", 2));
1639
-
1640
- assert_eq!(iter.len(), 0);
1641
- assert_eq!(iter.next_back(), None);
1642
- }
1643
- }
1644
-
1645
- #[test]
1646
- fn test_iter_multiple_threads() {
1647
- let mut pool = Pool::new(1);
1648
- let mut cache = LruCache::new(3);
1649
- cache.put("a", 1);
1650
- cache.put("b", 2);
1651
- cache.put("c", 3);
1652
-
1653
- let mut iter = cache.iter();
1654
- assert_eq!(iter.len(), 3);
1655
- assert_opt_eq_tuple(iter.next(), ("c", 3));
1656
-
1657
- {
1658
- let iter_ref = &mut iter;
1659
- pool.scoped(|scoped| {
1660
- scoped.execute(move || {
1661
- assert_eq!(iter_ref.len(), 2);
1662
- assert_opt_eq_tuple(iter_ref.next(), ("b", 2));
1663
- });
1664
- });
1665
- }
1666
-
1667
- assert_eq!(iter.len(), 1);
1668
- assert_opt_eq_tuple(iter.next(), ("a", 1));
1669
-
1670
- assert_eq!(iter.len(), 0);
1671
- assert_eq!(iter.next(), None);
1672
- }
1673
-
1674
- #[test]
1675
- fn test_iter_clone() {
1676
- let mut cache = LruCache::new(3);
1677
- cache.put("a", 1);
1678
- cache.put("b", 2);
1679
-
1680
- let mut iter = cache.iter();
1681
- let mut iter_clone = iter.clone();
1682
-
1683
- assert_eq!(iter.len(), 2);
1684
- assert_opt_eq_tuple(iter.next(), ("b", 2));
1685
- assert_eq!(iter_clone.len(), 2);
1686
- assert_opt_eq_tuple(iter_clone.next(), ("b", 2));
1687
-
1688
- assert_eq!(iter.len(), 1);
1689
- assert_opt_eq_tuple(iter.next(), ("a", 1));
1690
- assert_eq!(iter_clone.len(), 1);
1691
- assert_opt_eq_tuple(iter_clone.next(), ("a", 1));
1692
-
1693
- assert_eq!(iter.len(), 0);
1694
- assert_eq!(iter.next(), None);
1695
- assert_eq!(iter_clone.len(), 0);
1696
- assert_eq!(iter_clone.next(), None);
1697
- }
1698
-
1699
- #[test]
1700
- fn test_into_iter() {
1701
- let mut cache = LruCache::new(3);
1702
- cache.put("a", 1);
1703
- cache.put("b", 2);
1704
- cache.put("c", 3);
1705
-
1706
- let mut iter = cache.into_iter();
1707
- assert_eq!(iter.len(), 3);
1708
- assert_eq!(iter.next(), Some(("a", 1)));
1709
-
1710
- assert_eq!(iter.len(), 2);
1711
- assert_eq!(iter.next(), Some(("b", 2)));
1712
-
1713
- assert_eq!(iter.len(), 1);
1714
- assert_eq!(iter.next(), Some(("c", 3)));
1715
-
1716
- assert_eq!(iter.len(), 0);
1717
- assert_eq!(iter.next(), None);
1718
- }
1719
-
1720
- #[test]
1721
- fn test_that_pop_actually_detaches_node() {
1722
- let mut cache = LruCache::new(5);
1723
-
1724
- cache.put("a", 1);
1725
- cache.put("b", 2);
1726
- cache.put("c", 3);
1727
- cache.put("d", 4);
1728
- cache.put("e", 5);
1729
-
1730
- assert_eq!(cache.pop(&"c"), Some(3));
1731
-
1732
- cache.put("f", 6);
1733
-
1734
- let mut iter = cache.iter();
1735
- assert_opt_eq_tuple(iter.next(), ("f", 6));
1736
- assert_opt_eq_tuple(iter.next(), ("e", 5));
1737
- assert_opt_eq_tuple(iter.next(), ("d", 4));
1738
- assert_opt_eq_tuple(iter.next(), ("b", 2));
1739
- assert_opt_eq_tuple(iter.next(), ("a", 1));
1740
- assert!(iter.next().is_none());
1741
- }
1742
-
1743
- #[test]
1744
- fn test_get_with_borrow() {
1745
- use alloc::string::String;
1746
-
1747
- let mut cache = LruCache::new(2);
1748
-
1749
- let key = String::from("apple");
1750
- cache.put(key, "red");
1751
-
1752
- assert_opt_eq(cache.get("apple"), "red");
1753
- }
1754
-
1755
- #[test]
1756
- fn test_get_mut_with_borrow() {
1757
- use alloc::string::String;
1758
-
1759
- let mut cache = LruCache::new(2);
1760
-
1761
- let key = String::from("apple");
1762
- cache.put(key, "red");
1763
-
1764
- assert_opt_eq_mut(cache.get_mut("apple"), "red");
1765
- }
1766
-
1767
- #[test]
1768
- fn test_no_memory_leaks() {
1769
- static DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
1770
-
1771
- struct DropCounter;
1772
-
1773
- impl Drop for DropCounter {
1774
- fn drop(&mut self) {
1775
- DROP_COUNT.fetch_add(1, Ordering::SeqCst);
1776
- }
1777
- }
1778
-
1779
- let n = 100;
1780
- for _ in 0..n {
1781
- let mut cache = LruCache::new(1);
1782
- for i in 0..n {
1783
- cache.put(i, DropCounter {});
1784
- }
1785
- }
1786
- assert_eq!(DROP_COUNT.load(Ordering::SeqCst), n * n);
1787
- }
1788
-
1789
- #[test]
1790
- fn test_no_memory_leaks_with_clear() {
1791
- static DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
1792
-
1793
- struct DropCounter;
1794
-
1795
- impl Drop for DropCounter {
1796
- fn drop(&mut self) {
1797
- DROP_COUNT.fetch_add(1, Ordering::SeqCst);
1798
- }
1799
- }
1800
-
1801
- let n = 100;
1802
- for _ in 0..n {
1803
- let mut cache = LruCache::new(1);
1804
- for i in 0..n {
1805
- cache.put(i, DropCounter {});
1806
- }
1807
- cache.clear();
1808
- }
1809
- assert_eq!(DROP_COUNT.load(Ordering::SeqCst), n * n);
1810
- }
1811
-
1812
- #[test]
1813
- fn test_no_memory_leaks_with_resize() {
1814
- static DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
1815
-
1816
- struct DropCounter;
1817
-
1818
- impl Drop for DropCounter {
1819
- fn drop(&mut self) {
1820
- DROP_COUNT.fetch_add(1, Ordering::SeqCst);
1821
- }
1822
- }
1823
-
1824
- let n = 100;
1825
- for _ in 0..n {
1826
- let mut cache = LruCache::new(1);
1827
- for i in 0..n {
1828
- cache.put(i, DropCounter {});
1829
- }
1830
- cache.resize(0);
1831
- }
1832
- assert_eq!(DROP_COUNT.load(Ordering::SeqCst), n * n);
1833
- }
1834
-
1835
- #[test]
1836
- fn test_no_memory_leaks_with_pop() {
1837
- static DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
1838
-
1839
- #[derive(Hash, Eq)]
1840
- struct KeyDropCounter(usize);
1841
-
1842
- impl PartialEq for KeyDropCounter {
1843
- fn eq(&self, other: &Self) -> bool {
1844
- self.0.eq(&other.0)
1845
- }
1846
- }
1847
-
1848
- impl Drop for KeyDropCounter {
1849
- fn drop(&mut self) {
1850
- DROP_COUNT.fetch_add(1, Ordering::SeqCst);
1851
- }
1852
- }
1853
-
1854
- let n = 100;
1855
- for _ in 0..n {
1856
- let mut cache = LruCache::new(1);
1857
-
1858
- for i in 0..100 {
1859
- cache.put(KeyDropCounter(i), i);
1860
- cache.pop(&KeyDropCounter(i));
1861
- }
1862
- }
1863
-
1864
- assert_eq!(DROP_COUNT.load(Ordering::SeqCst), n * n * 2);
1865
- }
1866
-
1867
- #[test]
1868
- fn test_zero_cap_no_crash() {
1869
- let mut cache = LruCache::new(0);
1870
- cache.put("reizeiin", "tohka");
1871
- }
1872
- }