1use std::{
2 borrow::Borrow,
3 collections::TryReserveError,
4 fmt::Debug,
5 iter::{Chain, FusedIterator},
6 ops::{BitAnd, BitOr, BitXor, Sub},
7 vec,
8};
9
10#[cfg(test)]
11mod tests;
12
13pub struct VecSet<T> {
14 inner: Vec<T>,
15}
16
17pub struct Iter<'a, T> {
18 inner: core::slice::Iter<'a, T>,
19}
20
21impl<K> Clone for Iter<'_, K> {
22 fn clone(&self) -> Self {
23 Self {
24 inner: self.inner.clone(),
25 }
26 }
27}
28
29impl<K: Debug> Debug for Iter<'_, K> {
30 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
31 f.debug_list().entries(self.clone()).finish()
32 }
33}
34
35impl<K> ExactSizeIterator for Iter<'_, K> {
36 fn len(&self) -> usize {
37 let (lower, upper) = self.inner.size_hint();
38 assert_eq!(upper, Some(lower));
39 lower
40 }
41}
42
43impl<K> FusedIterator for Iter<'_, K> {}
44
45impl<'a, K> Iterator for Iter<'a, K> {
46 type Item = &'a K;
47
48 fn next(&mut self) -> Option<Self::Item> {
49 self.inner.next()
50 }
51}
52
53pub struct Drain<'a, T> {
54 inner: std::vec::Drain<'a, T>,
55}
56
57impl<K: Debug> Debug for Drain<'_, K> {
58 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59 Debug::fmt(&self.inner, f)
60 }
61}
62
63impl<K> ExactSizeIterator for Drain<'_, K> {
64 fn len(&self) -> usize {
65 let (lower, upper) = self.inner.size_hint();
66 assert_eq!(upper, Some(lower));
71 lower
72 }
73}
74
75impl<K> FusedIterator for Drain<'_, K> {}
76
77impl<'a, K> Iterator for Drain<'a, K> {
78 type Item = K;
79
80 fn next(&mut self) -> Option<Self::Item> {
81 self.inner.next()
82 }
83}
84
85pub struct Difference<'a, T> {
86 iter: Iter<'a, T>,
87 other: &'a VecSet<T>,
88}
89
90impl<T> Clone for Difference<'_, T> {
91 fn clone(&self) -> Self {
92 Self {
93 iter: self.iter.clone(),
94 other: self.other,
95 }
96 }
97}
98
99impl<T: Debug> Debug for Difference<'_, T>
100where
101 T: Eq,
102{
103 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
104 f.debug_list().entries(self.clone()).finish()
105 }
106}
107
108impl<T> ExactSizeIterator for Difference<'_, T>
109where
110 T: Eq,
111{
112 fn len(&self) -> usize {
113 let (lower, upper) = self.iter.size_hint();
114 assert_eq!(upper, Some(lower));
119 lower
120 }
121}
122
123impl<T> FusedIterator for Difference<'_, T> where T: Eq {}
124
125impl<'a, T> Iterator for Difference<'a, T>
126where
127 T: Eq,
128{
129 type Item = &'a T;
130
131 fn next(&mut self) -> Option<Self::Item> {
132 while let Some(n) = self.iter.next() {
133 if !self.other.contains(n) {
134 return Some(n);
135 }
136 }
137 None
138 }
139}
140
141pub struct SymmetricDifference<'a, T> {
142 iter: Chain<Difference<'a, T>, Difference<'a, T>>,
143}
144
145impl<T> Clone for SymmetricDifference<'_, T> {
146 fn clone(&self) -> Self {
147 Self {
148 iter: self.iter.clone(),
149 }
150 }
151}
152
153impl<T: Debug> Debug for SymmetricDifference<'_, T>
154where
155 T: Eq,
156{
157 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
158 f.debug_list().entries(self.clone()).finish()
159 }
160}
161
162impl<T> FusedIterator for SymmetricDifference<'_, T> where T: Eq {}
163
164impl<'a, T> Iterator for SymmetricDifference<'a, T>
165where
166 T: Eq,
167{
168 type Item = &'a T;
169
170 fn next(&mut self) -> Option<Self::Item> {
171 self.iter.next()
172 }
173}
174
175pub struct Intersection<'a, T> {
176 iter: Iter<'a, T>,
177 other: &'a VecSet<T>,
178}
179
180impl<T> Clone for Intersection<'_, T> {
181 fn clone(&self) -> Self {
182 Self {
183 iter: self.iter.clone(),
184 other: self.other,
185 }
186 }
187}
188
189impl<T: Debug> Debug for Intersection<'_, T>
190where
191 T: Eq,
192{
193 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
194 f.debug_list().entries(self.clone()).finish()
195 }
196}
197
198impl<T> FusedIterator for Intersection<'_, T> where T: Eq {}
199
200impl<'a, T> Iterator for Intersection<'a, T>
201where
202 T: Eq,
203{
204 type Item = &'a T;
205
206 fn next(&mut self) -> Option<Self::Item> {
207 while let Some(n) = self.iter.next() {
208 if self.other.contains(n) {
209 return Some(n);
210 }
211 }
212 None
213 }
214}
215
216pub struct Union<'a, T> {
217 iter: Chain<Iter<'a, T>, Difference<'a, T>>,
218}
219
220impl<T> Clone for Union<'_, T> {
221 fn clone(&self) -> Self {
222 Self {
223 iter: self.iter.clone(),
224 }
225 }
226}
227
228impl<T: Debug> Debug for Union<'_, T>
229where
230 T: Eq,
231{
232 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
233 f.debug_list().entries(self.clone()).finish()
234 }
235}
236
237impl<T> FusedIterator for Union<'_, T> where T: Eq {}
238
239impl<'a, T> Iterator for Union<'a, T>
240where
241 T: Eq,
242{
243 type Item = &'a T;
244
245 fn next(&mut self) -> Option<Self::Item> {
246 self.iter.next()
247 }
248}
249
250pub struct IntoIter<T> {
251 inner: vec::IntoIter<T>,
252}
253
254impl<T: Debug> Debug for IntoIter<T> {
255 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
256 Debug::fmt(&self.inner, f)
257 }
258}
259
260impl<T> ExactSizeIterator for IntoIter<T> {
261 fn len(&self) -> usize {
262 self.inner.len()
263 }
264}
265
266impl<T> FusedIterator for IntoIter<T> {}
267
268impl<'a, T> Iterator for IntoIter<T> {
269 type Item = T;
270
271 fn next(&mut self) -> Option<Self::Item> {
272 self.inner.next()
273 }
274}
275
276impl<T> VecSet<T> {
277 pub fn new() -> Self {
278 Self { inner: Vec::new() }
279 }
280
281 pub fn with_capacity(capacity: usize) -> Self {
282 Self {
283 inner: Vec::with_capacity(capacity),
284 }
285 }
286
287 pub fn capacity(&self) -> usize {
288 self.inner.capacity()
289 }
290
291 pub fn iter(&self) -> Iter<'_, T> {
292 Iter {
293 inner: self.inner.iter(),
294 }
295 }
296
297 pub fn len(&self) -> usize {
298 self.inner.len()
299 }
300
301 pub fn is_empty(&self) -> bool {
302 self.inner.is_empty()
303 }
304
305 pub fn drain(&mut self) -> Drain<'_, T> {
306 Drain {
307 inner: self.inner.drain(..),
308 }
309 }
310
311 pub fn retain<F>(&mut self, f: F)
312 where
313 F: FnMut(&T) -> bool,
314 {
315 self.inner.retain(f);
316 }
317
318 pub fn clear(&mut self) {
319 self.inner.clear();
320 }
321
322 pub fn reserve(&mut self, additional: usize) {
323 self.inner.reserve(additional);
324 }
325
326 pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
327 self.inner.try_reserve(additional)
328 }
329
330 pub fn shrink_to_fit(&mut self) {
331 self.inner.shrink_to_fit();
332 }
333
334 pub fn shrink_to(&mut self, min_capacity: usize) {
335 self.inner.shrink_to(min_capacity);
336 }
337}
338
339impl<T> VecSet<T>
340where
341 T: Eq,
342{
343 pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T> {
344 Difference {
345 iter: self.iter(),
346 other,
347 }
348 }
349
350 pub fn symmetric_difference<'a>(&'a self, other: &'a VecSet<T>) -> SymmetricDifference<'a, T> {
351 SymmetricDifference {
352 iter: self.difference(other).chain(other.difference(self)),
353 }
354 }
355
356 pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
357 if self.len() <= other.len() {
358 Intersection {
359 iter: self.iter(),
360 other,
361 }
362 } else {
363 Intersection {
364 iter: other.iter(),
365 other: self,
366 }
367 }
368 }
369
370 pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
371 if self.len() >= other.len() {
372 Union {
373 iter: self.iter().chain(other.difference(self)),
374 }
375 } else {
376 Union {
377 iter: other.iter().chain(self.difference(other)),
378 }
379 }
380 }
381
382 pub fn contains<Q>(&self, value: &Q) -> bool
383 where
384 T: Borrow<Q>,
385 Q: Eq + ?Sized,
386 {
387 for i in &self.inner {
388 if i.borrow() == value {
389 return true;
390 }
391 }
392 false
393 }
394
395 pub fn get<Q>(&self, value: &Q) -> Option<&T>
396 where
397 T: Borrow<Q>,
398 Q: Eq + ?Sized,
399 {
400 for i in &self.inner {
401 if i.borrow() == value {
402 return Some(i);
403 }
404 }
405 None
406 }
407
408 pub fn is_disjoint(&self, other: &Self) -> bool {
409 for i in &self.inner {
410 if other.contains(i) {
411 return false;
412 }
413 }
414 true
415 }
416
417 pub fn is_subset(&self, other: &Self) -> bool {
418 for i in &self.inner {
419 if !other.contains(i) {
420 return false;
421 }
422 }
423 true
424 }
425
426 pub fn is_superset(&self, other: &Self) -> bool {
427 other.is_subset(self)
428 }
429
430 pub fn insert(&mut self, value: T) -> bool {
431 if self.contains(&value) {
432 return false;
433 }
434 self.inner.push(value);
435
436 true
437 }
438
439 pub fn replace(&mut self, value: T) -> Option<T> {
440 let mut r_index = None;
441 for (index, v) in self.inner.iter().enumerate() {
442 if v == &value {
443 r_index = Some(index);
444 break;
445 }
446 }
447 if let Some(i) = r_index {
448 let old = self.inner.remove(i);
449 self.inner.push(value);
450 return Some(old);
451 }
452
453 self.inner.push(value);
454
455 None
456 }
457
458 pub fn remove<Q>(&mut self, value: &Q) -> bool
459 where
460 T: Borrow<Q>,
461 Q: Eq + ?Sized,
462 {
463 let mut r_index = None;
464 for (index, v) in self.inner.iter().enumerate() {
465 if v.borrow() == value {
466 r_index = Some(index);
467 break;
468 }
469 }
470
471 if let Some(i) = r_index {
472 _ = self.inner.remove(i);
473 return true;
474 }
475
476 false
477 }
478}
479
480impl<T> BitAnd<&VecSet<T>> for &VecSet<T>
481where
482 T: Eq + Clone,
483{
484 type Output = VecSet<T>;
485
486 fn bitand(self, rhs: &VecSet<T>) -> Self::Output {
487 self.intersection(rhs).cloned().collect()
488 }
489}
490
491impl<T> BitOr<&VecSet<T>> for &VecSet<T>
492where
493 T: Eq + Clone,
494{
495 type Output = VecSet<T>;
496
497 fn bitor(self, rhs: &VecSet<T>) -> Self::Output {
498 self.union(rhs).cloned().collect()
499 }
500}
501
502impl<T> BitXor<&VecSet<T>> for &VecSet<T>
503where
504 T: Eq + Clone,
505{
506 type Output = VecSet<T>;
507
508 fn bitxor(self, rhs: &VecSet<T>) -> Self::Output {
509 self.symmetric_difference(rhs).cloned().collect()
510 }
511}
512
513impl<T> Clone for VecSet<T>
514where
515 T: Clone,
516{
517 fn clone(&self) -> Self {
518 Self {
519 inner: self.inner.clone(),
520 }
521 }
522}
523
524impl<T> Debug for VecSet<T>
525where
526 T: Debug + Eq,
527{
528 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
529 f.debug_set().entries(self).finish()
530 }
531}
532
533impl<T> Default for VecSet<T>
534where
535 T: Default,
536{
537 fn default() -> Self {
538 Self {
539 inner: Default::default(),
540 }
541 }
542}
543
544impl<'a, T> Extend<&'a T> for VecSet<T>
545where
546 T: 'a + Eq + Copy,
547{
548 fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
549 for i in iter {
550 _ = self.insert(*i);
551 }
552 }
553}
554
555impl<T> Extend<T> for VecSet<T>
556where
557 T: Eq,
558{
559 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
560 for i in iter {
561 _ = self.insert(i);
562 }
563 }
564}
565
566impl<T, const N: usize> From<[T; N]> for VecSet<T>
567where
568 T: Eq,
569{
570 fn from(value: [T; N]) -> Self {
571 let mut o = VecSet::new();
572 for i in value {
573 o.insert(i);
574 }
575
576 o
577 }
578}
579
580impl<T> FromIterator<T> for VecSet<T>
581where
582 T: Eq,
583{
584 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
585 let mut o = VecSet::new();
586 for i in iter {
587 o.insert(i);
588 }
589
590 o
591 }
592}
593
594impl<'a, T> IntoIterator for &'a VecSet<T> {
595 type Item = &'a T;
596
597 type IntoIter = Iter<'a, T>;
598
599 fn into_iter(self) -> Self::IntoIter {
600 Iter {
601 inner: self.inner.iter(),
602 }
603 }
604}
605
606impl<T> IntoIterator for VecSet<T> {
607 type Item = T;
608
609 type IntoIter = IntoIter<T>;
610
611 fn into_iter(self) -> Self::IntoIter {
612 IntoIter {
613 inner: self.inner.into_iter(),
614 }
615 }
616}
617
618impl<T> PartialEq for VecSet<T>
619where
620 T: Eq,
621{
622 fn eq(&self, other: &Self) -> bool {
623 self.is_subset(other) && self.is_superset(other)
624 }
625}
626
627impl<T> Eq for VecSet<T> where T: Eq {}
628
629impl<T> Sub<&VecSet<T>> for &VecSet<T>
630where
631 T: Eq + Clone,
632{
633 type Output = VecSet<T>;
634
635 fn sub(self, rhs: &VecSet<T>) -> Self::Output {
636 self.difference(rhs).cloned().collect()
637 }
638}