rust version start

rust
Avril 4 years ago
parent f648646317
commit 5c889fed0d
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -0,0 +1,83 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "getrandom"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "libc"
version = "0.2.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c"
[[package]]
name = "ppv-lite86"
version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
[[package]]
name = "rand"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
"rand_hc",
]
[[package]]
name = "rand_chacha"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5"
dependencies = [
"getrandom",
]
[[package]]
name = "rand_hc"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
dependencies = [
"rand_core",
]
[[package]]
name = "shuffle3rs"
version = "0.1.0"
dependencies = [
"rand",
]
[[package]]
name = "wasi"
version = "0.10.2+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"

@ -0,0 +1,10 @@
[package]
name = "shuffle3rs"
version = "0.1.0"
authors = ["Avril <flanchan@cumallover.me>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rand = "0.8.3"

@ -0,0 +1,34 @@
use rand::Rng;
use crate::shuffle;
pub trait SliceElementExt<T>
{
fn random_element<R: Rng + ?Sized>(&self, rng: &mut R) -> &T;
fn random_element_mut<R: Rng + ?Sized>(&mut self, rng: &mut R) -> &mut T;
}
pub trait ShuffleExt<T>
{
fn shuffle<R: Rng + ?Sized>(&mut self, rng: &mut R);
fn unshuffle<R: Rng + ?Sized>(&mut self, rng: &mut R);
}
impl<T> SliceElementExt<T> for [T]
{
#[inline] fn random_element<R: Rng + ?Sized>(&self, rng: &mut R) -> &T {
shuffle::element_in(self, rng)
}
#[inline] fn random_element_mut<R: Rng + ?Sized>(&mut self, rng: &mut R) -> &mut T {
shuffle::element_in_mut(self, rng)
}
}
impl<T> ShuffleExt<T> for [T]
{
#[inline] fn shuffle<R: Rng + ?Sized>(&mut self, rng: &mut R) {
shuffle::shuffle(self, rng)
}
#[inline] fn unshuffle<R: Rng + ?Sized>(&mut self, rng: &mut R) {
todo!()
}
}

@ -0,0 +1,9 @@
#![allow(dead_code)]
#[macro_use] mod ext; use ext::*;
mod shuffle;
fn main() {
println!("Hello, world!");
}

@ -0,0 +1,42 @@
use rand::Rng;
use std::mem::swap;
/// Get a random element in this slice.
pub fn element_in<'a, T, R: Rng + ?Sized>(slice: &'a (impl AsRef<[T]> + ?Sized), with: &mut R) -> &'a T
{
let slice = slice.as_ref();
&slice[with.gen_range(0..slice.len())]
}
/// Get a random element in this slice.
pub fn element_in_mut<'a, T, R: Rng + ?Sized>(slice: &'a mut (impl AsMut<[T]> + ?Sized), with: &mut R) -> &'a mut T
{
inside(slice.as_mut(), with)
}
#[inline(always)] fn inside<'a, T, R: Rng + ?Sized>(slice: &'a mut [T], with: &mut R) -> &'a mut T
{
&mut slice[with.gen_range(0..slice.len())]
}
fn shuffle_slice<T, R: Rng + ?Sized>(slice: &mut [T], with: &mut R)
{
match slice
{
&mut [] | &mut [_] => {},
&mut [ref mut inner @ .. , ref mut b] => {
swap(b, inside(inner, with));
shuffle(inner, with);
},
}
}
//TODO: unshuffle
/// Shuffle this slice with this `Rng`.
#[inline(always)] pub fn shuffle<T, R: Rng + ?Sized>(mut slice: impl AsMut<[T]>, with: &mut R)
{
shuffle_slice(slice.as_mut(), with)
}
Loading…
Cancel
Save