hashdeep_compare/
some_vec.rs1use std::cmp::Ordering;
2
3
4#[derive(Debug, PartialEq)]
6pub struct SomeVec<T> {
8 v: Vec<T>
9}
10
11impl<T> SomeVec<T> {
12
13 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 pub fn from_first_value(value: T) -> SomeVec<T> {
24 SomeVec{v: vec!{value}}
25 }
26
27 pub fn from_values(value1: T, value2: T) -> SomeVec<T> {
29 SomeVec{v: vec!{value1, value2}}
30 }
31
32 pub fn len(&self) -> usize {
34 self.v.len()
35 }
36
37 pub fn first(&self) -> &T {
39 &self.v[0]
40 }
41
42 pub fn at(&self, index: usize) -> &T {
48 &self.v[index]
49 }
50
51 pub fn push(&mut self, value: T) {
53 self.v.push(value);
54 }
55
56 pub fn inner_ref(&self) -> &Vec<T> {
58 &self.v
59 }
60
61 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 #[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}