mirror of
https://github.com/librespot-org/librespot.git
synced 2025-10-03 09:49:31 +02:00

- Fix deprecated Error::cause warnings and missing dyn - Reset max_width - Add rustfmt to Travis - Run rustfmt on full codebase with `cargo fmt --all` - Add rustfmt to Travis - Complete migration to edition 2018 - Replace try! shorthand - Use explicit `dyn Trait`
60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
use num_bigint::BigUint;
|
|
use num_integer::Integer;
|
|
use num_traits::{One, Zero};
|
|
use rand::Rng;
|
|
use std::mem;
|
|
use std::ops::{Mul, Rem, Shr};
|
|
|
|
pub fn rand_vec<G: Rng>(rng: &mut G, size: usize) -> Vec<u8> {
|
|
::std::iter::repeat(())
|
|
.map(|()| rng.gen())
|
|
.take(size)
|
|
.collect()
|
|
}
|
|
|
|
pub fn powm(base: &BigUint, exp: &BigUint, modulus: &BigUint) -> BigUint {
|
|
let mut base = base.clone();
|
|
let mut exp = exp.clone();
|
|
let mut result: BigUint = One::one();
|
|
|
|
while !exp.is_zero() {
|
|
if exp.is_odd() {
|
|
result = result.mul(&base).rem(modulus);
|
|
}
|
|
exp = exp.shr(1);
|
|
base = (&base).mul(&base).rem(modulus);
|
|
}
|
|
|
|
result
|
|
}
|
|
|
|
pub trait ReadSeek: ::std::io::Read + ::std::io::Seek {}
|
|
impl<T: ::std::io::Read + ::std::io::Seek> ReadSeek for T {}
|
|
|
|
pub trait Seq {
|
|
fn next(&self) -> Self;
|
|
}
|
|
|
|
macro_rules! impl_seq {
|
|
($($ty:ty)*) => { $(
|
|
impl Seq for $ty {
|
|
fn next(&self) -> Self { *self + 1 }
|
|
}
|
|
)* }
|
|
}
|
|
|
|
impl_seq!(u8 u16 u32 u64 usize);
|
|
|
|
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, Default)]
|
|
pub struct SeqGenerator<T: Seq>(T);
|
|
|
|
impl<T: Seq> SeqGenerator<T> {
|
|
pub fn new(value: T) -> Self {
|
|
SeqGenerator(value)
|
|
}
|
|
|
|
pub fn get(&mut self) -> T {
|
|
let value = self.0.next();
|
|
mem::replace(&mut self.0, value)
|
|
}
|
|
}
|