hashdeep_compare/
some_vec.rs

1use std::cmp::Ordering;
2
3
4/// A Vec-based container that is guaranteed to never be empty.
5#[derive(Debug, PartialEq)]
6// Warning: This should never derive `Default`. This would create an empty `SomeVec::v`!
7pub struct SomeVec<T> {
8    v: Vec<T>
9}
10
11impl<T> SomeVec<T> {
12
13    /// Creates a new SomeVec from a Vec if non-empty, or returns None.
14    pub fn from_vec(v: Vec<T>) -> Option<SomeVec<T>> {
15
16        match v.is_empty() {
17            true => None,
18            false => Some(SomeVec{v}),
19        }
20    }
21
22    /// Creates a SomeVec from its first value.
23    pub fn from_first_value(value: T) -> SomeVec<T> {
24        SomeVec{v: vec!{value}}
25    }
26
27    /// Creates a SomeVec from its first two values.
28    pub fn from_values(value1: T, value2: T) -> SomeVec<T> {
29        SomeVec{v: vec!{value1, value2}}
30    }
31
32    /// Returns the length of the SomeVec (guaranteed to be > 0).
33    pub fn len(&self) -> usize {
34        self.v.len()
35    }
36
37    /// Returns a reference to the first element.
38    pub fn first(&self) -> &T {
39        &self.v[0]
40    }
41
42    /// Returns a reference to the element at an index.
43    ///
44    /// # Panics
45    ///
46    /// Panics if index >= this SomeVec's length.
47    pub fn at(&self, index: usize) -> &T {
48        &self.v[index]
49    }
50
51    /// Adds value to the end of this SomeVec, increasing its length by 1.
52    pub fn push(&mut self, value: T) {
53        self.v.push(value);
54    }
55
56    /// Returns an immutable reference to this SomeVec's inner Vec.
57    pub fn inner_ref(&self) -> &Vec<T> {
58        &self.v
59    }
60
61    /// Sorts this SomeVec with comparison function F.
62    pub fn sort_by<F>(&mut self, compare: F)
63        where F: FnMut(&T, &T) -> Ordering
64    {
65        self.v.sort_by(compare);
66    }
67}
68
69#[cfg(test)]
70mod test {
71    use super::*;
72
73    #[test]
74    fn from_vec_and_len_test() {
75        assert_eq!(SomeVec::<i32>::from_vec(vec![]), None);
76        {
77            let v = SomeVec::<i32>::from_vec(vec![1]).unwrap();
78            assert_eq!(v.len(), 1);
79            assert_eq!(*v.inner_ref(), vec![1]);
80            assert_eq!(*v.first(), 1);
81        }
82        {
83            let v = SomeVec::<i32>::from_vec(vec![1,2,3]).unwrap();
84            assert_eq!(v.len(), 3);
85            assert_eq!(*v.inner_ref(), vec![1,2,3]);
86            assert_eq!(*v.first(), 1);
87        }
88    }
89
90    #[test]
91    fn from_first_value_test() {
92        {
93            let v = SomeVec::<i32>::from_first_value(1);
94            assert_eq!(v.len(), 1);
95            assert_eq!(*v.inner_ref(), vec![1]);
96            assert_eq!(*v.first(), 1);
97        }
98        {
99            let v = SomeVec::<()>::from_first_value(());
100            assert_eq!(v.len(), 1);
101            assert_eq!(*v.inner_ref(), vec![()]);
102            assert_eq!(*v.first(), ());
103        }
104        {
105            let v = SomeVec::<String>::from_first_value("1".to_owned());
106            assert_eq!(v.len(), 1);
107            assert_eq!(*v.inner_ref(), vec!["1".to_owned()]);
108            assert_eq!(*v.first(), "1".to_owned());
109        }
110    }
111
112    #[test]
113    fn from_values_test() {
114        {
115            let v = SomeVec::<()>::from_values((),());
116            assert_eq!(v.len(), 2);
117            assert_eq!(*v.inner_ref(), vec![(),()]);
118            assert_eq!(*v.first(), ());
119        }
120        {
121            let v = SomeVec::<i32>::from_values(1,2);
122            assert_eq!(v.len(), 2);
123            assert_eq!(*v.inner_ref(), vec![1,2]);
124            assert_eq!(*v.first(), 1);
125        }
126    }
127
128    /*
129    //commented out for now: generates test output noise
130    #[test]
131    #[should_panic(expected = "index out of bounds: the len is 1 but the index is 1")]
132    fn at_out_of_bounds_test() {
133        SomeVec::<i32>::from_vec(vec![1]).unwrap().at(1);
134    }*/
135
136    #[test]
137    fn at_test() {
138        assert_eq!(*SomeVec::<i32>::from_vec(vec![1,2,3]).unwrap().at(1), 2);
139        assert_eq!(*SomeVec::<String>::from_vec(vec!["1".to_owned()]).unwrap().at(0), "1");
140    }
141
142    #[test]
143    fn push_test() {
144        let mut v = SomeVec::<String>::from_vec(vec!["1".to_owned()]).unwrap();
145        assert_eq!(v.len(), 1);
146        assert_eq!(*v.first(), "1".to_owned());
147        assert_eq!(*v.at(0), "1");
148
149        v.push("2".to_owned());
150        assert_eq!(v.len(), 2);
151        assert_eq!(*v.first(), "1".to_owned());
152        assert_eq!(*v.at(0), "1");
153        assert_eq!(*v.at(1), "2");
154    }
155
156    #[test]
157    fn sort_by_test() {
158        {
159            let mut v = SomeVec::<u32>::from_vec(vec!{1}).unwrap();
160            v.sort_by(|x,y| x.cmp(y));
161            assert_eq!(v.inner_ref(), &vec!{1});
162        }
163        {
164            let mut v = SomeVec::<u32>::from_vec(vec!{2, 1}).unwrap();
165            v.sort_by(|x,y| x.cmp(y));
166            assert_eq!(v.inner_ref(), &vec!{1, 2});
167        }
168        {
169            let mut v = SomeVec::<u32>::from_vec(vec!{2, 3, 1}).unwrap();
170            v.sort_by(|x,y| x.cmp(y));
171            assert_eq!(v.inner_ref(), &vec!{1,2,3});
172        }
173    }
174}