adv_random/
random_trait.rs

1use once_cell::sync::OnceCell;
2
3#[cfg(feature="rand")]
4use crate::default_random::DefaultRandom;
5
6static RANDOM_TRAIT: OnceCell<Box<dyn RandomTrait + Send + Sync>> = OnceCell::new();
7
8#[cfg(feature="rand")]
9pub fn get_random_trait() -> &'static Box<dyn RandomTrait + Send + Sync> {
10    let value: &Box<dyn RandomTrait + Send + Sync> = RANDOM_TRAIT.get_or_init(|| {
11        Box::new(DefaultRandom{})
12    });
13    return value;
14}
15
16#[cfg(not(feature="rand"))]
17pub fn get_random_trait() -> &'static Box<dyn RandomTrait + Send + Sync> {
18    let value: &Box<dyn RandomTrait + Send + Sync> = match RANDOM_TRAIT.get() {
19        Some(v) => v,
20        None => panic!("Please call set_random_trait function or use feature \"rand\""),
21    };
22    return value;
23}
24
25#[cfg(not(feature="rand"))]
26pub fn set_random_trait(random_trait: Box<dyn RandomTrait + Send + Sync>) {
27    let _ = RANDOM_TRAIT.set(random_trait);
28}
29
30pub fn get_random_vec_item<T>(vec: &[T]) -> &T {
31    return &vec[get_random_trait().get_number(0, vec.len() - 1)];
32}
33
34// pub fn shuffle<T>(list: &mut [T]) {
35//     list.shuffle(&mut thread_rng());
36// }
37
38pub fn shuffle_vec<T>(vector: &mut [T])
39{
40    let len = vector.len() - 1;
41    for i in 0..=len {
42        vector.swap(i, get_random_trait().get_number(i, len));
43    }
44}
45
46
47pub trait RandomTrait: RandomTraitClone + std::fmt::Debug {
48    fn get_number(&self, min: usize, max: usize) -> usize;
49    fn get_bool(&self) -> bool;
50}
51
52pub trait RandomTraitClone {
53    fn clone_box(&self) -> Box<dyn RandomTrait>;
54}
55
56impl<T> RandomTraitClone for T
57where
58    T: 'static + RandomTrait + Clone,
59{
60    fn clone_box(&self) -> Box<dyn RandomTrait> {
61        Box::new(self.clone())
62    }
63}
64
65
66impl Clone for Box<dyn RandomTrait> {
67    fn clone(&self) -> Box<dyn RandomTrait> {
68        self.clone_box()
69    }
70}