adv_random/
random_trait.rs1use 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
34pub 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}