1mod iterators;
14mod operators;
15mod set_impl;
16
17use crate::{Element, Set};
18use core::slice::Iter;
19
20#[derive(Clone, Debug)]
21pub struct VecSet<E: Element> {
22 elements: Vec<E>,
23}
24
25#[macro_export]
26macro_rules! vecset {
27 ($($x:expr),+ $(,)?) => {
28 {
29 let arr = [$($x),+];
30 VecSet::from(arr)
31 }
32 };
33}
34
35impl<E: Element, const N: usize> From<[E; N]> for VecSet<E> {
36 #[inline]
37 fn from(arr: [E; N]) -> Self {
38 Self::from_iter(arr)
39 }
40}
41
42impl<E: Element> FromIterator<E> for VecSet<E> {
43 #[inline]
44 fn from_iter<I: IntoIterator<Item = E>>(iter: I) -> Self {
45 let mut set = Self::new();
46 for item in iter {
47 set.insert(item);
48 }
49 set
50 }
51}
52
53impl<E: Element> VecSet<E> {
54 #[inline]
55 #[must_use]
56 pub fn new() -> Self {
57 Self::default()
58 }
59
60 #[inline]
61 pub fn iter(&self) -> Iter<'_, E> {
62 self.elements.iter()
63 }
64}
65
66impl<E: Element> Default for VecSet<E> {
67 #[inline]
68 fn default() -> Self {
69 Self {
70 elements: Vec::default(),
71 }
72 }
73}
74
75impl<'a, E: Element> IntoIterator for &'a VecSet<E> {
76 type Item = &'a E;
77 type IntoIter = Iter<'a, E>;
78
79 #[inline]
80 fn into_iter(self) -> Self::IntoIter {
81 self.iter()
82 }
83}
84
85#[cfg(test)]
86mod tests {
87 use super::super::set::Set;
88 use super::VecSet;
89
90 #[test]
91 fn test_new() {
92 let set = VecSet::<u32>::new();
93 assert!(set.elements.is_empty());
94 }
95
96 #[test]
97 fn test_with_capacity() {
98 let set = VecSet::<u32>::with_capacity(10);
99 assert!(set.elements.is_empty());
100 assert_eq!(set.capacity(), 10);
101 }
102
103 #[test]
104 fn test_new_with_vec() {
105 let set: VecSet<usize> = vec![4, 5, 6, 4].into_iter().collect();
106 assert_eq!(set.elements, vec![4, 5, 6]);
107 }
108
109 #[test]
110 fn test_new_from() {
111 let set = VecSet::<u32>::from([4, 5, 6, 4]);
112 assert_eq!(set.elements, vec![4, 5, 6]);
113 }
114
115 #[test]
116 fn test_insert() {
117 let mut set = VecSet::<u32>::new();
118 set.insert(1);
119 assert_eq!(set.elements, vec![1]);
120 set.insert(5);
121 set.insert(1);
122 assert_eq!(set.elements, vec![1, 5]);
123 }
124
125 #[test]
126 fn test_remove() {
127 let mut set: VecSet<u8> = VecSet::from([4, 5, 6, 4]);
128 set.remove(&5);
129 assert_eq!(set.elements, vec![4, 6]);
130 set.remove(&7);
131 assert_eq!(set.elements, vec![4, 6]);
132 }
133
134 #[test]
135 fn test_union() {
136 let mut set_a: VecSet<u8> = VecSet::from([1, 2]);
137 let set_b = VecSet::from([2, 3]);
138 set_a.union_update(&set_b);
139 assert_eq!(set_a.elements, vec![1, 2, 3]);
140 }
141
142 #[test]
143 fn test_symmetric_difference_update() {
144 let mut set_a = VecSet::<u32>::from([4, 5, 6, 4]);
145 let set_b = VecSet::<u32>::from([1, 3, 4]);
146 set_a.symmetric_difference_update(&set_b);
147 assert_eq!(set_a.elements, vec![5, 6, 1, 3]);
148 }
149
150 #[test]
151 fn test_intersection_update() {
152 let mut set_a: VecSet<u8> = VecSet::from([1, 2, 3]);
153 let set_b = VecSet::from([2, 3, 4]);
154 set_a.intersection_update(&set_b);
155 assert_eq!(set_a.elements, vec![2, 3]);
156 }
157
158 #[test]
159 fn test_intersection() {
160 let set_a: VecSet<u8> = VecSet::from([1, 2, 3]);
161 let set_b = VecSet::from([2, 3, 4]);
162 let intersection: Vec<_> = set_a.intersection(&set_b).copied().collect();
163 assert_eq!(intersection, vec![2, 3]);
164 }
165
166 #[test]
167 fn test_symmetric_difference() {
168 let set_a = VecSet::<u32>::from([4, 5, 6, 4]);
169 let set_b = VecSet::<u32>::from([1, 3, 4]);
170 let sym_diff: Vec<_> = set_a.symmetric_difference(&set_b).copied().collect();
171 assert_eq!(sym_diff, vec![5, 6, 1, 3]);
172 }
173
174 #[test]
175 fn test_bitor_assign() {
176 let mut set_a: VecSet<u8> = VecSet::from([1, 2]);
177 let set_b: VecSet<u8> = VecSet::from([2, 3]);
178 set_a |= &set_b;
179 assert_eq!(set_a.elements, vec![1, 2, 3]);
180 }
181
182 #[test]
183 fn test_bitxor_assign() {
184 let mut set_a: VecSet<u8> = VecSet::from([1, 2, 3]);
185 let set_b: VecSet<u8> = VecSet::from([2, 3, 4]);
186 set_a ^= &set_b;
187 assert_eq!(set_a.elements, vec![1, 4]);
188 }
189
190 #[test]
191 fn test_bitand_assign() {
192 let mut set_a: VecSet<u8> = VecSet::from([1, 2, 3]);
193 let set_b = VecSet::from([2, 3, 4]);
194 set_a &= &set_b;
195 assert_eq!(set_a.elements, vec![2, 3]);
196 }
197
198 #[test]
199 fn test_bitand_assign_single_element_ref() {
200 let mut set_a: VecSet<u8> = VecSet::from([1, 2, 3]);
201 let element: u8 = 2;
202 set_a &= &element;
203 assert_eq!(set_a.elements, vec![2]);
204
205 let mut set_b: VecSet<u8> = VecSet::from([1, 2, 3]);
206 let non_existing_element: u8 = 4;
207 set_b &= &non_existing_element;
208 assert_eq!(set_b.elements, Vec::<u8>::new());
209 }
210
211 #[test]
212 fn test_difference() {
213 let set_a: VecSet<u8> = VecSet::from([1, 2, 3]);
214 let set_b = VecSet::from([2, 3, 4]);
215 let diff: Vec<_> = set_a.difference(&set_b).copied().collect();
216 assert_eq!(diff, vec![1]);
217 }
218
219 #[test]
220 fn test_capacity() {
221 let mut set = VecSet::<u32>::with_capacity(10);
222 assert_eq!(set.capacity(), 10);
223 set.insert(1);
224 assert!(set.capacity() >= 1);
225 }
226
227 #[test]
228 fn test_clear() {
229 let mut set = VecSet::<u32>::from([1, 2, 3]);
230 assert!(!set.is_empty());
231 set.clear();
232 assert!(set.is_empty());
233 }
234
235 #[test]
236 fn test_symmetric_difference_item_update() {
237 let mut set = VecSet::<u32>::from([1, 2, 3]);
238 set.symmetric_difference_item_update(&2);
239 assert_eq!(set.elements, vec![1, 3]);
240 set.symmetric_difference_item_update(&4);
241 assert_eq!(set.elements, vec![1, 3, 4]);
242 }
243
244 #[test]
245 fn test_union_item_update() {
246 let mut set = VecSet::<u32>::from([1, 2, 3]);
247 set.union_item_update(&4);
248 assert_eq!(set.elements, vec![1, 2, 3, 4]);
249 }
250
251 #[test]
252 fn test_sub_ref() {
253 let set_a: VecSet<u8> = VecSet::from([1, 2, 3]);
254 let set_b: VecSet<u8> = VecSet::from([2, 3, 4]);
255 let difference: Vec<_> = set_a.difference_ref(&set_b).copied().collect();
256 assert_eq!(difference, vec![1]);
257 }
258
259 #[test]
260 fn test_a_xor_b_sub_c() {
261 let mut set_a: VecSet<u8> = VecSet::from([1, 2, 3, 4, 5]);
262 let set_b: VecSet<u8> = VecSet::from([2, 3, 6]);
263 let set_c: VecSet<u8> = VecSet::from([3]);
264 set_a ^= set_b.difference(&set_c).copied().collect::<VecSet<_>>();
265 assert_eq!(set_a.elements, vec![1, 3, 4, 5, 6]);
266 }
267
268 #[test]
269 fn test_a_xor_b_sub_c_glyphs() {
270 let mut set_a: VecSet<u8> = VecSet::from([1, 2, 3, 4, 5]);
271 let set_b: VecSet<u8> = VecSet::from([2, 3, 6]);
272 let set_c: VecSet<u8> = VecSet::from([3]);
273 set_a ^= &set_b - &set_c; assert_eq!(set_a.elements, vec![1, 3, 4, 5, 6]);
275 }
276}