code_ownership 2.0.0.pre.1 → 2.0.0.pre.3
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.
- checksums.yaml +4 -4
- data/.cargo/config +2 -2
- data/Cargo.lock +22 -31
- data/ext/cargo-vendor/codeowners-0.2.17/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/Cargo.lock +1257 -0
- data/ext/cargo-vendor/codeowners-0.2.17/Cargo.toml +111 -0
- data/ext/cargo-vendor/codeowners-0.2.17/README.md +287 -0
- data/ext/cargo-vendor/codeowners-0.2.17/dev/run_benchmarks_for_gv.sh +12 -0
- data/ext/cargo-vendor/codeowners-0.2.17/rust-toolchain.toml +4 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/cache/file.rs +179 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/cli.rs +129 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/common_test.rs +358 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/config.rs +126 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/crosscheck.rs +90 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/lib.rs +11 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/main.rs +43 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership/codeowners_file_parser.rs +504 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership/codeowners_query.rs +32 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership/file_generator.rs +203 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership/file_owner_resolver.rs +414 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership/mapper/annotated_file_mapper.rs +158 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership/mapper/package_mapper.rs +220 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership/mapper.rs +249 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership/validator.rs +218 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/ownership.rs +223 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/path_utils.rs +49 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/project.rs +229 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/project_builder.rs +337 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/project_file_builder.rs +107 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/runner/api.rs +141 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/runner/types.rs +37 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/runner.rs +390 -0
- data/ext/cargo-vendor/codeowners-0.2.17/src/tracked_files.rs +58 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/common/mod.rs +179 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/crosscheck_owners_test.rs +74 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/.github/CODEOWNERS +9 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/.keep +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/config/code_ownership.yml +12 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/config/teams/design.yml +7 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/config/teams/frontend.yml +6 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/frontend/apps/public/index.tsx +6 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/frontend/packages/dashboard/package.json +9 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/frontend/packages/dashboard/src/index.tsx +6 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/.codeowner +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/src/button.tsx +5 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/multiple-directory-owners/config/code_ownership.yml +10 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project/.github/CODEOWNERS +41 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project/config/code_ownership.yml +10 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project/javascript/packages/list/page-admin.tsx +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project/ruby/app/models/payroll.rb +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project/ruby/app/views/foos/edit.erb +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project/ruby/app/views/foos/index.html.erb +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project/ruby/app/views/foos/new.html.erb +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/.github/CODEOWNERS +53 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/config/code_ownership.yml +10 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/config/teams/brewers.yml +11 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/config/teams/cubs.yml +9 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/config/teams/giants.yml +8 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/config/teams/rockies.yml +8 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/package.json +5 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/src/picks/dp.tsx +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/package.json +5 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/src/item.tsx +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/package.json +5 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/field.tsx +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/fields/small.tsx +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/gems/apollo/lib/apollo.rb +6 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/gems/ivy/lib/ivy.rb +6 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/gems/lager/lib/lager.rb +6 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/gems/summit/lib/summit.rb +6 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/packs/games/package.yml +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/packs/locations/app/services/capacity.rb +0 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/packs/locations/package.yml +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/packs/schedule/app/services/date.rb +0 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/packs/schedule/package.yml +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/lib/util.rb +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/services/play.rb +9 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/.codeowner +3 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/.codeowner +1 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/db/price.rb +5 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/entertainment.rb +0 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/play.rb +5 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/giants/services/play.rb +0 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/ruby/app/rockies/services/play.rb +0 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/invalid_project_test.rs +144 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/multiple_directory_owners_test.rs +41 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/runner_api.rs +181 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/untracked_files_test.rs +38 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/valid_project_test.rs +348 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tests/valid_project_with_overrides_test.rs +38 -0
- data/ext/cargo-vendor/codeowners-0.2.17/tmp/.gitkeep +0 -0
- data/ext/cargo-vendor/glob-0.3.3/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/glob-0.3.3/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/glob-0.3.3/.github/workflows/rust.yml +99 -0
- data/ext/cargo-vendor/glob-0.3.3/CHANGELOG.md +44 -0
- data/ext/cargo-vendor/glob-0.3.3/Cargo.lock +107 -0
- data/ext/cargo-vendor/glob-0.3.3/Cargo.toml +45 -0
- data/ext/cargo-vendor/glob-0.3.3/Cargo.toml.orig +18 -0
- data/ext/cargo-vendor/glob-0.3.3/README.md +38 -0
- data/ext/cargo-vendor/glob-0.3.3/src/lib.rs +1511 -0
- data/ext/cargo-vendor/glob-0.3.3/tests/glob-std.rs +477 -0
- data/ext/cargo-vendor/indexmap-2.11.0/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/indexmap-2.11.0/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/indexmap-2.11.0/.github/workflows/ci.yml +165 -0
- data/ext/cargo-vendor/indexmap-2.11.0/Cargo.lock +243 -0
- data/ext/cargo-vendor/indexmap-2.11.0/Cargo.toml +148 -0
- data/ext/cargo-vendor/indexmap-2.11.0/Cargo.toml.orig +62 -0
- data/ext/cargo-vendor/indexmap-2.11.0/RELEASES.md +575 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/lib.rs +290 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/map/core/entry.rs +625 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/map/core.rs +764 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/map/mutable.rs +165 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/map/slice.rs +800 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/map/tests.rs +1312 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/map.rs +1832 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/rayon/map.rs +686 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/rayon/set.rs +777 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/set/mutable.rs +86 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/set/slice.rs +427 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/set/tests.rs +1060 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/set.rs +1454 -0
- data/ext/cargo-vendor/indexmap-2.11.0/src/sval.rs +36 -0
- data/ext/cargo-vendor/indexmap-2.11.0/tests/quick.rs +894 -0
- data/ext/cargo-vendor/rayon-1.11.0/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/rayon-1.11.0/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/rayon-1.11.0/Cargo.lock +318 -0
- data/ext/cargo-vendor/rayon-1.11.0/Cargo.toml +130 -0
- data/ext/cargo-vendor/rayon-1.11.0/Cargo.toml.orig +57 -0
- data/ext/cargo-vendor/rayon-1.11.0/FAQ.md +213 -0
- data/ext/cargo-vendor/rayon-1.11.0/README.md +150 -0
- data/ext/cargo-vendor/rayon-1.11.0/RELEASES.md +922 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/array.rs +85 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/collections/binary_heap.rs +129 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/collections/btree_map.rs +66 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/collections/btree_set.rs +52 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/collections/hash_map.rs +93 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/collections/hash_set.rs +79 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/collections/linked_list.rs +66 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/collections/mod.rs +84 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/collections/vec_deque.rs +159 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/blocks.rs +129 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/chain.rs +258 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/chunks.rs +216 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/cloned.rs +219 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/collect/mod.rs +114 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/collect/test.rs +368 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/copied.rs +219 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/empty.rs +108 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/enumerate.rs +128 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/filter.rs +137 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/filter_map.rs +141 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/find_first_last/mod.rs +230 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/find_first_last/test.rs +102 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/flat_map.rs +153 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/flat_map_iter.rs +145 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/flatten.rs +134 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/flatten_iter.rs +124 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/fold.rs +289 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/fold_chunks.rs +224 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/fold_chunks_with.rs +220 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/from_par_iter.rs +280 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/inspect.rs +253 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/interleave.rs +326 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/interleave_shortest.rs +80 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/intersperse.rs +401 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/len.rs +262 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/map.rs +255 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/map_with.rs +565 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/mod.rs +3627 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/multizip.rs +335 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/once.rs +70 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/panic_fuse.rs +338 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/par_bridge.rs +157 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/plumbing/mod.rs +476 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/positions.rs +133 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/repeat.rs +295 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/rev.rs +119 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/skip.rs +93 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/skip_any.rs +140 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/skip_any_while.rs +162 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/splitter.rs +172 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/step_by.rs +135 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/take.rs +84 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/take_any.rs +140 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/take_any_while.rs +162 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/test.rs +2392 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/try_fold.rs +282 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/unzip.rs +524 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/update.rs +323 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/walk_tree.rs +524 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/while_some.rs +150 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/zip.rs +153 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/iter/zip_eq.rs +67 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/lib.rs +156 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/math.rs +25 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/option.rs +197 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/range.rs +457 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/range_inclusive.rs +381 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/result.rs +132 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/slice/chunk_by.rs +239 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/slice/chunks.rs +387 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/slice/mod.rs +1242 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/slice/rchunks.rs +385 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/slice/sort.rs +1686 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/slice/test.rs +216 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/str.rs +1005 -0
- data/ext/cargo-vendor/rayon-1.11.0/src/vec.rs +292 -0
- data/ext/cargo-vendor/rayon-1.11.0/tests/clones.rs +222 -0
- data/ext/cargo-vendor/rayon-1.11.0/tests/collect.rs +113 -0
- data/ext/cargo-vendor/rayon-1.11.0/tests/debug.rs +233 -0
- data/ext/cargo-vendor/rayon-1.11.0/tests/named-threads.rs +25 -0
- data/ext/cargo-vendor/rayon-1.11.0/tests/producer_split_at.rs +386 -0
- data/ext/cargo-vendor/rayon-1.11.0/tests/sort-panic-safe.rs +164 -0
- data/ext/cargo-vendor/rayon-1.11.0/tests/str.rs +122 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/Cargo.lock +309 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/Cargo.toml +93 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/Cargo.toml.orig +35 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/README.md +11 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/broadcast/mod.rs +150 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/join/mod.rs +186 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/join/test.rs +150 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/latch.rs +457 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/lib.rs +864 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/registry.rs +1002 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/scope/mod.rs +773 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/scope/test.rs +621 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/sleep/README.md +219 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/sleep/counters.rs +273 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/sleep/mod.rs +324 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/spawn/mod.rs +163 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/spawn/test.rs +255 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/test.rs +200 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/thread_pool/mod.rs +502 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/src/thread_pool/test.rs +418 -0
- data/ext/cargo-vendor/rayon-core-1.13.0/tests/use_current_thread.rs +57 -0
- data/ext/cargo-vendor/serde_json-1.0.143/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/serde_json-1.0.143/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/serde_json-1.0.143/.github/workflows/ci.yml +156 -0
- data/ext/cargo-vendor/serde_json-1.0.143/Cargo.lock +419 -0
- data/ext/cargo-vendor/serde_json-1.0.143/Cargo.toml +157 -0
- data/ext/cargo-vendor/serde_json-1.0.143/Cargo.toml.orig +91 -0
- data/ext/cargo-vendor/serde_json-1.0.143/src/lib.rs +438 -0
- data/ext/cargo-vendor/serde_json-1.0.143/src/map.rs +1181 -0
- data/ext/cargo-vendor/serde_json-1.0.143/src/ser.rs +2285 -0
- data/ext/cargo-vendor/serde_json-1.0.143/src/value/de.rs +1507 -0
- data/ext/cargo-vendor/tempfile-3.21.0/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/tempfile-3.21.0/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/tempfile-3.21.0/.github/workflows/ci.yml +109 -0
- data/ext/cargo-vendor/tempfile-3.21.0/CHANGELOG.md +364 -0
- data/ext/cargo-vendor/tempfile-3.21.0/Cargo.lock +196 -0
- data/ext/cargo-vendor/tempfile-3.21.0/Cargo.toml +98 -0
- data/ext/cargo-vendor/tempfile-3.21.0/Cargo.toml.orig +47 -0
- data/ext/cargo-vendor/winapi-util-0.1.10/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/winapi-util-0.1.10/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/winapi-util-0.1.10/.github/FUNDING.yml +1 -0
- data/ext/cargo-vendor/winapi-util-0.1.10/Cargo.lock +83 -0
- data/ext/cargo-vendor/winapi-util-0.1.10/Cargo.toml +54 -0
- data/ext/cargo-vendor/winapi-util-0.1.10/Cargo.toml.orig +25 -0
- data/ext/code_ownership/Cargo.toml +9 -9
- data/ext/code_ownership/src/lib.rs +40 -6
- data/lib/code_ownership/cli.rb +5 -18
- data/lib/code_ownership/private/for_file_output_builder.rb +83 -0
- data/lib/code_ownership/private/team_finder.rb +21 -7
- data/lib/code_ownership/version.rb +1 -1
- data/lib/code_ownership.rb +173 -6
- metadata +513 -706
- data/ext/cargo-vendor/codeowners-0.2.7/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/codeowners-0.2.7/Cargo.lock +0 -1230
- data/ext/cargo-vendor/codeowners-0.2.7/Cargo.toml +0 -95
- data/ext/cargo-vendor/codeowners-0.2.7/README.md +0 -204
- data/ext/cargo-vendor/codeowners-0.2.7/dev/run_benchmarks_for_gv.sh +0 -13
- data/ext/cargo-vendor/codeowners-0.2.7/rust-toolchain.toml +0 -4
- data/ext/cargo-vendor/codeowners-0.2.7/src/cache/file.rs +0 -181
- data/ext/cargo-vendor/codeowners-0.2.7/src/cli.rs +0 -119
- data/ext/cargo-vendor/codeowners-0.2.7/src/common_test.rs +0 -338
- data/ext/cargo-vendor/codeowners-0.2.7/src/config.rs +0 -118
- data/ext/cargo-vendor/codeowners-0.2.7/src/lib.rs +0 -8
- data/ext/cargo-vendor/codeowners-0.2.7/src/main.rs +0 -43
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership/file_generator.rs +0 -203
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership/for_file_fast.rs +0 -425
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership/mapper/package_mapper.rs +0 -220
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership/mapper/team_file_mapper.rs +0 -123
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership/mapper.rs +0 -249
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership/parser.rs +0 -486
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership/tests.rs +0 -219
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership/validator.rs +0 -218
- data/ext/cargo-vendor/codeowners-0.2.7/src/ownership.rs +0 -220
- data/ext/cargo-vendor/codeowners-0.2.7/src/project.rs +0 -229
- data/ext/cargo-vendor/codeowners-0.2.7/src/project_builder.rs +0 -319
- data/ext/cargo-vendor/codeowners-0.2.7/src/project_file_builder.rs +0 -75
- data/ext/cargo-vendor/codeowners-0.2.7/src/runner.rs +0 -312
- data/ext/cargo-vendor/codeowners-0.2.7/tests/common/mod.rs +0 -113
- data/ext/cargo-vendor/codeowners-0.2.7/tests/fixtures/multiple-directory-owners/config/code_ownership.yml +0 -10
- data/ext/cargo-vendor/codeowners-0.2.7/tests/fixtures/valid_project/.github/CODEOWNERS +0 -37
- data/ext/cargo-vendor/codeowners-0.2.7/tests/fixtures/valid_project/config/code_ownership.yml +0 -10
- data/ext/cargo-vendor/codeowners-0.2.7/tests/fixtures/valid_project/ruby/app/models/payroll.rb +0 -3
- data/ext/cargo-vendor/codeowners-0.2.7/tests/invalid_project_test.rs +0 -90
- data/ext/cargo-vendor/codeowners-0.2.7/tests/multiple_directory_owners_test.rs +0 -35
- data/ext/cargo-vendor/codeowners-0.2.7/tests/valid_project_test.rs +0 -284
- data/ext/cargo-vendor/glob-0.3.2/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/glob-0.3.2/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/glob-0.3.2/.github/workflows/rust.yml +0 -65
- data/ext/cargo-vendor/glob-0.3.2/CHANGELOG.md +0 -33
- data/ext/cargo-vendor/glob-0.3.2/Cargo.lock +0 -107
- data/ext/cargo-vendor/glob-0.3.2/Cargo.toml +0 -45
- data/ext/cargo-vendor/glob-0.3.2/Cargo.toml.orig +0 -19
- data/ext/cargo-vendor/glob-0.3.2/README.md +0 -37
- data/ext/cargo-vendor/glob-0.3.2/src/lib.rs +0 -1501
- data/ext/cargo-vendor/glob-0.3.2/tests/glob-std.rs +0 -474
- data/ext/cargo-vendor/indexmap-2.10.0/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/indexmap-2.10.0/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/indexmap-2.10.0/.github/workflows/ci.yml +0 -159
- data/ext/cargo-vendor/indexmap-2.10.0/Cargo.lock +0 -236
- data/ext/cargo-vendor/indexmap-2.10.0/Cargo.toml +0 -142
- data/ext/cargo-vendor/indexmap-2.10.0/Cargo.toml.orig +0 -61
- data/ext/cargo-vendor/indexmap-2.10.0/RELEASES.md +0 -563
- data/ext/cargo-vendor/indexmap-2.10.0/src/lib.rs +0 -288
- data/ext/cargo-vendor/indexmap-2.10.0/src/map/core/entry.rs +0 -574
- data/ext/cargo-vendor/indexmap-2.10.0/src/map/core.rs +0 -735
- data/ext/cargo-vendor/indexmap-2.10.0/src/map/mutable.rs +0 -165
- data/ext/cargo-vendor/indexmap-2.10.0/src/map/slice.rs +0 -751
- data/ext/cargo-vendor/indexmap-2.10.0/src/map/tests.rs +0 -1228
- data/ext/cargo-vendor/indexmap-2.10.0/src/map.rs +0 -1697
- data/ext/cargo-vendor/indexmap-2.10.0/src/rayon/map.rs +0 -662
- data/ext/cargo-vendor/indexmap-2.10.0/src/rayon/set.rs +0 -755
- data/ext/cargo-vendor/indexmap-2.10.0/src/set/mutable.rs +0 -86
- data/ext/cargo-vendor/indexmap-2.10.0/src/set/slice.rs +0 -380
- data/ext/cargo-vendor/indexmap-2.10.0/src/set/tests.rs +0 -999
- data/ext/cargo-vendor/indexmap-2.10.0/src/set.rs +0 -1340
- data/ext/cargo-vendor/indexmap-2.10.0/tests/quick.rs +0 -800
- data/ext/cargo-vendor/rayon-1.10.0/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/rayon-1.10.0/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/rayon-1.10.0/Cargo.toml +0 -61
- data/ext/cargo-vendor/rayon-1.10.0/Cargo.toml.orig +0 -39
- data/ext/cargo-vendor/rayon-1.10.0/FAQ.md +0 -227
- data/ext/cargo-vendor/rayon-1.10.0/README.md +0 -151
- data/ext/cargo-vendor/rayon-1.10.0/RELEASES.md +0 -909
- data/ext/cargo-vendor/rayon-1.10.0/src/array.rs +0 -85
- data/ext/cargo-vendor/rayon-1.10.0/src/collections/binary_heap.rs +0 -120
- data/ext/cargo-vendor/rayon-1.10.0/src/collections/btree_map.rs +0 -66
- data/ext/cargo-vendor/rayon-1.10.0/src/collections/btree_set.rs +0 -52
- data/ext/cargo-vendor/rayon-1.10.0/src/collections/hash_map.rs +0 -96
- data/ext/cargo-vendor/rayon-1.10.0/src/collections/hash_set.rs +0 -80
- data/ext/cargo-vendor/rayon-1.10.0/src/collections/linked_list.rs +0 -66
- data/ext/cargo-vendor/rayon-1.10.0/src/collections/mod.rs +0 -84
- data/ext/cargo-vendor/rayon-1.10.0/src/collections/vec_deque.rs +0 -159
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/blocks.rs +0 -131
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/chain.rs +0 -267
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/chunks.rs +0 -224
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/cloned.rs +0 -223
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/collect/mod.rs +0 -116
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/collect/test.rs +0 -373
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/copied.rs +0 -223
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/empty.rs +0 -104
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/enumerate.rs +0 -133
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/filter.rs +0 -141
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/filter_map.rs +0 -142
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/find_first_last/mod.rs +0 -230
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/find_first_last/test.rs +0 -105
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/flat_map.rs +0 -154
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/flat_map_iter.rs +0 -147
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/flatten.rs +0 -140
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/flatten_iter.rs +0 -132
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/fold.rs +0 -302
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/fold_chunks.rs +0 -236
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/fold_chunks_with.rs +0 -231
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/from_par_iter.rs +0 -310
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/inspect.rs +0 -257
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/interleave.rs +0 -335
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/interleave_shortest.rs +0 -85
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/intersperse.rs +0 -410
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/len.rs +0 -270
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/map.rs +0 -259
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/map_with.rs +0 -573
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/mod.rs +0 -3656
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/multizip.rs +0 -338
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/once.rs +0 -68
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/panic_fuse.rs +0 -342
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/par_bridge.rs +0 -159
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/plumbing/mod.rs +0 -483
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/positions.rs +0 -137
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/repeat.rs +0 -241
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/rev.rs +0 -123
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/skip.rs +0 -94
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/skip_any.rs +0 -144
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/skip_any_while.rs +0 -166
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/splitter.rs +0 -174
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/step_by.rs +0 -141
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/take.rs +0 -85
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/take_any.rs +0 -144
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/take_any_while.rs +0 -166
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/test.rs +0 -2333
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/try_fold.rs +0 -298
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/unzip.rs +0 -525
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/update.rs +0 -327
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/walk_tree.rs +0 -529
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/while_some.rs +0 -154
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/zip.rs +0 -158
- data/ext/cargo-vendor/rayon-1.10.0/src/iter/zip_eq.rs +0 -72
- data/ext/cargo-vendor/rayon-1.10.0/src/lib.rs +0 -160
- data/ext/cargo-vendor/rayon-1.10.0/src/math.rs +0 -54
- data/ext/cargo-vendor/rayon-1.10.0/src/option.rs +0 -203
- data/ext/cargo-vendor/rayon-1.10.0/src/range.rs +0 -454
- data/ext/cargo-vendor/rayon-1.10.0/src/range_inclusive.rs +0 -381
- data/ext/cargo-vendor/rayon-1.10.0/src/result.rs +0 -132
- data/ext/cargo-vendor/rayon-1.10.0/src/slice/chunk_by.rs +0 -244
- data/ext/cargo-vendor/rayon-1.10.0/src/slice/chunks.rs +0 -388
- data/ext/cargo-vendor/rayon-1.10.0/src/slice/mergesort.rs +0 -755
- data/ext/cargo-vendor/rayon-1.10.0/src/slice/mod.rs +0 -1226
- data/ext/cargo-vendor/rayon-1.10.0/src/slice/quicksort.rs +0 -902
- data/ext/cargo-vendor/rayon-1.10.0/src/slice/rchunks.rs +0 -386
- data/ext/cargo-vendor/rayon-1.10.0/src/slice/test.rs +0 -216
- data/ext/cargo-vendor/rayon-1.10.0/src/str.rs +0 -1010
- data/ext/cargo-vendor/rayon-1.10.0/src/vec.rs +0 -283
- data/ext/cargo-vendor/rayon-1.10.0/tests/clones.rs +0 -222
- data/ext/cargo-vendor/rayon-1.10.0/tests/collect.rs +0 -113
- data/ext/cargo-vendor/rayon-1.10.0/tests/debug.rs +0 -233
- data/ext/cargo-vendor/rayon-1.10.0/tests/named-threads.rs +0 -25
- data/ext/cargo-vendor/rayon-1.10.0/tests/producer_split_at.rs +0 -391
- data/ext/cargo-vendor/rayon-1.10.0/tests/sort-panic-safe.rs +0 -167
- data/ext/cargo-vendor/rayon-1.10.0/tests/str.rs +0 -119
- data/ext/cargo-vendor/rayon-core-1.12.1/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/rayon-core-1.12.1/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/rayon-core-1.12.1/Cargo.toml +0 -88
- data/ext/cargo-vendor/rayon-core-1.12.1/Cargo.toml.orig +0 -68
- data/ext/cargo-vendor/rayon-core-1.12.1/README.md +0 -11
- data/ext/cargo-vendor/rayon-core-1.12.1/src/broadcast/mod.rs +0 -150
- data/ext/cargo-vendor/rayon-core-1.12.1/src/join/mod.rs +0 -188
- data/ext/cargo-vendor/rayon-core-1.12.1/src/join/test.rs +0 -151
- data/ext/cargo-vendor/rayon-core-1.12.1/src/latch.rs +0 -461
- data/ext/cargo-vendor/rayon-core-1.12.1/src/lib.rs +0 -875
- data/ext/cargo-vendor/rayon-core-1.12.1/src/registry.rs +0 -996
- data/ext/cargo-vendor/rayon-core-1.12.1/src/scope/mod.rs +0 -769
- data/ext/cargo-vendor/rayon-core-1.12.1/src/scope/test.rs +0 -619
- data/ext/cargo-vendor/rayon-core-1.12.1/src/sleep/README.md +0 -219
- data/ext/cargo-vendor/rayon-core-1.12.1/src/sleep/counters.rs +0 -277
- data/ext/cargo-vendor/rayon-core-1.12.1/src/sleep/mod.rs +0 -325
- data/ext/cargo-vendor/rayon-core-1.12.1/src/spawn/mod.rs +0 -163
- data/ext/cargo-vendor/rayon-core-1.12.1/src/spawn/test.rs +0 -255
- data/ext/cargo-vendor/rayon-core-1.12.1/src/test.rs +0 -200
- data/ext/cargo-vendor/rayon-core-1.12.1/src/thread_pool/mod.rs +0 -508
- data/ext/cargo-vendor/rayon-core-1.12.1/src/thread_pool/test.rs +0 -418
- data/ext/cargo-vendor/rayon-core-1.12.1/tests/use_current_thread.rs +0 -57
- data/ext/cargo-vendor/serde_json-1.0.142/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/serde_json-1.0.142/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/serde_json-1.0.142/.github/workflows/ci.yml +0 -158
- data/ext/cargo-vendor/serde_json-1.0.142/Cargo.lock +0 -419
- data/ext/cargo-vendor/serde_json-1.0.142/Cargo.toml +0 -157
- data/ext/cargo-vendor/serde_json-1.0.142/Cargo.toml.orig +0 -91
- data/ext/cargo-vendor/serde_json-1.0.142/src/lib.rs +0 -438
- data/ext/cargo-vendor/serde_json-1.0.142/src/map.rs +0 -1174
- data/ext/cargo-vendor/serde_json-1.0.142/src/ser.rs +0 -2285
- data/ext/cargo-vendor/serde_json-1.0.142/src/value/de.rs +0 -1500
- data/ext/cargo-vendor/tempfile-3.20.0/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/tempfile-3.20.0/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/tempfile-3.20.0/.github/workflows/ci.yml +0 -107
- data/ext/cargo-vendor/tempfile-3.20.0/CHANGELOG.md +0 -360
- data/ext/cargo-vendor/tempfile-3.20.0/Cargo.lock +0 -183
- data/ext/cargo-vendor/tempfile-3.20.0/Cargo.toml +0 -98
- data/ext/cargo-vendor/tempfile-3.20.0/Cargo.toml.orig +0 -47
- data/ext/cargo-vendor/winapi-util-0.1.9/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/winapi-util-0.1.9/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/winapi-util-0.1.9/Cargo.toml +0 -53
- data/ext/cargo-vendor/winapi-util-0.1.9/Cargo.toml.orig +0 -25
- data/ext/cargo-vendor/windows-sys-0.59.0/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/windows-sys-0.59.0/.cargo_vcs_info.json +0 -6
- data/ext/cargo-vendor/windows-sys-0.59.0/Cargo.toml +0 -298
- data/ext/cargo-vendor/windows-sys-0.59.0/Cargo.toml.orig +0 -274
- data/ext/cargo-vendor/windows-sys-0.59.0/license-apache-2.0 +0 -201
- data/ext/cargo-vendor/windows-sys-0.59.0/license-mit +0 -21
- data/ext/cargo-vendor/windows-sys-0.59.0/readme.md +0 -87
- data/ext/cargo-vendor/windows-sys-0.59.0/rustfmt.toml +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Devices/Bluetooth/mod.rs +0 -32
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Devices/HumanInterfaceDevice/mod.rs +0 -39
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Devices/mod.rs +0 -4
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Foundation/mod.rs +0 -1317
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Graphics/Direct3D/mod.rs +0 -9170
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Graphics/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/NetworkManagement/Ndis/mod.rs +0 -3892
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/NetworkManagement/WindowsFilteringPlatform/mod.rs +0 -269
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/NetworkManagement/mod.rs +0 -4
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Storage/FileSystem/Minifilters/mod.rs +0 -1392
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Storage/FileSystem/mod.rs +0 -4503
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/Storage/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/System/IO/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/System/Memory/mod.rs +0 -11
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/System/OfflineRegistry/mod.rs +0 -28
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/System/Registry/mod.rs +0 -180
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/System/SystemInformation/mod.rs +0 -18
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/System/SystemServices/mod.rs +0 -13663
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/System/Threading/mod.rs +0 -155
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/System/mod.rs +0 -14
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Wdk/mod.rs +0 -12
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Data/HtmlHelp/mod.rs +0 -447
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Data/RightsManagement/mod.rs +0 -237
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Data/mod.rs +0 -4
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/AllJoyn/mod.rs +0 -1273
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/BiometricFramework/mod.rs +0 -1481
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Bluetooth/mod.rs +0 -1419
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Communication/mod.rs +0 -312
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/DeviceAndDriverInstallation/mod.rs +0 -3969
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/DeviceQuery/mod.rs +0 -141
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Display/mod.rs +0 -3141
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Enumeration/Pnp/mod.rs +0 -96
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Enumeration/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Fax/mod.rs +0 -1203
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/HumanInterfaceDevice/mod.rs +0 -3684
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/PortableDevices/mod.rs +0 -1999
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Properties/mod.rs +0 -261
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Pwm/mod.rs +0 -73
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Sensors/mod.rs +0 -687
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/SerialCommunication/mod.rs +0 -230
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Tapi/mod.rs +0 -3217
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/Usb/mod.rs +0 -2694
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/WebServicesOnDevices/mod.rs +0 -660
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Devices/mod.rs +0 -36
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Foundation/mod.rs +0 -10318
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Gaming/mod.rs +0 -99
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Globalization/mod.rs +0 -5135
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Graphics/Dwm/mod.rs +0 -232
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Graphics/Gdi/mod.rs +0 -3857
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Graphics/GdiPlus/mod.rs +0 -2307
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Graphics/Hlsl/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Graphics/OpenGL/mod.rs +0 -1276
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Graphics/Printing/PrintTicket/mod.rs +0 -28
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Graphics/Printing/mod.rs +0 -4147
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Graphics/mod.rs +0 -12
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Management/MobileDeviceManagementRegistration/mod.rs +0 -101
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Management/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Media/Audio/mod.rs +0 -2052
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Media/DxMediaObjects/mod.rs +0 -94
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Media/KernelStreaming/mod.rs +0 -5281
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Media/Multimedia/mod.rs +0 -6442
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Media/Streaming/mod.rs +0 -117
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Media/WindowsMediaFormat/mod.rs +0 -910
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Media/mod.rs +0 -187
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/Dhcp/mod.rs +0 -1926
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/Dns/mod.rs +0 -1564
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/InternetConnectionWizard/mod.rs +0 -22
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/IpHelper/mod.rs +0 -3004
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/Multicast/mod.rs +0 -59
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/Ndis/mod.rs +0 -3334
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/NetBios/mod.rs +0 -211
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/NetManagement/mod.rs +0 -4814
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/NetShell/mod.rs +0 -160
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/NetworkDiagnosticsFramework/mod.rs +0 -222
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/P2P/mod.rs +0 -1196
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/QoS/mod.rs +0 -1447
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/Rras/mod.rs +0 -3212
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/Snmp/mod.rs +0 -381
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/WNet/mod.rs +0 -363
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/WebDav/mod.rs +0 -47
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/WiFi/mod.rs +0 -4311
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/WindowsConnectionManager/mod.rs +0 -119
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/WindowsFilteringPlatform/mod.rs +0 -3818
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/WindowsFirewall/mod.rs +0 -281
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/WindowsNetworkVirtualization/mod.rs +0 -104
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/NetworkManagement/mod.rs +0 -42
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/ActiveDirectory/mod.rs +0 -2383
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/Clustering/mod.rs +0 -3900
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/HttpServer/mod.rs +0 -1239
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/Ldap/mod.rs +0 -817
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/WebSocket/mod.rs +0 -88
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/WinHttp/mod.rs +0 -1109
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/WinInet/mod.rs +0 -2168
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/WinSock/mod.rs +0 -4786
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/WindowsWebServices/mod.rs +0 -3480
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Networking/mod.rs +0 -18
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/AppLocker/mod.rs +0 -172
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Authentication/Identity/mod.rs +0 -5701
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Authentication/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Authorization/mod.rs +0 -984
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Credentials/mod.rs +0 -797
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Cryptography/Catalog/mod.rs +0 -151
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Cryptography/Certificates/mod.rs +0 -2315
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Cryptography/Sip/mod.rs +0 -155
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Cryptography/UI/mod.rs +0 -545
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Cryptography/mod.rs +0 -8528
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/DiagnosticDataQuery/mod.rs +0 -156
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/DirectoryServices/mod.rs +0 -19
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/EnterpriseData/mod.rs +0 -36
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/ExtensibleAuthenticationProtocol/mod.rs +0 -998
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/Isolation/mod.rs +0 -20
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/LicenseProtection/mod.rs +0 -8
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/NetworkAccessProtection/mod.rs +0 -149
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/WinTrust/mod.rs +0 -863
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/WinWlx/mod.rs +0 -335
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Security/mod.rs +0 -1156
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Cabinets/mod.rs +0 -209
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/CloudFilters/mod.rs +0 -666
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Compression/mod.rs +0 -36
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/DistributedFileSystem/mod.rs +0 -342
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/FileHistory/mod.rs +0 -97
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/FileSystem/mod.rs +0 -3699
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Imapi/mod.rs +0 -697
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/IndexServer/mod.rs +0 -279
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/InstallableFileSystems/mod.rs +0 -331
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/IscsiDisc/mod.rs +0 -1291
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Jet/mod.rs +0 -2593
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Nvme/mod.rs +0 -3428
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/OfflineFiles/mod.rs +0 -276
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/OperationRecorder/mod.rs +0 -20
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Packaging/Appx/mod.rs +0 -377
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Packaging/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/ProjectedFileSystem/mod.rs +0 -246
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/StructuredStorage/mod.rs +0 -3
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Vhd/mod.rs +0 -720
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/Xps/mod.rs +0 -415
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Storage/mod.rs +0 -38
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/AddressBook/mod.rs +0 -938
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Antimalware/mod.rs +0 -112
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/ApplicationInstallationAndServicing/mod.rs +0 -2145
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/ApplicationVerifier/mod.rs +0 -58
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/ClrHosting/mod.rs +0 -322
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Com/Marshal/mod.rs +0 -172
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Com/StructuredStorage/mod.rs +0 -655
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Com/Urlmon/mod.rs +0 -905
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Com/mod.rs +0 -1227
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/ComponentServices/mod.rs +0 -574
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Console/mod.rs +0 -373
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/CorrelationVector/mod.rs +0 -15
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/DataExchange/mod.rs +0 -428
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/DeploymentServices/mod.rs +0 -565
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/DeveloperLicensing/mod.rs +0 -3
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Diagnostics/Ceip/mod.rs +0 -1
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Diagnostics/Debug/Extensions/mod.rs +0 -3710
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Diagnostics/Debug/mod.rs +0 -5557
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Diagnostics/Etw/mod.rs +0 -2042
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Diagnostics/ProcessSnapshotting/mod.rs +0 -293
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Diagnostics/ToolHelp/mod.rs +0 -119
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Diagnostics/TraceLogging/mod.rs +0 -105
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Diagnostics/mod.rs +0 -12
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/DistributedTransactionCoordinator/mod.rs +0 -308
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Environment/mod.rs +0 -202
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/ErrorReporting/mod.rs +0 -393
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/EventCollector/mod.rs +0 -117
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/EventLog/mod.rs +0 -379
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/EventNotificationService/mod.rs +0 -35
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/GroupPolicy/mod.rs +0 -424
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/HostCompute/mod.rs +0 -1
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/HostComputeNetwork/mod.rs +0 -86
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/HostComputeSystem/mod.rs +0 -171
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Hypervisor/mod.rs +0 -1983
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/IO/mod.rs +0 -53
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Iis/mod.rs +0 -1411
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Ioctl/mod.rs +0 -6216
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/JobObjects/mod.rs +0 -434
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Js/mod.rs +0 -154
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Kernel/mod.rs +0 -295
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/LibraryLoader/mod.rs +0 -106
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Mailslots/mod.rs +0 -6
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Mapi/mod.rs +0 -150
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Memory/NonVolatile/mod.rs +0 -20
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Memory/mod.rs +0 -464
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/MessageQueuing/mod.rs +0 -712
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/MixedReality/mod.rs +0 -14
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Ole/mod.rs +0 -2599
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/PasswordManagement/mod.rs +0 -22
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Performance/HardwareCounterProfiling/mod.rs +0 -27
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Performance/mod.rs +0 -1091
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Pipes/mod.rs +0 -42
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Power/mod.rs +0 -1413
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/ProcessStatus/mod.rs +0 -200
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Recovery/mod.rs +0 -15
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Registry/mod.rs +0 -1114
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/RemoteDesktop/mod.rs +0 -1771
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/RemoteManagement/mod.rs +0 -935
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/RestartManager/mod.rs +0 -86
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Restore/mod.rs +0 -66
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Rpc/mod.rs +0 -2668
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Search/Common/mod.rs +0 -21
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Search/mod.rs +0 -5993
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/SecurityCenter/mod.rs +0 -41
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Services/mod.rs +0 -587
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/SetupAndMigration/mod.rs +0 -4
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Shutdown/mod.rs +0 -111
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/StationsAndDesktops/mod.rs +0 -99
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/SubsystemForLinux/mod.rs +0 -12
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/SystemInformation/mod.rs +0 -751
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/SystemServices/mod.rs +0 -4541
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Threading/mod.rs +0 -1148
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Time/mod.rs +0 -50
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/TpmBaseServices/mod.rs +0 -89
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/UserAccessLogging/mod.rs +0 -17
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Variant/mod.rs +0 -321
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/VirtualDosMachines/mod.rs +0 -297
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/WindowsProgramming/mod.rs +0 -1633
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/Wmi/mod.rs +0 -2435
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/System/mod.rs +0 -132
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Accessibility/mod.rs +0 -1788
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/ColorSystem/mod.rs +0 -702
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Controls/Dialogs/mod.rs +0 -1128
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Controls/mod.rs +0 -7276
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/HiDpi/mod.rs +0 -66
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Input/Ime/mod.rs +0 -1394
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Input/KeyboardAndMouse/mod.rs +0 -765
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Input/Pointer/mod.rs +0 -168
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Input/Touch/mod.rs +0 -89
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Input/XboxController/mod.rs +0 -151
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Input/mod.rs +0 -182
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/InteractionContext/mod.rs +0 -230
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Magnification/mod.rs +0 -52
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Shell/Common/mod.rs +0 -104
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Shell/PropertiesSystem/mod.rs +0 -322
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/Shell/mod.rs +0 -6704
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/TabletPC/mod.rs +0 -1537
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/TextServices/mod.rs +0 -794
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/WindowsAndMessaging/mod.rs +0 -3760
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/UI/mod.rs +0 -22
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Web/InternetExplorer/mod.rs +0 -628
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/Web/mod.rs +0 -2
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/Win32/mod.rs +0 -30
- data/ext/cargo-vendor/windows-sys-0.59.0/src/Windows/mod.rs +0 -4
- data/ext/cargo-vendor/windows-sys-0.59.0/src/core/literals.rs +0 -114
- data/ext/cargo-vendor/windows-sys-0.59.0/src/core/mod.rs +0 -33
- data/ext/cargo-vendor/windows-sys-0.59.0/src/includes/Win32/UI/WindowsAndMessaging/WindowLong.rs +0 -8
- data/ext/cargo-vendor/windows-sys-0.59.0/src/lib.rs +0 -17
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/.github/workflows/audit.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/.github/workflows/ci.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/.github/workflows/dotslash-config.json +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/.rustfmt.toml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/.rusty-hook.toml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/dev/run_benchmarks_for_file.sh +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/src/cache/mod.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/src/cache/noop.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/src/ownership/file_owner_finder.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/src/ownership/mapper/directory_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/src/ownership/mapper/escaper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/src/ownership/mapper/team_gem_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/src/ownership/mapper/team_glob_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/src/ownership/mapper/team_yml_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/cache_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/.github/CODEOWNERS +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/config/code_ownership.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/config/teams/payments.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/config/teams/payroll.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/gems/payroll_calculator/calculator.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/ruby/app/models/bank_account.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/ruby/app/models/blockchain.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/ruby/app/models/payroll.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/ruby/app/payments/nacha.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/ruby/app/services/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/ruby/app/services/multi_owned.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/ruby/app/unowned.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/invalid_project/ruby/packages/payroll_flow/package.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/.github/CODEOWNERS +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/app/consumers/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/app/consumers/deep/nesting/nestdir/deep_file.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/app/consumers/one_owner.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/app/services/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/app/services/exciting/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/app/services/exciting/some_other_file.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/config/teams/bar.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/multiple-directory-owners/config/teams/foo.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/.ignore +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/config/teams/payments.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/config/teams/payroll.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/config/teams/ux.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/gems/payroll_calculator/calculator.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/gems/pets/dog.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/index.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/package.json +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/javascript/packages/items/(special)/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/javascript/packages/items/(special)/pay.ts +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/javascript/packages/items/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/javascript/packages/items/item.ts +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/ruby/app/models/bank_account.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/ruby/app/payments/foo/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/ruby/app/payments/foo/ownedby_payroll.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/ruby/app/payments/nacha.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/ruby/app/payroll/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/ruby/app/payroll/payroll.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/ruby/ignored_files/git_ignored.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/ruby/packages/payroll_flow/package.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/fixtures/valid_project/should_be_ignored/an_ignored_file.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7/tmp/.gitkeep → codeowners-0.2.17/tests/fixtures/valid_project_with_overrides/packs/games/app/services/stats.rb} +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/git_stage_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.2.7 → codeowners-0.2.17}/tests/invalid_project_structure_test.rs +0 -0
- /data/ext/cargo-vendor/{glob-0.3.2 → glob-0.3.3}/.github/dependabot.yml +0 -0
- /data/ext/cargo-vendor/{glob-0.3.2 → glob-0.3.3}/.github/workflows/publish.yml +0 -0
- /data/ext/cargo-vendor/{glob-0.3.2 → glob-0.3.3}/LICENSE-APACHE +0 -0
- /data/ext/cargo-vendor/{glob-0.3.2 → glob-0.3.3}/LICENSE-MIT +0 -0
- /data/ext/cargo-vendor/{glob-0.3.2 → glob-0.3.3}/triagebot.toml +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/.rustfmt.toml +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/LICENSE-APACHE +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/LICENSE-MIT +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/README.md +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/benches/bench.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/benches/faststring.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/arbitrary.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/borsh.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/macros.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/map/core/extract.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/map/core/raw_entry_v1.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/map/iter.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/map/serde_seq.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/rayon/mod.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/serde.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/set/iter.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/src/util.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/tests/equivalent_trait.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/tests/macros_full_path.rs +0 -0
- /data/ext/cargo-vendor/{indexmap-2.10.0 → indexmap-2.11.0}/tests/tests.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/LICENSE-APACHE +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/LICENSE-MIT +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/compile_fail/cannot_collect_filtermap_data.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/compile_fail/cannot_zip_filtered_data.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/compile_fail/cell_par_iter.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/compile_fail/mod.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/compile_fail/must_use.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/compile_fail/no_send_par_iter.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/compile_fail/rc_par_iter.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/delegate.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/collect/consumer.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/extend.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/find.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/for_each.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/noop.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/plumbing/README.md +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/product.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/reduce.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/sum.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/try_reduce.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/iter/try_reduce_with.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/par_either.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/prelude.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/private.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/split_producer.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/src/string.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/chars.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/cross-pool.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/drain_vec.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/intersperse.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/issue671-unzip.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/issue671.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/iter_panic.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/octillion.rs +0 -0
- /data/ext/cargo-vendor/{rayon-1.10.0 → rayon-1.11.0}/tests/par_bridge_recursion.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/LICENSE-APACHE +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/LICENSE-MIT +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/build.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/broadcast/test.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/compile_fail/mod.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/compile_fail/quicksort_race1.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/compile_fail/quicksort_race2.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/compile_fail/quicksort_race3.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/compile_fail/rc_return.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/compile_fail/rc_upvar.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/compile_fail/scope_join_bad.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/job.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/private.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/src/unwind.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/tests/double_init_fail.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/tests/init_zero_threads.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/tests/scope_join.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/tests/scoped_threadpool.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/tests/simple_panic.rs +0 -0
- /data/ext/cargo-vendor/{rayon-core-1.12.1 → rayon-core-1.13.0}/tests/stack_overflow_crash.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/CONTRIBUTING.md +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/LICENSE-APACHE +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/LICENSE-MIT +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/README.md +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/build.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/de.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/error.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/io/core.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/io/mod.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/iter.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/algorithm.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/bhcomp.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/bignum.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/cached.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/cached_float80.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/digit.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/errors.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/exponent.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/float.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/large_powers.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/large_powers32.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/large_powers64.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/math.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/mod.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/num.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/parse.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/rounding.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/shift.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/lexical/small_powers.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/macros.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/number.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/raw.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/read.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/value/from.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/value/index.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/value/mod.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/value/partial_eq.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/src/value/ser.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/compiletest.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/debug.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/lexical/algorithm.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/lexical/exponent.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/lexical/float.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/lexical/math.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/lexical/num.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/lexical/parse.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/lexical/rounding.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/lexical.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/macros/mod.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/map.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/regression/issue1004.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/regression/issue520.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/regression/issue795.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/regression/issue845.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/regression/issue953.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/regression.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/stream.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/test.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/missing_colon.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/missing_colon.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/missing_comma.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/missing_comma.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/missing_value.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/missing_value.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/not_found.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/not_found.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/parse_expr.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/parse_expr.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/parse_key.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/parse_key.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/unexpected_after_array_element.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/unexpected_after_array_element.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/unexpected_after_map_entry.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/unexpected_after_map_entry.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/unexpected_colon.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/unexpected_colon.stderr +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/unexpected_comma.rs +0 -0
- /data/ext/cargo-vendor/{serde_json-1.0.142 → serde_json-1.0.143}/tests/ui/unexpected_comma.stderr +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/.github/dependabot.yml +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/LICENSE-APACHE +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/LICENSE-MIT +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/README.md +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/deny.toml +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/dir/imp/any.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/dir/imp/mod.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/dir/imp/unix.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/dir/mod.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/env.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/error.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/file/imp/mod.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/file/imp/other.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/file/imp/unix.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/file/imp/windows.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/file/mod.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/lib.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/spooled.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/src/util.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/tests/env.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/tests/namedtempfile.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/tests/spooled.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/tests/tempdir.rs +0 -0
- /data/ext/cargo-vendor/{tempfile-3.20.0 → tempfile-3.21.0}/tests/tempfile.rs +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/.github/workflows/ci.yml +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/COPYING +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/LICENSE-MIT +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/README.md +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/UNLICENSE +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/rustfmt.toml +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/src/console.rs +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/src/file.rs +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/src/lib.rs +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/src/sysinfo.rs +0 -0
- /data/ext/cargo-vendor/{winapi-util-0.1.9 → winapi-util-0.1.10}/src/win.rs +0 -0
@@ -0,0 +1,1686 @@
|
|
1
|
+
//! **Parallel** Slice sorting
|
2
|
+
//!
|
3
|
+
//! This implementation is mostly copied from the `core::slice::sort` module, with minimal changes
|
4
|
+
//! to support stable Rust and parallel `is_less` (e.g. `Fn` rather than `FnMut`).
|
5
|
+
//!
|
6
|
+
//! ---
|
7
|
+
//!
|
8
|
+
//! This module contains a sorting algorithm based on Orson Peters' pattern-defeating quicksort,
|
9
|
+
//! published at: <https://github.com/orlp/pdqsort>
|
10
|
+
//!
|
11
|
+
//! Unstable sorting is compatible with core because it doesn't allocate memory, unlike our
|
12
|
+
//! stable sorting implementation.
|
13
|
+
//!
|
14
|
+
//! In addition it also contains the core logic of the stable sort used by `slice::sort` based on
|
15
|
+
//! TimSort.
|
16
|
+
|
17
|
+
use core::cmp;
|
18
|
+
use core::mem::{self, MaybeUninit};
|
19
|
+
use core::ptr;
|
20
|
+
use core::slice;
|
21
|
+
|
22
|
+
use crate::iter::{IndexedParallelIterator, ParallelIterator};
|
23
|
+
use crate::slice::ParallelSliceMut;
|
24
|
+
use crate::SendPtr;
|
25
|
+
|
26
|
+
// When dropped, copies from `src` into `dest`.
|
27
|
+
struct InsertionHole<T> {
|
28
|
+
src: *const T,
|
29
|
+
dest: *mut T,
|
30
|
+
}
|
31
|
+
|
32
|
+
impl<T> Drop for InsertionHole<T> {
|
33
|
+
fn drop(&mut self) {
|
34
|
+
// SAFETY: This is a helper class. Please refer to its usage for correctness. Namely, one
|
35
|
+
// must be sure that `src` and `dst` does not overlap as required by
|
36
|
+
// `ptr::copy_nonoverlapping` and are both valid for writes.
|
37
|
+
unsafe {
|
38
|
+
ptr::copy_nonoverlapping(self.src, self.dest, 1);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
/// Inserts `v[v.len() - 1]` into pre-sorted sequence `v[..v.len() - 1]` so that whole `v[..]`
|
44
|
+
/// becomes sorted.
|
45
|
+
unsafe fn insert_tail<T, F>(v: &mut [T], is_less: &F)
|
46
|
+
where
|
47
|
+
F: Fn(&T, &T) -> bool,
|
48
|
+
{
|
49
|
+
debug_assert!(v.len() >= 2);
|
50
|
+
|
51
|
+
let arr_ptr = v.as_mut_ptr();
|
52
|
+
let i = v.len() - 1;
|
53
|
+
|
54
|
+
// SAFETY: caller must ensure v is at least len 2.
|
55
|
+
unsafe {
|
56
|
+
// See insert_head which talks about why this approach is beneficial.
|
57
|
+
let i_ptr = arr_ptr.add(i);
|
58
|
+
|
59
|
+
// It's important that we use i_ptr here. If this check is positive and we continue,
|
60
|
+
// We want to make sure that no other copy of the value was seen by is_less.
|
61
|
+
// Otherwise we would have to copy it back.
|
62
|
+
if is_less(&*i_ptr, &*i_ptr.sub(1)) {
|
63
|
+
// It's important, that we use tmp for comparison from now on. As it is the value that
|
64
|
+
// will be copied back. And notionally we could have created a divergence if we copy
|
65
|
+
// back the wrong value.
|
66
|
+
let tmp = mem::ManuallyDrop::new(ptr::read(i_ptr));
|
67
|
+
// Intermediate state of the insertion process is always tracked by `hole`, which
|
68
|
+
// serves two purposes:
|
69
|
+
// 1. Protects integrity of `v` from panics in `is_less`.
|
70
|
+
// 2. Fills the remaining hole in `v` in the end.
|
71
|
+
//
|
72
|
+
// Panic safety:
|
73
|
+
//
|
74
|
+
// If `is_less` panics at any point during the process, `hole` will get dropped and
|
75
|
+
// fill the hole in `v` with `tmp`, thus ensuring that `v` still holds every object it
|
76
|
+
// initially held exactly once.
|
77
|
+
let mut hole = InsertionHole {
|
78
|
+
src: &*tmp,
|
79
|
+
dest: i_ptr.sub(1),
|
80
|
+
};
|
81
|
+
ptr::copy_nonoverlapping(hole.dest, i_ptr, 1);
|
82
|
+
|
83
|
+
// SAFETY: We know i is at least 1.
|
84
|
+
for j in (0..(i - 1)).rev() {
|
85
|
+
let j_ptr = arr_ptr.add(j);
|
86
|
+
if !is_less(&*tmp, &*j_ptr) {
|
87
|
+
break;
|
88
|
+
}
|
89
|
+
|
90
|
+
ptr::copy_nonoverlapping(j_ptr, hole.dest, 1);
|
91
|
+
hole.dest = j_ptr;
|
92
|
+
}
|
93
|
+
// `hole` gets dropped and thus copies `tmp` into the remaining hole in `v`.
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
/// Inserts `v[0]` into pre-sorted sequence `v[1..]` so that whole `v[..]` becomes sorted.
|
99
|
+
///
|
100
|
+
/// This is the integral subroutine of insertion sort.
|
101
|
+
unsafe fn insert_head<T, F>(v: &mut [T], is_less: &F)
|
102
|
+
where
|
103
|
+
F: Fn(&T, &T) -> bool,
|
104
|
+
{
|
105
|
+
debug_assert!(v.len() >= 2);
|
106
|
+
|
107
|
+
// SAFETY: caller must ensure v is at least len 2.
|
108
|
+
unsafe {
|
109
|
+
if is_less(v.get_unchecked(1), v.get_unchecked(0)) {
|
110
|
+
let arr_ptr = v.as_mut_ptr();
|
111
|
+
|
112
|
+
// There are three ways to implement insertion here:
|
113
|
+
//
|
114
|
+
// 1. Swap adjacent elements until the first one gets to its final destination.
|
115
|
+
// However, this way we copy data around more than is necessary. If elements are big
|
116
|
+
// structures (costly to copy), this method will be slow.
|
117
|
+
//
|
118
|
+
// 2. Iterate until the right place for the first element is found. Then shift the
|
119
|
+
// elements succeeding it to make room for it and finally place it into the
|
120
|
+
// remaining hole. This is a good method.
|
121
|
+
//
|
122
|
+
// 3. Copy the first element into a temporary variable. Iterate until the right place
|
123
|
+
// for it is found. As we go along, copy every traversed element into the slot
|
124
|
+
// preceding it. Finally, copy data from the temporary variable into the remaining
|
125
|
+
// hole. This method is very good. Benchmarks demonstrated slightly better
|
126
|
+
// performance than with the 2nd method.
|
127
|
+
//
|
128
|
+
// All methods were benchmarked, and the 3rd showed best results. So we chose that one.
|
129
|
+
let tmp = mem::ManuallyDrop::new(ptr::read(arr_ptr));
|
130
|
+
|
131
|
+
// Intermediate state of the insertion process is always tracked by `hole`, which
|
132
|
+
// serves two purposes:
|
133
|
+
// 1. Protects integrity of `v` from panics in `is_less`.
|
134
|
+
// 2. Fills the remaining hole in `v` in the end.
|
135
|
+
//
|
136
|
+
// Panic safety:
|
137
|
+
//
|
138
|
+
// If `is_less` panics at any point during the process, `hole` will get dropped and
|
139
|
+
// fill the hole in `v` with `tmp`, thus ensuring that `v` still holds every object it
|
140
|
+
// initially held exactly once.
|
141
|
+
let mut hole = InsertionHole {
|
142
|
+
src: &*tmp,
|
143
|
+
dest: arr_ptr.add(1),
|
144
|
+
};
|
145
|
+
ptr::copy_nonoverlapping(arr_ptr.add(1), arr_ptr.add(0), 1);
|
146
|
+
|
147
|
+
for i in 2..v.len() {
|
148
|
+
if !is_less(v.get_unchecked(i), &*tmp) {
|
149
|
+
break;
|
150
|
+
}
|
151
|
+
ptr::copy_nonoverlapping(arr_ptr.add(i), arr_ptr.add(i - 1), 1);
|
152
|
+
hole.dest = arr_ptr.add(i);
|
153
|
+
}
|
154
|
+
// `hole` gets dropped and thus copies `tmp` into the remaining hole in `v`.
|
155
|
+
}
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
/// Sort `v` assuming `v[..offset]` is already sorted.
|
160
|
+
///
|
161
|
+
/// Never inline this function to avoid code bloat. It still optimizes nicely and has practically no
|
162
|
+
/// performance impact. Even improving performance in some cases.
|
163
|
+
#[inline(never)]
|
164
|
+
fn insertion_sort_shift_left<T, F>(v: &mut [T], offset: usize, is_less: &F)
|
165
|
+
where
|
166
|
+
F: Fn(&T, &T) -> bool,
|
167
|
+
{
|
168
|
+
let len = v.len();
|
169
|
+
|
170
|
+
// Using assert here improves performance.
|
171
|
+
assert!(offset != 0 && offset <= len);
|
172
|
+
|
173
|
+
// Shift each element of the unsorted region v[i..] as far left as is needed to make v sorted.
|
174
|
+
for i in offset..len {
|
175
|
+
// SAFETY: we tested that `offset` must be at least 1, so this loop is only entered if len
|
176
|
+
// >= 2. The range is exclusive and we know `i` must be at least 1 so this slice has at
|
177
|
+
// >least len 2.
|
178
|
+
unsafe {
|
179
|
+
insert_tail(&mut v[..=i], is_less);
|
180
|
+
}
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
/// Sort `v` assuming `v[offset..]` is already sorted.
|
185
|
+
///
|
186
|
+
/// Never inline this function to avoid code bloat. It still optimizes nicely and has practically no
|
187
|
+
/// performance impact. Even improving performance in some cases.
|
188
|
+
#[inline(never)]
|
189
|
+
fn insertion_sort_shift_right<T, F>(v: &mut [T], offset: usize, is_less: &F)
|
190
|
+
where
|
191
|
+
F: Fn(&T, &T) -> bool,
|
192
|
+
{
|
193
|
+
let len = v.len();
|
194
|
+
|
195
|
+
// Using assert here improves performance.
|
196
|
+
assert!(offset != 0 && offset <= len && len >= 2);
|
197
|
+
|
198
|
+
// Shift each element of the unsorted region v[..i] as far left as is needed to make v sorted.
|
199
|
+
for i in (0..offset).rev() {
|
200
|
+
// SAFETY: we tested that `offset` must be at least 1, so this loop is only entered if len
|
201
|
+
// >= 2.We ensured that the slice length is always at least 2 long. We know that start_found
|
202
|
+
// will be at least one less than end, and the range is exclusive. Which gives us i always
|
203
|
+
// <= (end - 2).
|
204
|
+
unsafe {
|
205
|
+
insert_head(&mut v[i..len], is_less);
|
206
|
+
}
|
207
|
+
}
|
208
|
+
}
|
209
|
+
|
210
|
+
/// Partially sorts a slice by shifting several out-of-order elements around.
|
211
|
+
///
|
212
|
+
/// Returns `true` if the slice is sorted at the end. This function is *O*(*n*) worst-case.
|
213
|
+
#[cold]
|
214
|
+
fn partial_insertion_sort<T, F>(v: &mut [T], is_less: &F) -> bool
|
215
|
+
where
|
216
|
+
F: Fn(&T, &T) -> bool,
|
217
|
+
{
|
218
|
+
// Maximum number of adjacent out-of-order pairs that will get shifted.
|
219
|
+
const MAX_STEPS: usize = 5;
|
220
|
+
// If the slice is shorter than this, don't shift any elements.
|
221
|
+
const SHORTEST_SHIFTING: usize = 50;
|
222
|
+
|
223
|
+
let len = v.len();
|
224
|
+
let mut i = 1;
|
225
|
+
|
226
|
+
for _ in 0..MAX_STEPS {
|
227
|
+
// SAFETY: We already explicitly did the bound checking with `i < len`.
|
228
|
+
// All our subsequent indexing is only in the range `0 <= index < len`
|
229
|
+
unsafe {
|
230
|
+
// Find the next pair of adjacent out-of-order elements.
|
231
|
+
while i < len && !is_less(v.get_unchecked(i), v.get_unchecked(i - 1)) {
|
232
|
+
i += 1;
|
233
|
+
}
|
234
|
+
}
|
235
|
+
|
236
|
+
// Are we done?
|
237
|
+
if i == len {
|
238
|
+
return true;
|
239
|
+
}
|
240
|
+
|
241
|
+
// Don't shift elements on short arrays, that has a performance cost.
|
242
|
+
if len < SHORTEST_SHIFTING {
|
243
|
+
return false;
|
244
|
+
}
|
245
|
+
|
246
|
+
// Swap the found pair of elements. This puts them in correct order.
|
247
|
+
v.swap(i - 1, i);
|
248
|
+
|
249
|
+
if i >= 2 {
|
250
|
+
// Shift the smaller element to the left.
|
251
|
+
insertion_sort_shift_left(&mut v[..i], i - 1, is_less);
|
252
|
+
|
253
|
+
// Shift the greater element to the right.
|
254
|
+
insertion_sort_shift_right(&mut v[..i], 1, is_less);
|
255
|
+
}
|
256
|
+
}
|
257
|
+
|
258
|
+
// Didn't manage to sort the slice in the limited number of steps.
|
259
|
+
false
|
260
|
+
}
|
261
|
+
|
262
|
+
/// Sorts `v` using heapsort, which guarantees *O*(*n* \* log(*n*)) worst-case.
|
263
|
+
#[cold]
|
264
|
+
fn heapsort<T, F>(v: &mut [T], is_less: F)
|
265
|
+
where
|
266
|
+
F: Fn(&T, &T) -> bool,
|
267
|
+
{
|
268
|
+
// This binary heap respects the invariant `parent >= child`.
|
269
|
+
let sift_down = |v: &mut [T], mut node| {
|
270
|
+
loop {
|
271
|
+
// Children of `node`.
|
272
|
+
let mut child = 2 * node + 1;
|
273
|
+
if child >= v.len() {
|
274
|
+
break;
|
275
|
+
}
|
276
|
+
|
277
|
+
// Choose the greater child.
|
278
|
+
if child + 1 < v.len() {
|
279
|
+
// We need a branch to be sure not to out-of-bounds index,
|
280
|
+
// but it's highly predictable. The comparison, however,
|
281
|
+
// is better done branchless, especially for primitives.
|
282
|
+
child += is_less(&v[child], &v[child + 1]) as usize;
|
283
|
+
}
|
284
|
+
|
285
|
+
// Stop if the invariant holds at `node`.
|
286
|
+
if !is_less(&v[node], &v[child]) {
|
287
|
+
break;
|
288
|
+
}
|
289
|
+
|
290
|
+
// Swap `node` with the greater child, move one step down, and continue sifting.
|
291
|
+
v.swap(node, child);
|
292
|
+
node = child;
|
293
|
+
}
|
294
|
+
};
|
295
|
+
|
296
|
+
// Build the heap in linear time.
|
297
|
+
for i in (0..v.len() / 2).rev() {
|
298
|
+
sift_down(v, i);
|
299
|
+
}
|
300
|
+
|
301
|
+
// Pop maximal elements from the heap.
|
302
|
+
for i in (1..v.len()).rev() {
|
303
|
+
v.swap(0, i);
|
304
|
+
sift_down(&mut v[..i], 0);
|
305
|
+
}
|
306
|
+
}
|
307
|
+
|
308
|
+
/// Partitions `v` into elements smaller than `pivot`, followed by elements greater than or equal
|
309
|
+
/// to `pivot`.
|
310
|
+
///
|
311
|
+
/// Returns the number of elements smaller than `pivot`.
|
312
|
+
///
|
313
|
+
/// Partitioning is performed block-by-block in order to minimize the cost of branching operations.
|
314
|
+
/// This idea is presented in the [BlockQuicksort][pdf] paper.
|
315
|
+
///
|
316
|
+
/// [pdf]: https://drops.dagstuhl.de/opus/volltexte/2016/6389/pdf/LIPIcs-ESA-2016-38.pdf
|
317
|
+
fn partition_in_blocks<T, F>(v: &mut [T], pivot: &T, is_less: &F) -> usize
|
318
|
+
where
|
319
|
+
F: Fn(&T, &T) -> bool,
|
320
|
+
{
|
321
|
+
// Number of elements in a typical block.
|
322
|
+
const BLOCK: usize = 128;
|
323
|
+
|
324
|
+
// The partitioning algorithm repeats the following steps until completion:
|
325
|
+
//
|
326
|
+
// 1. Trace a block from the left side to identify elements greater than or equal to the pivot.
|
327
|
+
// 2. Trace a block from the right side to identify elements smaller than the pivot.
|
328
|
+
// 3. Exchange the identified elements between the left and right side.
|
329
|
+
//
|
330
|
+
// We keep the following variables for a block of elements:
|
331
|
+
//
|
332
|
+
// 1. `block` - Number of elements in the block.
|
333
|
+
// 2. `start` - Start pointer into the `offsets` array.
|
334
|
+
// 3. `end` - End pointer into the `offsets` array.
|
335
|
+
// 4. `offsets` - Indices of out-of-order elements within the block.
|
336
|
+
|
337
|
+
// The current block on the left side (from `l` to `l.add(block_l)`).
|
338
|
+
let mut l = v.as_mut_ptr();
|
339
|
+
let mut block_l = BLOCK;
|
340
|
+
let mut start_l = ptr::null_mut();
|
341
|
+
let mut end_l = ptr::null_mut();
|
342
|
+
let mut offsets_l = [MaybeUninit::<u8>::uninit(); BLOCK];
|
343
|
+
|
344
|
+
// The current block on the right side (from `r.sub(block_r)` to `r`).
|
345
|
+
// SAFETY: The documentation for .add() specifically mention that `vec.as_ptr().add(vec.len())` is always safe
|
346
|
+
let mut r = unsafe { l.add(v.len()) };
|
347
|
+
let mut block_r = BLOCK;
|
348
|
+
let mut start_r = ptr::null_mut();
|
349
|
+
let mut end_r = ptr::null_mut();
|
350
|
+
let mut offsets_r = [MaybeUninit::<u8>::uninit(); BLOCK];
|
351
|
+
|
352
|
+
// FIXME: When we get VLAs, try creating one array of length `min(v.len(), 2 * BLOCK)` rather
|
353
|
+
// than two fixed-size arrays of length `BLOCK`. VLAs might be more cache-efficient.
|
354
|
+
|
355
|
+
// Returns the number of elements between pointers `l` (inclusive) and `r` (exclusive).
|
356
|
+
fn width<T>(l: *mut T, r: *mut T) -> usize {
|
357
|
+
assert!(size_of::<T>() > 0);
|
358
|
+
// FIXME: this should *likely* use `offset_from`, but more
|
359
|
+
// investigation is needed (including running tests in miri).
|
360
|
+
(r as usize - l as usize) / size_of::<T>()
|
361
|
+
}
|
362
|
+
|
363
|
+
loop {
|
364
|
+
// We are done with partitioning block-by-block when `l` and `r` get very close. Then we do
|
365
|
+
// some patch-up work in order to partition the remaining elements in between.
|
366
|
+
let is_done = width(l, r) <= 2 * BLOCK;
|
367
|
+
|
368
|
+
if is_done {
|
369
|
+
// Number of remaining elements (still not compared to the pivot).
|
370
|
+
let mut rem = width(l, r);
|
371
|
+
if start_l < end_l || start_r < end_r {
|
372
|
+
rem -= BLOCK;
|
373
|
+
}
|
374
|
+
|
375
|
+
// Adjust block sizes so that the left and right block don't overlap, but get perfectly
|
376
|
+
// aligned to cover the whole remaining gap.
|
377
|
+
if start_l < end_l {
|
378
|
+
block_r = rem;
|
379
|
+
} else if start_r < end_r {
|
380
|
+
block_l = rem;
|
381
|
+
} else {
|
382
|
+
// There were the same number of elements to switch on both blocks during the last
|
383
|
+
// iteration, so there are no remaining elements on either block. Cover the remaining
|
384
|
+
// items with roughly equally-sized blocks.
|
385
|
+
block_l = rem / 2;
|
386
|
+
block_r = rem - block_l;
|
387
|
+
}
|
388
|
+
debug_assert!(block_l <= BLOCK && block_r <= BLOCK);
|
389
|
+
debug_assert!(width(l, r) == block_l + block_r);
|
390
|
+
}
|
391
|
+
|
392
|
+
if start_l == end_l {
|
393
|
+
// Trace `block_l` elements from the left side.
|
394
|
+
start_l = offsets_l.as_mut_ptr() as *mut u8;
|
395
|
+
end_l = start_l;
|
396
|
+
let mut elem = l;
|
397
|
+
|
398
|
+
for i in 0..block_l {
|
399
|
+
// SAFETY: The unsafety operations below involve the usage of the `offset`.
|
400
|
+
// According to the conditions required by the function, we satisfy them because:
|
401
|
+
// 1. `offsets_l` is stack-allocated, and thus considered separate allocated object.
|
402
|
+
// 2. The function `is_less` returns a `bool`.
|
403
|
+
// Casting a `bool` will never overflow `isize`.
|
404
|
+
// 3. We have guaranteed that `block_l` will be `<= BLOCK`.
|
405
|
+
// Plus, `end_l` was initially set to the begin pointer of `offsets_` which was declared on the stack.
|
406
|
+
// Thus, we know that even in the worst case (all invocations of `is_less` returns false) we will only be at most 1 byte pass the end.
|
407
|
+
// Another unsafety operation here is dereferencing `elem`.
|
408
|
+
// However, `elem` was initially the begin pointer to the slice which is always valid.
|
409
|
+
unsafe {
|
410
|
+
// Branchless comparison.
|
411
|
+
*end_l = i as u8;
|
412
|
+
end_l = end_l.add(!is_less(&*elem, pivot) as usize);
|
413
|
+
elem = elem.add(1);
|
414
|
+
}
|
415
|
+
}
|
416
|
+
}
|
417
|
+
|
418
|
+
if start_r == end_r {
|
419
|
+
// Trace `block_r` elements from the right side.
|
420
|
+
start_r = offsets_r.as_mut_ptr() as *mut u8;
|
421
|
+
end_r = start_r;
|
422
|
+
let mut elem = r;
|
423
|
+
|
424
|
+
for i in 0..block_r {
|
425
|
+
// SAFETY: The unsafety operations below involve the usage of the `offset`.
|
426
|
+
// According to the conditions required by the function, we satisfy them because:
|
427
|
+
// 1. `offsets_r` is stack-allocated, and thus considered separate allocated object.
|
428
|
+
// 2. The function `is_less` returns a `bool`.
|
429
|
+
// Casting a `bool` will never overflow `isize`.
|
430
|
+
// 3. We have guaranteed that `block_r` will be `<= BLOCK`.
|
431
|
+
// Plus, `end_r` was initially set to the begin pointer of `offsets_` which was declared on the stack.
|
432
|
+
// Thus, we know that even in the worst case (all invocations of `is_less` returns true) we will only be at most 1 byte pass the end.
|
433
|
+
// Another unsafety operation here is dereferencing `elem`.
|
434
|
+
// However, `elem` was initially `1 * sizeof(T)` past the end and we decrement it by `1 * sizeof(T)` before accessing it.
|
435
|
+
// Plus, `block_r` was asserted to be less than `BLOCK` and `elem` will therefore at most be pointing to the beginning of the slice.
|
436
|
+
unsafe {
|
437
|
+
// Branchless comparison.
|
438
|
+
elem = elem.sub(1);
|
439
|
+
*end_r = i as u8;
|
440
|
+
end_r = end_r.add(is_less(&*elem, pivot) as usize);
|
441
|
+
}
|
442
|
+
}
|
443
|
+
}
|
444
|
+
|
445
|
+
// Number of out-of-order elements to swap between the left and right side.
|
446
|
+
let count = cmp::min(width(start_l, end_l), width(start_r, end_r));
|
447
|
+
|
448
|
+
if count > 0 {
|
449
|
+
macro_rules! left {
|
450
|
+
() => {
|
451
|
+
l.add(usize::from(*start_l))
|
452
|
+
};
|
453
|
+
}
|
454
|
+
macro_rules! right {
|
455
|
+
() => {
|
456
|
+
r.sub(usize::from(*start_r) + 1)
|
457
|
+
};
|
458
|
+
}
|
459
|
+
|
460
|
+
// Instead of swapping one pair at the time, it is more efficient to perform a cyclic
|
461
|
+
// permutation. This is not strictly equivalent to swapping, but produces a similar
|
462
|
+
// result using fewer memory operations.
|
463
|
+
|
464
|
+
// SAFETY: The use of `ptr::read` is valid because there is at least one element in
|
465
|
+
// both `offsets_l` and `offsets_r`, so `left!` is a valid pointer to read from.
|
466
|
+
//
|
467
|
+
// The uses of `left!` involve calls to `offset` on `l`, which points to the
|
468
|
+
// beginning of `v`. All the offsets pointed-to by `start_l` are at most `block_l`, so
|
469
|
+
// these `offset` calls are safe as all reads are within the block. The same argument
|
470
|
+
// applies for the uses of `right!`.
|
471
|
+
//
|
472
|
+
// The calls to `start_l.offset` are valid because there are at most `count-1` of them,
|
473
|
+
// plus the final one at the end of the unsafe block, where `count` is the minimum number
|
474
|
+
// of collected offsets in `offsets_l` and `offsets_r`, so there is no risk of there not
|
475
|
+
// being enough elements. The same reasoning applies to the calls to `start_r.offset`.
|
476
|
+
//
|
477
|
+
// The calls to `copy_nonoverlapping` are safe because `left!` and `right!` are guaranteed
|
478
|
+
// not to overlap, and are valid because of the reasoning above.
|
479
|
+
unsafe {
|
480
|
+
let tmp = ptr::read(left!());
|
481
|
+
ptr::copy_nonoverlapping(right!(), left!(), 1);
|
482
|
+
|
483
|
+
for _ in 1..count {
|
484
|
+
start_l = start_l.add(1);
|
485
|
+
ptr::copy_nonoverlapping(left!(), right!(), 1);
|
486
|
+
start_r = start_r.add(1);
|
487
|
+
ptr::copy_nonoverlapping(right!(), left!(), 1);
|
488
|
+
}
|
489
|
+
|
490
|
+
ptr::copy_nonoverlapping(&tmp, right!(), 1);
|
491
|
+
mem::forget(tmp);
|
492
|
+
start_l = start_l.add(1);
|
493
|
+
start_r = start_r.add(1);
|
494
|
+
}
|
495
|
+
}
|
496
|
+
|
497
|
+
if start_l == end_l {
|
498
|
+
// All out-of-order elements in the left block were moved. Move to the next block.
|
499
|
+
|
500
|
+
// block-width-guarantee
|
501
|
+
// SAFETY: if `!is_done` then the slice width is guaranteed to be at least `2*BLOCK` wide. There
|
502
|
+
// are at most `BLOCK` elements in `offsets_l` because of its size, so the `offset` operation is
|
503
|
+
// safe. Otherwise, the debug assertions in the `is_done` case guarantee that
|
504
|
+
// `width(l, r) == block_l + block_r`, namely, that the block sizes have been adjusted to account
|
505
|
+
// for the smaller number of remaining elements.
|
506
|
+
l = unsafe { l.add(block_l) };
|
507
|
+
}
|
508
|
+
|
509
|
+
if start_r == end_r {
|
510
|
+
// All out-of-order elements in the right block were moved. Move to the previous block.
|
511
|
+
|
512
|
+
// SAFETY: Same argument as [block-width-guarantee]. Either this is a full block `2*BLOCK`-wide,
|
513
|
+
// or `block_r` has been adjusted for the last handful of elements.
|
514
|
+
r = unsafe { r.sub(block_r) };
|
515
|
+
}
|
516
|
+
|
517
|
+
if is_done {
|
518
|
+
break;
|
519
|
+
}
|
520
|
+
}
|
521
|
+
|
522
|
+
// All that remains now is at most one block (either the left or the right) with out-of-order
|
523
|
+
// elements that need to be moved. Such remaining elements can be simply shifted to the end
|
524
|
+
// within their block.
|
525
|
+
|
526
|
+
if start_l < end_l {
|
527
|
+
// The left block remains.
|
528
|
+
// Move its remaining out-of-order elements to the far right.
|
529
|
+
debug_assert_eq!(width(l, r), block_l);
|
530
|
+
while start_l < end_l {
|
531
|
+
// remaining-elements-safety
|
532
|
+
// SAFETY: while the loop condition holds there are still elements in `offsets_l`, so it
|
533
|
+
// is safe to point `end_l` to the previous element.
|
534
|
+
//
|
535
|
+
// The `ptr::swap` is safe if both its arguments are valid for reads and writes:
|
536
|
+
// - Per the debug assert above, the distance between `l` and `r` is `block_l`
|
537
|
+
// elements, so there can be at most `block_l` remaining offsets between `start_l`
|
538
|
+
// and `end_l`. This means `r` will be moved at most `block_l` steps back, which
|
539
|
+
// makes the `r.offset` calls valid (at that point `l == r`).
|
540
|
+
// - `offsets_l` contains valid offsets into `v` collected during the partitioning of
|
541
|
+
// the last block, so the `l.offset` calls are valid.
|
542
|
+
unsafe {
|
543
|
+
end_l = end_l.sub(1);
|
544
|
+
ptr::swap(l.add(usize::from(*end_l)), r.sub(1));
|
545
|
+
r = r.sub(1);
|
546
|
+
}
|
547
|
+
}
|
548
|
+
width(v.as_mut_ptr(), r)
|
549
|
+
} else if start_r < end_r {
|
550
|
+
// The right block remains.
|
551
|
+
// Move its remaining out-of-order elements to the far left.
|
552
|
+
debug_assert_eq!(width(l, r), block_r);
|
553
|
+
while start_r < end_r {
|
554
|
+
// SAFETY: See the reasoning in [remaining-elements-safety].
|
555
|
+
unsafe {
|
556
|
+
end_r = end_r.sub(1);
|
557
|
+
ptr::swap(l, r.sub(usize::from(*end_r) + 1));
|
558
|
+
l = l.add(1);
|
559
|
+
}
|
560
|
+
}
|
561
|
+
width(v.as_mut_ptr(), l)
|
562
|
+
} else {
|
563
|
+
// Nothing else to do, we're done.
|
564
|
+
width(v.as_mut_ptr(), l)
|
565
|
+
}
|
566
|
+
}
|
567
|
+
|
568
|
+
/// Partitions `v` into elements smaller than `v[pivot]`, followed by elements greater than or
|
569
|
+
/// equal to `v[pivot]`.
|
570
|
+
///
|
571
|
+
/// Returns a tuple of:
|
572
|
+
///
|
573
|
+
/// 1. Number of elements smaller than `v[pivot]`.
|
574
|
+
/// 2. True if `v` was already partitioned.
|
575
|
+
fn partition<T, F>(v: &mut [T], pivot: usize, is_less: &F) -> (usize, bool)
|
576
|
+
where
|
577
|
+
F: Fn(&T, &T) -> bool,
|
578
|
+
{
|
579
|
+
let (mid, was_partitioned) = {
|
580
|
+
// Place the pivot at the beginning of slice.
|
581
|
+
v.swap(0, pivot);
|
582
|
+
let (pivot, v) = v.split_at_mut(1);
|
583
|
+
let pivot = &mut pivot[0];
|
584
|
+
|
585
|
+
// Read the pivot into a stack-allocated variable for efficiency. If a following comparison
|
586
|
+
// operation panics, the pivot will be automatically written back into the slice.
|
587
|
+
|
588
|
+
// SAFETY: `pivot` is a reference to the first element of `v`, so `ptr::read` is safe.
|
589
|
+
let tmp = mem::ManuallyDrop::new(unsafe { ptr::read(pivot) });
|
590
|
+
let _pivot_guard = InsertionHole {
|
591
|
+
src: &*tmp,
|
592
|
+
dest: pivot,
|
593
|
+
};
|
594
|
+
let pivot = &*tmp;
|
595
|
+
|
596
|
+
// Find the first pair of out-of-order elements.
|
597
|
+
let mut l = 0;
|
598
|
+
let mut r = v.len();
|
599
|
+
|
600
|
+
// SAFETY: The unsafety below involves indexing an array.
|
601
|
+
// For the first one: We already do the bounds checking here with `l < r`.
|
602
|
+
// For the second one: We initially have `l == 0` and `r == v.len()` and we checked that `l < r` at every indexing operation.
|
603
|
+
// From here we know that `r` must be at least `r == l` which was shown to be valid from the first one.
|
604
|
+
unsafe {
|
605
|
+
// Find the first element greater than or equal to the pivot.
|
606
|
+
while l < r && is_less(v.get_unchecked(l), pivot) {
|
607
|
+
l += 1;
|
608
|
+
}
|
609
|
+
|
610
|
+
// Find the last element smaller that the pivot.
|
611
|
+
while l < r && !is_less(v.get_unchecked(r - 1), pivot) {
|
612
|
+
r -= 1;
|
613
|
+
}
|
614
|
+
}
|
615
|
+
|
616
|
+
(
|
617
|
+
l + partition_in_blocks(&mut v[l..r], pivot, is_less),
|
618
|
+
l >= r,
|
619
|
+
)
|
620
|
+
|
621
|
+
// `_pivot_guard` goes out of scope and writes the pivot (which is a stack-allocated
|
622
|
+
// variable) back into the slice where it originally was. This step is critical in ensuring
|
623
|
+
// safety!
|
624
|
+
};
|
625
|
+
|
626
|
+
// Place the pivot between the two partitions.
|
627
|
+
v.swap(0, mid);
|
628
|
+
|
629
|
+
(mid, was_partitioned)
|
630
|
+
}
|
631
|
+
|
632
|
+
/// Partitions `v` into elements equal to `v[pivot]` followed by elements greater than `v[pivot]`.
|
633
|
+
///
|
634
|
+
/// Returns the number of elements equal to the pivot. It is assumed that `v` does not contain
|
635
|
+
/// elements smaller than the pivot.
|
636
|
+
fn partition_equal<T, F>(v: &mut [T], pivot: usize, is_less: &F) -> usize
|
637
|
+
where
|
638
|
+
F: Fn(&T, &T) -> bool,
|
639
|
+
{
|
640
|
+
// Place the pivot at the beginning of slice.
|
641
|
+
v.swap(0, pivot);
|
642
|
+
let (pivot, v) = v.split_at_mut(1);
|
643
|
+
let pivot = &mut pivot[0];
|
644
|
+
|
645
|
+
// Read the pivot into a stack-allocated variable for efficiency. If a following comparison
|
646
|
+
// operation panics, the pivot will be automatically written back into the slice.
|
647
|
+
// SAFETY: The pointer here is valid because it is obtained from a reference to a slice.
|
648
|
+
let tmp = mem::ManuallyDrop::new(unsafe { ptr::read(pivot) });
|
649
|
+
let _pivot_guard = InsertionHole {
|
650
|
+
src: &*tmp,
|
651
|
+
dest: pivot,
|
652
|
+
};
|
653
|
+
let pivot = &*tmp;
|
654
|
+
|
655
|
+
let len = v.len();
|
656
|
+
if len == 0 {
|
657
|
+
return 0;
|
658
|
+
}
|
659
|
+
|
660
|
+
// Now partition the slice.
|
661
|
+
let mut l = 0;
|
662
|
+
let mut r = len;
|
663
|
+
loop {
|
664
|
+
// SAFETY: The unsafety below involves indexing an array.
|
665
|
+
// For the first one: We already do the bounds checking here with `l < r`.
|
666
|
+
// For the second one: We initially have `l == 0` and `r == v.len()` and we checked that `l < r` at every indexing operation.
|
667
|
+
// From here we know that `r` must be at least `r == l` which was shown to be valid from the first one.
|
668
|
+
unsafe {
|
669
|
+
// Find the first element greater than the pivot.
|
670
|
+
while l < r && !is_less(pivot, v.get_unchecked(l)) {
|
671
|
+
l += 1;
|
672
|
+
}
|
673
|
+
|
674
|
+
// Find the last element equal to the pivot.
|
675
|
+
loop {
|
676
|
+
r -= 1;
|
677
|
+
if l >= r || !is_less(pivot, v.get_unchecked(r)) {
|
678
|
+
break;
|
679
|
+
}
|
680
|
+
}
|
681
|
+
|
682
|
+
// Are we done?
|
683
|
+
if l >= r {
|
684
|
+
break;
|
685
|
+
}
|
686
|
+
|
687
|
+
// Swap the found pair of out-of-order elements.
|
688
|
+
let ptr = v.as_mut_ptr();
|
689
|
+
ptr::swap(ptr.add(l), ptr.add(r));
|
690
|
+
l += 1;
|
691
|
+
}
|
692
|
+
}
|
693
|
+
|
694
|
+
// We found `l` elements equal to the pivot. Add 1 to account for the pivot itself.
|
695
|
+
l + 1
|
696
|
+
|
697
|
+
// `_pivot_guard` goes out of scope and writes the pivot (which is a stack-allocated variable)
|
698
|
+
// back into the slice where it originally was. This step is critical in ensuring safety!
|
699
|
+
}
|
700
|
+
|
701
|
+
/// Scatters some elements around in an attempt to break patterns that might cause imbalanced
|
702
|
+
/// partitions in quicksort.
|
703
|
+
#[cold]
|
704
|
+
fn break_patterns<T>(v: &mut [T]) {
|
705
|
+
let len = v.len();
|
706
|
+
if len >= 8 {
|
707
|
+
let mut seed = len;
|
708
|
+
let mut gen_usize = || {
|
709
|
+
// Pseudorandom number generator from the "Xorshift RNGs" paper by George Marsaglia.
|
710
|
+
if usize::BITS <= 32 {
|
711
|
+
let mut r = seed as u32;
|
712
|
+
r ^= r << 13;
|
713
|
+
r ^= r >> 17;
|
714
|
+
r ^= r << 5;
|
715
|
+
seed = r as usize;
|
716
|
+
seed
|
717
|
+
} else {
|
718
|
+
let mut r = seed as u64;
|
719
|
+
r ^= r << 13;
|
720
|
+
r ^= r >> 7;
|
721
|
+
r ^= r << 17;
|
722
|
+
seed = r as usize;
|
723
|
+
seed
|
724
|
+
}
|
725
|
+
};
|
726
|
+
|
727
|
+
// Take random numbers modulo this number.
|
728
|
+
// The number fits into `usize` because `len` is not greater than `isize::MAX`.
|
729
|
+
let modulus = len.next_power_of_two();
|
730
|
+
|
731
|
+
// Some pivot candidates will be in the nearby of this index. Let's randomize them.
|
732
|
+
let pos = len / 4 * 2;
|
733
|
+
|
734
|
+
for i in 0..3 {
|
735
|
+
// Generate a random number modulo `len`. However, in order to avoid costly operations
|
736
|
+
// we first take it modulo a power of two, and then decrease by `len` until it fits
|
737
|
+
// into the range `[0, len - 1]`.
|
738
|
+
let mut other = gen_usize() & (modulus - 1);
|
739
|
+
|
740
|
+
// `other` is guaranteed to be less than `2 * len`.
|
741
|
+
if other >= len {
|
742
|
+
other -= len;
|
743
|
+
}
|
744
|
+
|
745
|
+
v.swap(pos - 1 + i, other);
|
746
|
+
}
|
747
|
+
}
|
748
|
+
}
|
749
|
+
|
750
|
+
/// Chooses a pivot in `v` and returns the index and `true` if the slice is likely already sorted.
|
751
|
+
///
|
752
|
+
/// Elements in `v` might be reordered in the process.
|
753
|
+
fn choose_pivot<T, F>(v: &mut [T], is_less: &F) -> (usize, bool)
|
754
|
+
where
|
755
|
+
F: Fn(&T, &T) -> bool,
|
756
|
+
{
|
757
|
+
// Minimum length to choose the median-of-medians method.
|
758
|
+
// Shorter slices use the simple median-of-three method.
|
759
|
+
const SHORTEST_MEDIAN_OF_MEDIANS: usize = 50;
|
760
|
+
// Maximum number of swaps that can be performed in this function.
|
761
|
+
const MAX_SWAPS: usize = 4 * 3;
|
762
|
+
|
763
|
+
let len = v.len();
|
764
|
+
|
765
|
+
// Three indices near which we are going to choose a pivot.
|
766
|
+
#[allow(clippy::identity_op)]
|
767
|
+
let mut a = len / 4 * 1;
|
768
|
+
let mut b = len / 4 * 2;
|
769
|
+
let mut c = len / 4 * 3;
|
770
|
+
|
771
|
+
// Counts the total number of swaps we are about to perform while sorting indices.
|
772
|
+
let mut swaps = 0;
|
773
|
+
|
774
|
+
if len >= 8 {
|
775
|
+
// Swaps indices so that `v[a] <= v[b]`.
|
776
|
+
// SAFETY: `len >= 8` so there are at least two elements in the neighborhoods of
|
777
|
+
// `a`, `b` and `c`. This means the three calls to `sort_adjacent` result in
|
778
|
+
// corresponding calls to `sort3` with valid 3-item neighborhoods around each
|
779
|
+
// pointer, which in turn means the calls to `sort2` are done with valid
|
780
|
+
// references. Thus the `v.get_unchecked` calls are safe, as is the `ptr::swap`
|
781
|
+
// call.
|
782
|
+
let mut sort2 = |a: &mut usize, b: &mut usize| unsafe {
|
783
|
+
if is_less(v.get_unchecked(*b), v.get_unchecked(*a)) {
|
784
|
+
ptr::swap(a, b);
|
785
|
+
swaps += 1;
|
786
|
+
}
|
787
|
+
};
|
788
|
+
|
789
|
+
// Swaps indices so that `v[a] <= v[b] <= v[c]`.
|
790
|
+
let mut sort3 = |a: &mut usize, b: &mut usize, c: &mut usize| {
|
791
|
+
sort2(a, b);
|
792
|
+
sort2(b, c);
|
793
|
+
sort2(a, b);
|
794
|
+
};
|
795
|
+
|
796
|
+
if len >= SHORTEST_MEDIAN_OF_MEDIANS {
|
797
|
+
// Finds the median of `v[a - 1], v[a], v[a + 1]` and stores the index into `a`.
|
798
|
+
let mut sort_adjacent = |a: &mut usize| {
|
799
|
+
let tmp = *a;
|
800
|
+
sort3(&mut (tmp - 1), a, &mut (tmp + 1));
|
801
|
+
};
|
802
|
+
|
803
|
+
// Find medians in the neighborhoods of `a`, `b`, and `c`.
|
804
|
+
sort_adjacent(&mut a);
|
805
|
+
sort_adjacent(&mut b);
|
806
|
+
sort_adjacent(&mut c);
|
807
|
+
}
|
808
|
+
|
809
|
+
// Find the median among `a`, `b`, and `c`.
|
810
|
+
sort3(&mut a, &mut b, &mut c);
|
811
|
+
}
|
812
|
+
|
813
|
+
if swaps < MAX_SWAPS {
|
814
|
+
(b, swaps == 0)
|
815
|
+
} else {
|
816
|
+
// The maximum number of swaps was performed. Chances are the slice is descending or mostly
|
817
|
+
// descending, so reversing will probably help sort it faster.
|
818
|
+
v.reverse();
|
819
|
+
(len - 1 - b, true)
|
820
|
+
}
|
821
|
+
}
|
822
|
+
|
823
|
+
/// Sorts `v` recursively.
|
824
|
+
///
|
825
|
+
/// If the slice had a predecessor in the original array, it is specified as `pred`.
|
826
|
+
///
|
827
|
+
/// `limit` is the number of allowed imbalanced partitions before switching to `heapsort`. If zero,
|
828
|
+
/// this function will immediately switch to heapsort.
|
829
|
+
fn recurse<'a, T, F>(mut v: &'a mut [T], is_less: &F, mut pred: Option<&'a mut T>, mut limit: u32)
|
830
|
+
where
|
831
|
+
T: Send,
|
832
|
+
F: Fn(&T, &T) -> bool + Sync,
|
833
|
+
{
|
834
|
+
// Slices of up to this length get sorted using insertion sort.
|
835
|
+
const MAX_INSERTION: usize = 20;
|
836
|
+
|
837
|
+
// If both partitions are up to this length, we continue sequentially. This number is as small
|
838
|
+
// as possible but so that the overhead of Rayon's task scheduling is still negligible.
|
839
|
+
const MAX_SEQUENTIAL: usize = 2000;
|
840
|
+
|
841
|
+
// True if the last partitioning was reasonably balanced.
|
842
|
+
let mut was_balanced = true;
|
843
|
+
// True if the last partitioning didn't shuffle elements (the slice was already partitioned).
|
844
|
+
let mut was_partitioned = true;
|
845
|
+
|
846
|
+
loop {
|
847
|
+
let len = v.len();
|
848
|
+
|
849
|
+
// Very short slices get sorted using insertion sort.
|
850
|
+
if len <= MAX_INSERTION {
|
851
|
+
if len >= 2 {
|
852
|
+
insertion_sort_shift_left(v, 1, is_less);
|
853
|
+
}
|
854
|
+
return;
|
855
|
+
}
|
856
|
+
|
857
|
+
// If too many bad pivot choices were made, simply fall back to heapsort in order to
|
858
|
+
// guarantee `O(n * log(n))` worst-case.
|
859
|
+
if limit == 0 {
|
860
|
+
heapsort(v, is_less);
|
861
|
+
return;
|
862
|
+
}
|
863
|
+
|
864
|
+
// If the last partitioning was imbalanced, try breaking patterns in the slice by shuffling
|
865
|
+
// some elements around. Hopefully we'll choose a better pivot this time.
|
866
|
+
if !was_balanced {
|
867
|
+
break_patterns(v);
|
868
|
+
limit -= 1;
|
869
|
+
}
|
870
|
+
|
871
|
+
// Choose a pivot and try guessing whether the slice is already sorted.
|
872
|
+
let (pivot, likely_sorted) = choose_pivot(v, is_less);
|
873
|
+
|
874
|
+
// If the last partitioning was decently balanced and didn't shuffle elements, and if pivot
|
875
|
+
// selection predicts the slice is likely already sorted...
|
876
|
+
if was_balanced && was_partitioned && likely_sorted {
|
877
|
+
// Try identifying several out-of-order elements and shifting them to correct
|
878
|
+
// positions. If the slice ends up being completely sorted, we're done.
|
879
|
+
if partial_insertion_sort(v, is_less) {
|
880
|
+
return;
|
881
|
+
}
|
882
|
+
}
|
883
|
+
|
884
|
+
// If the chosen pivot is equal to the predecessor, then it's the smallest element in the
|
885
|
+
// slice. Partition the slice into elements equal to and elements greater than the pivot.
|
886
|
+
// This case is usually hit when the slice contains many duplicate elements.
|
887
|
+
if let Some(&mut ref p) = pred {
|
888
|
+
if !is_less(p, &v[pivot]) {
|
889
|
+
let mid = partition_equal(v, pivot, is_less);
|
890
|
+
|
891
|
+
// Continue sorting elements greater than the pivot.
|
892
|
+
v = &mut v[mid..];
|
893
|
+
continue;
|
894
|
+
}
|
895
|
+
}
|
896
|
+
|
897
|
+
// Partition the slice.
|
898
|
+
let (mid, was_p) = partition(v, pivot, is_less);
|
899
|
+
was_balanced = cmp::min(mid, len - mid) >= len / 8;
|
900
|
+
was_partitioned = was_p;
|
901
|
+
|
902
|
+
// Split the slice into `left`, `pivot`, and `right`.
|
903
|
+
let (left, right) = v.split_at_mut(mid);
|
904
|
+
let (pivot, right) = right.split_at_mut(1);
|
905
|
+
let pivot = &mut pivot[0];
|
906
|
+
|
907
|
+
if Ord::max(left.len(), right.len()) <= MAX_SEQUENTIAL {
|
908
|
+
// Recurse into the shorter side only in order to minimize the total number of recursive
|
909
|
+
// calls and consume less stack space. Then just continue with the longer side (this is
|
910
|
+
// akin to tail recursion).
|
911
|
+
if left.len() < right.len() {
|
912
|
+
recurse(left, is_less, pred, limit);
|
913
|
+
v = right;
|
914
|
+
pred = Some(pivot);
|
915
|
+
} else {
|
916
|
+
recurse(right, is_less, Some(pivot), limit);
|
917
|
+
v = left;
|
918
|
+
}
|
919
|
+
} else {
|
920
|
+
// Sort the left and right half in parallel.
|
921
|
+
rayon_core::join(
|
922
|
+
|| recurse(left, is_less, pred, limit),
|
923
|
+
|| recurse(right, is_less, Some(pivot), limit),
|
924
|
+
);
|
925
|
+
break;
|
926
|
+
}
|
927
|
+
}
|
928
|
+
}
|
929
|
+
|
930
|
+
/// Sorts `v` using pattern-defeating quicksort in parallel.
|
931
|
+
///
|
932
|
+
/// The algorithm is unstable, in-place, and *O*(*n* \* log(*n*)) worst-case.
|
933
|
+
pub(super) fn par_quicksort<T, F>(v: &mut [T], is_less: F)
|
934
|
+
where
|
935
|
+
T: Send,
|
936
|
+
F: Fn(&T, &T) -> bool + Sync,
|
937
|
+
{
|
938
|
+
// Sorting has no meaningful behavior on zero-sized types.
|
939
|
+
if size_of::<T>() == 0 {
|
940
|
+
return;
|
941
|
+
}
|
942
|
+
|
943
|
+
// Limit the number of imbalanced partitions to `floor(log2(len)) + 1`.
|
944
|
+
let limit = usize::BITS - v.len().leading_zeros();
|
945
|
+
|
946
|
+
recurse(v, &is_less, None, limit);
|
947
|
+
}
|
948
|
+
|
949
|
+
/// Merges non-decreasing runs `v[..mid]` and `v[mid..]` using `buf` as temporary storage, and
|
950
|
+
/// stores the result into `v[..]`.
|
951
|
+
///
|
952
|
+
/// # Safety
|
953
|
+
///
|
954
|
+
/// The two slices must be non-empty and `mid` must be in bounds. Buffer `buf` must be long enough
|
955
|
+
/// to hold a copy of the shorter slice. Also, `T` must not be a zero-sized type.
|
956
|
+
unsafe fn merge<T, F>(v: &mut [T], mid: usize, buf: *mut T, is_less: &F)
|
957
|
+
where
|
958
|
+
F: Fn(&T, &T) -> bool,
|
959
|
+
{
|
960
|
+
let len = v.len();
|
961
|
+
let v = v.as_mut_ptr();
|
962
|
+
|
963
|
+
// SAFETY: mid and len must be in-bounds of v.
|
964
|
+
let (v_mid, v_end) = unsafe { (v.add(mid), v.add(len)) };
|
965
|
+
|
966
|
+
// The merge process first copies the shorter run into `buf`. Then it traces the newly copied
|
967
|
+
// run and the longer run forwards (or backwards), comparing their next unconsumed elements and
|
968
|
+
// copying the lesser (or greater) one into `v`.
|
969
|
+
//
|
970
|
+
// As soon as the shorter run is fully consumed, the process is done. If the longer run gets
|
971
|
+
// consumed first, then we must copy whatever is left of the shorter run into the remaining
|
972
|
+
// hole in `v`.
|
973
|
+
//
|
974
|
+
// Intermediate state of the process is always tracked by `hole`, which serves two purposes:
|
975
|
+
// 1. Protects integrity of `v` from panics in `is_less`.
|
976
|
+
// 2. Fills the remaining hole in `v` if the longer run gets consumed first.
|
977
|
+
//
|
978
|
+
// Panic safety:
|
979
|
+
//
|
980
|
+
// If `is_less` panics at any point during the process, `hole` will get dropped and fill the
|
981
|
+
// hole in `v` with the unconsumed range in `buf`, thus ensuring that `v` still holds every
|
982
|
+
// object it initially held exactly once.
|
983
|
+
let mut hole;
|
984
|
+
|
985
|
+
if mid <= len - mid {
|
986
|
+
// The left run is shorter.
|
987
|
+
|
988
|
+
// SAFETY: buf must have enough capacity for `v[..mid]`.
|
989
|
+
unsafe {
|
990
|
+
ptr::copy_nonoverlapping(v, buf, mid);
|
991
|
+
hole = MergeHole {
|
992
|
+
start: buf,
|
993
|
+
end: buf.add(mid),
|
994
|
+
dest: v,
|
995
|
+
};
|
996
|
+
}
|
997
|
+
|
998
|
+
// Initially, these pointers point to the beginnings of their arrays.
|
999
|
+
let left = &mut hole.start;
|
1000
|
+
let mut right = v_mid;
|
1001
|
+
let out = &mut hole.dest;
|
1002
|
+
|
1003
|
+
while *left < hole.end && right < v_end {
|
1004
|
+
// Consume the lesser side.
|
1005
|
+
// If equal, prefer the left run to maintain stability.
|
1006
|
+
|
1007
|
+
// SAFETY: left and right must be valid and part of v same for out.
|
1008
|
+
unsafe {
|
1009
|
+
let is_l = is_less(&*right, &**left);
|
1010
|
+
let to_copy = if is_l { right } else { *left };
|
1011
|
+
ptr::copy_nonoverlapping(to_copy, *out, 1);
|
1012
|
+
*out = out.add(1);
|
1013
|
+
right = right.add(is_l as usize);
|
1014
|
+
*left = left.add(!is_l as usize);
|
1015
|
+
}
|
1016
|
+
}
|
1017
|
+
} else {
|
1018
|
+
// The right run is shorter.
|
1019
|
+
|
1020
|
+
// SAFETY: buf must have enough capacity for `v[mid..]`.
|
1021
|
+
unsafe {
|
1022
|
+
ptr::copy_nonoverlapping(v_mid, buf, len - mid);
|
1023
|
+
hole = MergeHole {
|
1024
|
+
start: buf,
|
1025
|
+
end: buf.add(len - mid),
|
1026
|
+
dest: v_mid,
|
1027
|
+
};
|
1028
|
+
}
|
1029
|
+
|
1030
|
+
// Initially, these pointers point past the ends of their arrays.
|
1031
|
+
let left = &mut hole.dest;
|
1032
|
+
let right = &mut hole.end;
|
1033
|
+
let mut out = v_end;
|
1034
|
+
|
1035
|
+
while v < *left && buf < *right {
|
1036
|
+
// Consume the greater side.
|
1037
|
+
// If equal, prefer the right run to maintain stability.
|
1038
|
+
|
1039
|
+
// SAFETY: left and right must be valid and part of v same for out.
|
1040
|
+
unsafe {
|
1041
|
+
let is_l = is_less(&*right.sub(1), &*left.sub(1));
|
1042
|
+
*left = left.sub(is_l as usize);
|
1043
|
+
*right = right.sub(!is_l as usize);
|
1044
|
+
let to_copy = if is_l { *left } else { *right };
|
1045
|
+
out = out.sub(1);
|
1046
|
+
ptr::copy_nonoverlapping(to_copy, out, 1);
|
1047
|
+
}
|
1048
|
+
}
|
1049
|
+
}
|
1050
|
+
// Finally, `hole` gets dropped. If the shorter run was not fully consumed, whatever remains of
|
1051
|
+
// it will now be copied into the hole in `v`.
|
1052
|
+
}
|
1053
|
+
|
1054
|
+
// When dropped, copies the range `start..end` into `dest..`.
|
1055
|
+
struct MergeHole<T> {
|
1056
|
+
start: *mut T,
|
1057
|
+
end: *mut T,
|
1058
|
+
dest: *mut T,
|
1059
|
+
}
|
1060
|
+
|
1061
|
+
impl<T> Drop for MergeHole<T> {
|
1062
|
+
fn drop(&mut self) {
|
1063
|
+
// SAFETY: `T` is not a zero-sized type, and these are pointers into a slice's elements.
|
1064
|
+
unsafe {
|
1065
|
+
let len = self.end.offset_from(self.start) as usize;
|
1066
|
+
ptr::copy_nonoverlapping(self.start, self.dest, len);
|
1067
|
+
}
|
1068
|
+
}
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
/// The result of merge sort.
|
1072
|
+
#[must_use]
|
1073
|
+
#[derive(Clone, Copy, PartialEq, Eq)]
|
1074
|
+
enum MergeSortResult {
|
1075
|
+
/// The slice has already been sorted.
|
1076
|
+
NonDescending,
|
1077
|
+
/// The slice has been descending and therefore it was left intact.
|
1078
|
+
Descending,
|
1079
|
+
/// The slice was sorted.
|
1080
|
+
Sorted,
|
1081
|
+
}
|
1082
|
+
|
1083
|
+
/// This merge sort borrows some (but not all) ideas from TimSort, which used to be described in
|
1084
|
+
/// detail [here](https://github.com/python/cpython/blob/main/Objects/listsort.txt). However Python
|
1085
|
+
/// has switched to a Powersort based implementation.
|
1086
|
+
///
|
1087
|
+
/// The algorithm identifies strictly descending and non-descending subsequences, which are called
|
1088
|
+
/// natural runs. There is a stack of pending runs yet to be merged. Each newly found run is pushed
|
1089
|
+
/// onto the stack, and then some pairs of adjacent runs are merged until these two invariants are
|
1090
|
+
/// satisfied:
|
1091
|
+
///
|
1092
|
+
/// 1. for every `i` in `1..runs.len()`: `runs[i - 1].len > runs[i].len`
|
1093
|
+
/// 2. for every `i` in `2..runs.len()`: `runs[i - 2].len > runs[i - 1].len + runs[i].len`
|
1094
|
+
///
|
1095
|
+
/// The invariants ensure that the total running time is *O*(*n* \* log(*n*)) worst-case.
|
1096
|
+
///
|
1097
|
+
/// # Safety
|
1098
|
+
///
|
1099
|
+
/// The argument `buf` is used as a temporary buffer and must hold at least `v.len() / 2`.
|
1100
|
+
unsafe fn merge_sort<T, CmpF>(v: &mut [T], buf_ptr: *mut T, is_less: &CmpF) -> MergeSortResult
|
1101
|
+
where
|
1102
|
+
CmpF: Fn(&T, &T) -> bool,
|
1103
|
+
{
|
1104
|
+
// The caller should have already checked that.
|
1105
|
+
debug_assert_ne!(size_of::<T>(), 0);
|
1106
|
+
|
1107
|
+
let len = v.len();
|
1108
|
+
|
1109
|
+
let mut runs = Vec::new();
|
1110
|
+
|
1111
|
+
let mut end = 0;
|
1112
|
+
let mut start = 0;
|
1113
|
+
|
1114
|
+
// Scan forward. Memory pre-fetching prefers forward scanning vs backwards scanning, and the
|
1115
|
+
// code-gen is usually better. For the most sensitive types such as integers, these are merged
|
1116
|
+
// bidirectionally at once. So there is no benefit in scanning backwards.
|
1117
|
+
while end < len {
|
1118
|
+
let (streak_end, was_reversed) = find_streak(&v[start..], is_less);
|
1119
|
+
end += streak_end;
|
1120
|
+
if start == 0 && end == len {
|
1121
|
+
return if was_reversed {
|
1122
|
+
MergeSortResult::Descending
|
1123
|
+
} else {
|
1124
|
+
MergeSortResult::NonDescending
|
1125
|
+
};
|
1126
|
+
}
|
1127
|
+
if was_reversed {
|
1128
|
+
v[start..end].reverse();
|
1129
|
+
}
|
1130
|
+
|
1131
|
+
// Insert some more elements into the run if it's too short. Insertion sort is faster than
|
1132
|
+
// merge sort on short sequences, so this significantly improves performance.
|
1133
|
+
end = provide_sorted_batch(v, start, end, is_less);
|
1134
|
+
|
1135
|
+
// Push this run onto the stack.
|
1136
|
+
runs.push(TimSortRun {
|
1137
|
+
start,
|
1138
|
+
len: end - start,
|
1139
|
+
});
|
1140
|
+
start = end;
|
1141
|
+
|
1142
|
+
// Merge some pairs of adjacent runs to satisfy the invariants.
|
1143
|
+
while let Some(r) = collapse(runs.as_slice(), len) {
|
1144
|
+
let left = runs[r];
|
1145
|
+
let right = runs[r + 1];
|
1146
|
+
let merge_slice = &mut v[left.start..right.start + right.len];
|
1147
|
+
// SAFETY: `buf_ptr` must hold enough capacity for the shorter of the two sides, and
|
1148
|
+
// neither side may be on length 0.
|
1149
|
+
unsafe {
|
1150
|
+
merge(merge_slice, left.len, buf_ptr, is_less);
|
1151
|
+
}
|
1152
|
+
runs[r + 1] = TimSortRun {
|
1153
|
+
start: left.start,
|
1154
|
+
len: left.len + right.len,
|
1155
|
+
};
|
1156
|
+
runs.remove(r);
|
1157
|
+
}
|
1158
|
+
}
|
1159
|
+
|
1160
|
+
// Finally, exactly one run must remain in the stack.
|
1161
|
+
debug_assert!(runs.len() == 1 && runs[0].start == 0 && runs[0].len == len);
|
1162
|
+
|
1163
|
+
// The original order of the slice was neither non-descending nor descending.
|
1164
|
+
return MergeSortResult::Sorted;
|
1165
|
+
|
1166
|
+
// Examines the stack of runs and identifies the next pair of runs to merge. More specifically,
|
1167
|
+
// if `Some(r)` is returned, that means `runs[r]` and `runs[r + 1]` must be merged next. If the
|
1168
|
+
// algorithm should continue building a new run instead, `None` is returned.
|
1169
|
+
//
|
1170
|
+
// TimSort is infamous for its buggy implementations, as described here:
|
1171
|
+
// http://envisage-project.eu/timsort-specification-and-verification/
|
1172
|
+
//
|
1173
|
+
// The gist of the story is: we must enforce the invariants on the top four runs on the stack.
|
1174
|
+
// Enforcing them on just top three is not sufficient to ensure that the invariants will still
|
1175
|
+
// hold for *all* runs in the stack.
|
1176
|
+
//
|
1177
|
+
// This function correctly checks invariants for the top four runs. Additionally, if the top
|
1178
|
+
// run starts at index 0, it will always demand a merge operation until the stack is fully
|
1179
|
+
// collapsed, in order to complete the sort.
|
1180
|
+
#[inline]
|
1181
|
+
fn collapse(runs: &[TimSortRun], stop: usize) -> Option<usize> {
|
1182
|
+
let n = runs.len();
|
1183
|
+
if n >= 2
|
1184
|
+
&& (runs[n - 1].start + runs[n - 1].len == stop
|
1185
|
+
|| runs[n - 2].len <= runs[n - 1].len
|
1186
|
+
|| (n >= 3 && runs[n - 3].len <= runs[n - 2].len + runs[n - 1].len)
|
1187
|
+
|| (n >= 4 && runs[n - 4].len <= runs[n - 3].len + runs[n - 2].len))
|
1188
|
+
{
|
1189
|
+
if n >= 3 && runs[n - 3].len < runs[n - 1].len {
|
1190
|
+
Some(n - 3)
|
1191
|
+
} else {
|
1192
|
+
Some(n - 2)
|
1193
|
+
}
|
1194
|
+
} else {
|
1195
|
+
None
|
1196
|
+
}
|
1197
|
+
}
|
1198
|
+
}
|
1199
|
+
|
1200
|
+
/// Internal type used by merge_sort.
|
1201
|
+
#[derive(Clone, Copy, Debug)]
|
1202
|
+
struct TimSortRun {
|
1203
|
+
len: usize,
|
1204
|
+
start: usize,
|
1205
|
+
}
|
1206
|
+
|
1207
|
+
/// Takes a range as denoted by start and end, that is already sorted and extends it to the right if
|
1208
|
+
/// necessary with sorts optimized for smaller ranges such as insertion sort.
|
1209
|
+
fn provide_sorted_batch<T, F>(v: &mut [T], start: usize, mut end: usize, is_less: &F) -> usize
|
1210
|
+
where
|
1211
|
+
F: Fn(&T, &T) -> bool,
|
1212
|
+
{
|
1213
|
+
let len = v.len();
|
1214
|
+
assert!(end >= start && end <= len);
|
1215
|
+
|
1216
|
+
// This value is a balance between least comparisons and best performance, as
|
1217
|
+
// influenced by for example cache locality.
|
1218
|
+
const MIN_INSERTION_RUN: usize = 10;
|
1219
|
+
|
1220
|
+
// Insert some more elements into the run if it's too short. Insertion sort is faster than
|
1221
|
+
// merge sort on short sequences, so this significantly improves performance.
|
1222
|
+
let start_end_diff = end - start;
|
1223
|
+
|
1224
|
+
if start_end_diff < MIN_INSERTION_RUN && end < len {
|
1225
|
+
// v[start_found..end] are elements that are already sorted in the input. We want to extend
|
1226
|
+
// the sorted region to the left, so we push up MIN_INSERTION_RUN - 1 to the right. Which is
|
1227
|
+
// more efficient that trying to push those already sorted elements to the left.
|
1228
|
+
end = cmp::min(start + MIN_INSERTION_RUN, len);
|
1229
|
+
let presorted_start = cmp::max(start_end_diff, 1);
|
1230
|
+
|
1231
|
+
insertion_sort_shift_left(&mut v[start..end], presorted_start, is_less);
|
1232
|
+
}
|
1233
|
+
|
1234
|
+
end
|
1235
|
+
}
|
1236
|
+
|
1237
|
+
/// Finds a streak of presorted elements starting at the beginning of the slice. Returns the first
|
1238
|
+
/// value that is not part of said streak, and a bool denoting whether the streak was reversed.
|
1239
|
+
/// Streaks can be increasing or decreasing.
|
1240
|
+
fn find_streak<T, F>(v: &[T], is_less: &F) -> (usize, bool)
|
1241
|
+
where
|
1242
|
+
F: Fn(&T, &T) -> bool,
|
1243
|
+
{
|
1244
|
+
let len = v.len();
|
1245
|
+
|
1246
|
+
if len < 2 {
|
1247
|
+
return (len, false);
|
1248
|
+
}
|
1249
|
+
|
1250
|
+
let mut end = 2;
|
1251
|
+
|
1252
|
+
// SAFETY: See below specific.
|
1253
|
+
unsafe {
|
1254
|
+
// SAFETY: We checked that len >= 2, so 0 and 1 are valid indices.
|
1255
|
+
let assume_reverse = is_less(v.get_unchecked(1), v.get_unchecked(0));
|
1256
|
+
|
1257
|
+
// SAFETY: We know end >= 2 and check end < len.
|
1258
|
+
// From that follows that accessing v at end and end - 1 is safe.
|
1259
|
+
if assume_reverse {
|
1260
|
+
while end < len && is_less(v.get_unchecked(end), v.get_unchecked(end - 1)) {
|
1261
|
+
end += 1;
|
1262
|
+
}
|
1263
|
+
|
1264
|
+
(end, true)
|
1265
|
+
} else {
|
1266
|
+
while end < len && !is_less(v.get_unchecked(end), v.get_unchecked(end - 1)) {
|
1267
|
+
end += 1;
|
1268
|
+
}
|
1269
|
+
(end, false)
|
1270
|
+
}
|
1271
|
+
}
|
1272
|
+
}
|
1273
|
+
|
1274
|
+
////////////////////////////////////////////////////////////////////////////
|
1275
|
+
// Everything above this line is copied from `core::slice::sort` (with very minor tweaks).
|
1276
|
+
// Everything below this line is custom parallelization for rayon.
|
1277
|
+
////////////////////////////////////////////////////////////////////////////
|
1278
|
+
|
1279
|
+
/// Splits two sorted slices so that they can be merged in parallel.
|
1280
|
+
///
|
1281
|
+
/// Returns two indices `(a, b)` so that slices `left[..a]` and `right[..b]` come before
|
1282
|
+
/// `left[a..]` and `right[b..]`.
|
1283
|
+
fn split_for_merge<T, F>(left: &[T], right: &[T], is_less: &F) -> (usize, usize)
|
1284
|
+
where
|
1285
|
+
F: Fn(&T, &T) -> bool,
|
1286
|
+
{
|
1287
|
+
let left_len = left.len();
|
1288
|
+
let right_len = right.len();
|
1289
|
+
|
1290
|
+
if left_len >= right_len {
|
1291
|
+
let left_mid = left_len / 2;
|
1292
|
+
|
1293
|
+
// Find the first element in `right` that is greater than or equal to `left[left_mid]`.
|
1294
|
+
let mut a = 0;
|
1295
|
+
let mut b = right_len;
|
1296
|
+
while a < b {
|
1297
|
+
let m = a + (b - a) / 2;
|
1298
|
+
if is_less(&right[m], &left[left_mid]) {
|
1299
|
+
a = m + 1;
|
1300
|
+
} else {
|
1301
|
+
b = m;
|
1302
|
+
}
|
1303
|
+
}
|
1304
|
+
|
1305
|
+
(left_mid, a)
|
1306
|
+
} else {
|
1307
|
+
let right_mid = right_len / 2;
|
1308
|
+
|
1309
|
+
// Find the first element in `left` that is greater than `right[right_mid]`.
|
1310
|
+
let mut a = 0;
|
1311
|
+
let mut b = left_len;
|
1312
|
+
while a < b {
|
1313
|
+
let m = a + (b - a) / 2;
|
1314
|
+
if is_less(&right[right_mid], &left[m]) {
|
1315
|
+
b = m;
|
1316
|
+
} else {
|
1317
|
+
a = m + 1;
|
1318
|
+
}
|
1319
|
+
}
|
1320
|
+
|
1321
|
+
(a, right_mid)
|
1322
|
+
}
|
1323
|
+
}
|
1324
|
+
|
1325
|
+
/// Merges slices `left` and `right` in parallel and stores the result into `dest`.
|
1326
|
+
///
|
1327
|
+
/// # Safety
|
1328
|
+
///
|
1329
|
+
/// The `dest` pointer must have enough space to store the result.
|
1330
|
+
///
|
1331
|
+
/// Even if `is_less` panics at any point during the merge process, this function will fully copy
|
1332
|
+
/// all elements from `left` and `right` into `dest` (not necessarily in sorted order).
|
1333
|
+
unsafe fn par_merge<T, F>(left: &mut [T], right: &mut [T], dest: *mut T, is_less: &F)
|
1334
|
+
where
|
1335
|
+
T: Send,
|
1336
|
+
F: Fn(&T, &T) -> bool + Sync,
|
1337
|
+
{
|
1338
|
+
// Slices whose lengths sum up to this value are merged sequentially. This number is slightly
|
1339
|
+
// larger than `CHUNK_LENGTH`, and the reason is that merging is faster than merge sorting, so
|
1340
|
+
// merging needs a bit coarser granularity in order to hide the overhead of Rayon's task
|
1341
|
+
// scheduling.
|
1342
|
+
const MAX_SEQUENTIAL: usize = 5000;
|
1343
|
+
|
1344
|
+
let left_len = left.len();
|
1345
|
+
let right_len = right.len();
|
1346
|
+
|
1347
|
+
// Intermediate state of the merge process, which serves two purposes:
|
1348
|
+
// 1. Protects integrity of `dest` from panics in `is_less`.
|
1349
|
+
// 2. Copies the remaining elements as soon as one of the two sides is exhausted.
|
1350
|
+
//
|
1351
|
+
// Panic safety:
|
1352
|
+
//
|
1353
|
+
// If `is_less` panics at any point during the merge process, `s` will get dropped and copy the
|
1354
|
+
// remaining parts of `left` and `right` into `dest`.
|
1355
|
+
let mut s = State {
|
1356
|
+
left_start: left.as_mut_ptr(),
|
1357
|
+
left_end: left.as_mut_ptr().add(left_len),
|
1358
|
+
right_start: right.as_mut_ptr(),
|
1359
|
+
right_end: right.as_mut_ptr().add(right_len),
|
1360
|
+
dest,
|
1361
|
+
};
|
1362
|
+
|
1363
|
+
if left_len == 0 || right_len == 0 || left_len + right_len < MAX_SEQUENTIAL {
|
1364
|
+
while s.left_start < s.left_end && s.right_start < s.right_end {
|
1365
|
+
// Consume the lesser side.
|
1366
|
+
// If equal, prefer the left run to maintain stability.
|
1367
|
+
let is_l = is_less(&*s.right_start, &*s.left_start);
|
1368
|
+
let to_copy = if is_l { s.right_start } else { s.left_start };
|
1369
|
+
ptr::copy_nonoverlapping(to_copy, s.dest, 1);
|
1370
|
+
s.dest = s.dest.add(1);
|
1371
|
+
s.right_start = s.right_start.add(is_l as usize);
|
1372
|
+
s.left_start = s.left_start.add(!is_l as usize);
|
1373
|
+
}
|
1374
|
+
} else {
|
1375
|
+
// Function `split_for_merge` might panic. If that happens, `s` will get destructed and copy
|
1376
|
+
// the whole `left` and `right` into `dest`.
|
1377
|
+
let (left_mid, right_mid) = split_for_merge(left, right, is_less);
|
1378
|
+
let (left_l, left_r) = left.split_at_mut(left_mid);
|
1379
|
+
let (right_l, right_r) = right.split_at_mut(right_mid);
|
1380
|
+
|
1381
|
+
// Prevent the destructor of `s` from running. Rayon will ensure that both calls to
|
1382
|
+
// `par_merge` happen. If one of the two calls panics, they will ensure that elements still
|
1383
|
+
// get copied into `dest_left` and `dest_right``.
|
1384
|
+
mem::forget(s);
|
1385
|
+
|
1386
|
+
// Wrap pointers in SendPtr so that they can be sent to another thread
|
1387
|
+
// See the documentation of SendPtr for a full explanation
|
1388
|
+
let dest_l = SendPtr(dest);
|
1389
|
+
let dest_r = SendPtr(dest.add(left_l.len() + right_l.len()));
|
1390
|
+
rayon_core::join(
|
1391
|
+
move || par_merge(left_l, right_l, dest_l.get(), is_less),
|
1392
|
+
move || par_merge(left_r, right_r, dest_r.get(), is_less),
|
1393
|
+
);
|
1394
|
+
}
|
1395
|
+
// Finally, `s` gets dropped if we used sequential merge, thus copying the remaining elements
|
1396
|
+
// all at once.
|
1397
|
+
|
1398
|
+
// When dropped, copies arrays `left_start..left_end` and `right_start..right_end` into `dest`,
|
1399
|
+
// in that order.
|
1400
|
+
struct State<T> {
|
1401
|
+
left_start: *mut T,
|
1402
|
+
left_end: *mut T,
|
1403
|
+
right_start: *mut T,
|
1404
|
+
right_end: *mut T,
|
1405
|
+
dest: *mut T,
|
1406
|
+
}
|
1407
|
+
|
1408
|
+
impl<T> Drop for State<T> {
|
1409
|
+
fn drop(&mut self) {
|
1410
|
+
// Copy array `left`, followed by `right`.
|
1411
|
+
unsafe {
|
1412
|
+
let left_len = self.left_end.offset_from(self.left_start) as usize;
|
1413
|
+
ptr::copy_nonoverlapping(self.left_start, self.dest, left_len);
|
1414
|
+
self.dest = self.dest.add(left_len);
|
1415
|
+
|
1416
|
+
let right_len = self.right_end.offset_from(self.right_start) as usize;
|
1417
|
+
ptr::copy_nonoverlapping(self.right_start, self.dest, right_len);
|
1418
|
+
}
|
1419
|
+
}
|
1420
|
+
}
|
1421
|
+
}
|
1422
|
+
|
1423
|
+
/// Recursively merges pre-sorted chunks inside `v`.
|
1424
|
+
///
|
1425
|
+
/// Chunks of `v` are stored in `chunks` as intervals (inclusive left and exclusive right bound).
|
1426
|
+
/// Argument `buf` is an auxiliary buffer that will be used during the procedure.
|
1427
|
+
/// If `into_buf` is true, the result will be stored into `buf`, otherwise it will be in `v`.
|
1428
|
+
///
|
1429
|
+
/// # Safety
|
1430
|
+
///
|
1431
|
+
/// The number of chunks must be positive and they must be adjacent: the right bound of each chunk
|
1432
|
+
/// must equal the left bound of the following chunk.
|
1433
|
+
///
|
1434
|
+
/// The buffer must be at least as long as `v`.
|
1435
|
+
unsafe fn merge_recurse<T, F>(
|
1436
|
+
v: *mut T,
|
1437
|
+
buf: *mut T,
|
1438
|
+
chunks: &[(usize, usize)],
|
1439
|
+
into_buf: bool,
|
1440
|
+
is_less: &F,
|
1441
|
+
) where
|
1442
|
+
T: Send,
|
1443
|
+
F: Fn(&T, &T) -> bool + Sync,
|
1444
|
+
{
|
1445
|
+
let len = chunks.len();
|
1446
|
+
debug_assert!(len > 0);
|
1447
|
+
|
1448
|
+
// Base case of the algorithm.
|
1449
|
+
// If only one chunk is remaining, there's no more work to split and merge.
|
1450
|
+
if len == 1 {
|
1451
|
+
if into_buf {
|
1452
|
+
// Copy the chunk from `v` into `buf`.
|
1453
|
+
let (start, end) = chunks[0];
|
1454
|
+
let src = v.add(start);
|
1455
|
+
let dest = buf.add(start);
|
1456
|
+
ptr::copy_nonoverlapping(src, dest, end - start);
|
1457
|
+
}
|
1458
|
+
return;
|
1459
|
+
}
|
1460
|
+
|
1461
|
+
// Split the chunks into two halves.
|
1462
|
+
let (start, _) = chunks[0];
|
1463
|
+
let (mid, _) = chunks[len / 2];
|
1464
|
+
let (_, end) = chunks[len - 1];
|
1465
|
+
let (left, right) = chunks.split_at(len / 2);
|
1466
|
+
|
1467
|
+
// After recursive calls finish we'll have to merge chunks `(start, mid)` and `(mid, end)` from
|
1468
|
+
// `src` into `dest`. If the current invocation has to store the result into `buf`, we'll
|
1469
|
+
// merge chunks from `v` into `buf`, and vice versa.
|
1470
|
+
//
|
1471
|
+
// Recursive calls flip `into_buf` at each level of recursion. More concretely, `par_merge`
|
1472
|
+
// merges chunks from `buf` into `v` at the first level, from `v` into `buf` at the second
|
1473
|
+
// level etc.
|
1474
|
+
let (src, dest) = if into_buf { (v, buf) } else { (buf, v) };
|
1475
|
+
|
1476
|
+
// Panic safety:
|
1477
|
+
//
|
1478
|
+
// If `is_less` panics at any point during the recursive calls, the destructor of `guard` will
|
1479
|
+
// be executed, thus copying everything from `src` into `dest`. This way we ensure that all
|
1480
|
+
// chunks are in fact copied into `dest`, even if the merge process doesn't finish.
|
1481
|
+
let guard = MergeHole {
|
1482
|
+
start: src.add(start),
|
1483
|
+
end: src.add(end),
|
1484
|
+
dest: dest.add(start),
|
1485
|
+
};
|
1486
|
+
|
1487
|
+
// Wrap pointers in SendPtr so that they can be sent to another thread
|
1488
|
+
// See the documentation of SendPtr for a full explanation
|
1489
|
+
let v = SendPtr(v);
|
1490
|
+
let buf = SendPtr(buf);
|
1491
|
+
rayon_core::join(
|
1492
|
+
move || merge_recurse(v.get(), buf.get(), left, !into_buf, is_less),
|
1493
|
+
move || merge_recurse(v.get(), buf.get(), right, !into_buf, is_less),
|
1494
|
+
);
|
1495
|
+
|
1496
|
+
// Everything went all right - recursive calls didn't panic.
|
1497
|
+
// Forget the guard in order to prevent its destructor from running.
|
1498
|
+
mem::forget(guard);
|
1499
|
+
|
1500
|
+
// Merge chunks `(start, mid)` and `(mid, end)` from `src` into `dest`.
|
1501
|
+
let src_left = slice::from_raw_parts_mut(src.add(start), mid - start);
|
1502
|
+
let src_right = slice::from_raw_parts_mut(src.add(mid), end - mid);
|
1503
|
+
par_merge(src_left, src_right, dest.add(start), is_less);
|
1504
|
+
}
|
1505
|
+
|
1506
|
+
/// Sorts `v` using merge sort in parallel.
|
1507
|
+
///
|
1508
|
+
/// The algorithm is stable, allocates memory, and `O(n log n)` worst-case.
|
1509
|
+
/// The allocated temporary buffer is of the same length as is `v`.
|
1510
|
+
pub(super) fn par_mergesort<T, F>(v: &mut [T], is_less: F)
|
1511
|
+
where
|
1512
|
+
T: Send,
|
1513
|
+
F: Fn(&T, &T) -> bool + Sync,
|
1514
|
+
{
|
1515
|
+
// Slices of up to this length get sorted using insertion sort in order to avoid the cost of
|
1516
|
+
// buffer allocation.
|
1517
|
+
const MAX_INSERTION: usize = 20;
|
1518
|
+
|
1519
|
+
// The length of initial chunks. This number is as small as possible but so that the overhead
|
1520
|
+
// of Rayon's task scheduling is still negligible.
|
1521
|
+
const CHUNK_LENGTH: usize = 2000;
|
1522
|
+
|
1523
|
+
// Sorting has no meaningful behavior on zero-sized types.
|
1524
|
+
if size_of::<T>() == 0 {
|
1525
|
+
return;
|
1526
|
+
}
|
1527
|
+
|
1528
|
+
let len = v.len();
|
1529
|
+
|
1530
|
+
// Short slices get sorted in-place via insertion sort to avoid allocations.
|
1531
|
+
if len <= MAX_INSERTION {
|
1532
|
+
if len >= 2 {
|
1533
|
+
insertion_sort_shift_left(v, 1, &is_less);
|
1534
|
+
}
|
1535
|
+
return;
|
1536
|
+
}
|
1537
|
+
|
1538
|
+
// Allocate a buffer to use as scratch memory. We keep the length 0 so we can keep in it
|
1539
|
+
// shallow copies of the contents of `v` without risking the dtors running on copies if
|
1540
|
+
// `is_less` panics.
|
1541
|
+
let mut buf = Vec::<T>::with_capacity(len);
|
1542
|
+
let buf = buf.as_mut_ptr();
|
1543
|
+
|
1544
|
+
// If the slice is not longer than one chunk would be, do sequential merge sort and return.
|
1545
|
+
if len <= CHUNK_LENGTH {
|
1546
|
+
let res = unsafe { merge_sort(v, buf, &is_less) };
|
1547
|
+
if res == MergeSortResult::Descending {
|
1548
|
+
v.reverse();
|
1549
|
+
}
|
1550
|
+
return;
|
1551
|
+
}
|
1552
|
+
|
1553
|
+
// Split the slice into chunks and merge sort them in parallel.
|
1554
|
+
// However, descending chunks will not be sorted - they will be simply left intact.
|
1555
|
+
let mut iter = {
|
1556
|
+
// Wrap pointer in SendPtr so that it can be sent to another thread
|
1557
|
+
// See the documentation of SendPtr for a full explanation
|
1558
|
+
let buf = SendPtr(buf);
|
1559
|
+
let is_less = &is_less;
|
1560
|
+
|
1561
|
+
v.par_chunks_mut(CHUNK_LENGTH)
|
1562
|
+
.with_max_len(1)
|
1563
|
+
.enumerate()
|
1564
|
+
.map(move |(i, chunk)| {
|
1565
|
+
let l = CHUNK_LENGTH * i;
|
1566
|
+
let r = l + chunk.len();
|
1567
|
+
unsafe {
|
1568
|
+
let buf = buf.get().add(l);
|
1569
|
+
(l, r, merge_sort(chunk, buf, is_less))
|
1570
|
+
}
|
1571
|
+
})
|
1572
|
+
.collect::<Vec<_>>()
|
1573
|
+
.into_iter()
|
1574
|
+
.peekable()
|
1575
|
+
};
|
1576
|
+
|
1577
|
+
// Now attempt to concatenate adjacent chunks that were left intact.
|
1578
|
+
let mut chunks = Vec::with_capacity(iter.len());
|
1579
|
+
|
1580
|
+
while let Some((a, mut b, res)) = iter.next() {
|
1581
|
+
// If this chunk was not modified by the sort procedure...
|
1582
|
+
if res != MergeSortResult::Sorted {
|
1583
|
+
while let Some(&(x, y, r)) = iter.peek() {
|
1584
|
+
// If the following chunk is of the same type and can be concatenated...
|
1585
|
+
if r == res && (r == MergeSortResult::Descending) == is_less(&v[x], &v[x - 1]) {
|
1586
|
+
// Concatenate them.
|
1587
|
+
b = y;
|
1588
|
+
iter.next();
|
1589
|
+
} else {
|
1590
|
+
break;
|
1591
|
+
}
|
1592
|
+
}
|
1593
|
+
}
|
1594
|
+
|
1595
|
+
// Descending chunks must be reversed.
|
1596
|
+
if res == MergeSortResult::Descending {
|
1597
|
+
v[a..b].reverse();
|
1598
|
+
}
|
1599
|
+
|
1600
|
+
chunks.push((a, b));
|
1601
|
+
}
|
1602
|
+
|
1603
|
+
// All chunks are properly sorted.
|
1604
|
+
// Now we just have to merge them together.
|
1605
|
+
unsafe {
|
1606
|
+
merge_recurse(v.as_mut_ptr(), buf, &chunks, false, &is_less);
|
1607
|
+
}
|
1608
|
+
}
|
1609
|
+
|
1610
|
+
#[cfg(test)]
|
1611
|
+
mod tests {
|
1612
|
+
use super::heapsort;
|
1613
|
+
use super::split_for_merge;
|
1614
|
+
use rand::distr::Uniform;
|
1615
|
+
use rand::{rng, Rng};
|
1616
|
+
|
1617
|
+
#[test]
|
1618
|
+
fn test_heapsort() {
|
1619
|
+
let rng = &mut rng();
|
1620
|
+
|
1621
|
+
for len in (0..25).chain(500..501) {
|
1622
|
+
for &modulus in &[5, 10, 100] {
|
1623
|
+
let dist = Uniform::new(0, modulus).unwrap();
|
1624
|
+
for _ in 0..100 {
|
1625
|
+
let v: Vec<i32> = rng.sample_iter(&dist).take(len).collect();
|
1626
|
+
|
1627
|
+
// Test heapsort using `<` operator.
|
1628
|
+
let mut tmp = v.clone();
|
1629
|
+
heapsort(&mut tmp, |a, b| a < b);
|
1630
|
+
assert!(tmp.windows(2).all(|w| w[0] <= w[1]));
|
1631
|
+
|
1632
|
+
// Test heapsort using `>` operator.
|
1633
|
+
let mut tmp = v.clone();
|
1634
|
+
heapsort(&mut tmp, |a, b| a > b);
|
1635
|
+
assert!(tmp.windows(2).all(|w| w[0] >= w[1]));
|
1636
|
+
}
|
1637
|
+
}
|
1638
|
+
}
|
1639
|
+
|
1640
|
+
// Sort using a completely random comparison function.
|
1641
|
+
// This will reorder the elements *somehow*, but won't panic.
|
1642
|
+
let mut v: Vec<_> = (0..100).collect();
|
1643
|
+
heapsort(&mut v, |_, _| rand::rng().random());
|
1644
|
+
heapsort(&mut v, |a, b| a < b);
|
1645
|
+
|
1646
|
+
for (i, &entry) in v.iter().enumerate() {
|
1647
|
+
assert_eq!(entry, i);
|
1648
|
+
}
|
1649
|
+
}
|
1650
|
+
|
1651
|
+
#[test]
|
1652
|
+
fn test_split_for_merge() {
|
1653
|
+
fn check(left: &[u32], right: &[u32]) {
|
1654
|
+
let (l, r) = split_for_merge(left, right, &|&a, &b| a < b);
|
1655
|
+
assert!(left[..l]
|
1656
|
+
.iter()
|
1657
|
+
.all(|&x| right[r..].iter().all(|&y| x <= y)));
|
1658
|
+
assert!(right[..r].iter().all(|&x| left[l..].iter().all(|&y| x < y)));
|
1659
|
+
}
|
1660
|
+
|
1661
|
+
check(&[1, 2, 2, 2, 2, 3], &[1, 2, 2, 2, 2, 3]);
|
1662
|
+
check(&[1, 2, 2, 2, 2, 3], &[]);
|
1663
|
+
check(&[], &[1, 2, 2, 2, 2, 3]);
|
1664
|
+
|
1665
|
+
let rng = &mut rng();
|
1666
|
+
|
1667
|
+
for _ in 0..100 {
|
1668
|
+
let limit: u32 = rng.random_range(1..21);
|
1669
|
+
let left_len: usize = rng.random_range(0..20);
|
1670
|
+
let right_len: usize = rng.random_range(0..20);
|
1671
|
+
|
1672
|
+
let mut left = rng
|
1673
|
+
.sample_iter(&Uniform::new(0, limit).unwrap())
|
1674
|
+
.take(left_len)
|
1675
|
+
.collect::<Vec<_>>();
|
1676
|
+
let mut right = rng
|
1677
|
+
.sample_iter(&Uniform::new(0, limit).unwrap())
|
1678
|
+
.take(right_len)
|
1679
|
+
.collect::<Vec<_>>();
|
1680
|
+
|
1681
|
+
left.sort();
|
1682
|
+
right.sort();
|
1683
|
+
check(&left, &right);
|
1684
|
+
}
|
1685
|
+
}
|
1686
|
+
}
|