scarlet_queen_core/
each_crate_individual.rs

1//! Mod for `EachCrateIndividual`.
2
3use std::rc::Rc;
4use crate::individual::Individual;
5
6/// A trait for inividual defined by each crete.
7///
8/// A struct implmented this must have `Rc<Individual<T>>`.
9/// * `T` - A type of value.
10///
11/// # Example
12/// ```
13/// use std::rc::Rc;
14/// use scarlet_queen_core::{EachCrateIndividual, Individual};
15///
16/// #[derive(PartialEq, Eq, Debug)]
17/// struct SampleIndividual(Rc<Individual<u8>>);
18///
19/// impl EachCrateIndividual for SampleIndividual {
20///     type Item = u8;
21///
22///     fn new(individual: &Rc<Individual<Self::Item>>) -> Self {
23///         SampleIndividual(Rc::clone(&individual))
24///     }
25///
26///     fn get_individual(&self) -> &Individual<Self::Item> {
27///         &self.0
28///     }
29/// }
30///
31/// let r: Rc<Individual<u8>> = Rc::new(Individual::new(5u8));
32/// let sample: SampleIndividual = SampleIndividual::new(&r);
33///
34/// assert_eq!(sample.get_individual(), r.as_ref());
35/// assert_eq!(sample.get_id(), r.get_id());
36/// assert_eq!(sample.get_value(), r.get_value());
37/// ```
38pub trait EachCrateIndividual {
39    type Item;
40
41    /// Make individual from base individual.
42    /// * `individual` - A base individual.
43    fn new(individual: &Rc<Individual<Self::Item>>) -> Self;
44
45    /// Get this individual.
46    fn get_individual(&self) -> &Individual<Self::Item>;
47
48    /// Get an id of this individual.
49    fn get_id(&self) -> usize {
50        self.get_individual().get_id()
51    }
52
53    /// Get a value of this individual.
54    fn get_value(&self) -> &Self::Item {
55        self.get_individual().get_value()
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use std::rc::Rc;
62
63    use super::EachCrateIndividual;
64    use crate::individual::Individual;
65
66    #[derive(PartialEq, Eq, Debug)]
67    struct SampleIndividual(Rc<Individual<u8>>);
68    impl EachCrateIndividual for SampleIndividual {
69        type Item = u8;
70        fn new(individual: &Rc<Individual<Self::Item>>) -> Self {
71            SampleIndividual(Rc::clone(individual))
72        }
73        fn get_individual(&self) -> &Individual<Self::Item> {
74            &self.0
75        }
76    }
77
78    #[test]
79    fn test_eachcrateindividual_getid() {
80        let base: Vec<Rc<Individual<u8>>> = vec![
81            Rc::new(Individual::new(5u8)),
82            Rc::new(Individual::new(0u8)),
83            Rc::new(Individual::new_with_id(5usize, 13u8)),
84        ];
85        let testcases: Vec<(SampleIndividual, usize)> = vec![
86            (SampleIndividual::new(&base[0]), 0usize),
87            (SampleIndividual::new(&base[1]), 0usize),
88            (SampleIndividual::new(&base[2]), 5usize),
89        ];
90        for (arg, result) in testcases.into_iter() {
91            assert_eq!(
92                <SampleIndividual as EachCrateIndividual>::get_id(&arg),
93                result
94            );
95        }
96    }
97
98    #[test]
99    fn test_eachcrateindividual_getvalue() {
100        let base: Vec<Rc<Individual<u8>>> = vec![
101            Rc::new(Individual::new(5u8)),
102            Rc::new(Individual::new(0u8)),
103            Rc::new(Individual::new_with_id(5usize, 13u8)),
104        ];
105        let testcases: Vec<(SampleIndividual, &u8)> = vec![
106            (SampleIndividual::new(&base[0]), &5u8),
107            (SampleIndividual::new(&base[1]), &0u8),
108            (SampleIndividual::new(&base[2]), &13u8),
109        ];
110        for (arg, result) in testcases.into_iter() {
111            assert_eq!(
112                <SampleIndividual as EachCrateIndividual>::get_value(&arg),
113                result
114            );
115        }
116    }
117}