1use core::ops::Deref;
2use rustc_hash::{FxBuildHasher, FxHashSet};
3use serde::{
4 de::{Deserialize, DeserializeOwned, Deserializer},
5 ser::{Serialize, Serializer},
6};
7use std::{borrow::Borrow, hash::Hash};
8
9mod cbor_size;
10
11pub use cbor_size::{CborSizeError, estimate_cbor_size, try_estimate_cbor_size};
12
13pub trait Pipe<T> {
18 fn pipe<F, R>(self, f: F) -> R
28 where
29 F: FnOnce(Self) -> R,
30 Self: Sized;
31}
32
33impl<T> Pipe<T> for T {
34 fn pipe<F, R>(self, f: F) -> R
35 where
36 F: FnOnce(Self) -> R,
37 {
38 f(self)
39 }
40}
41
42#[derive(Clone, Debug)]
69pub struct UniqueVec<T> {
70 set: FxHashSet<T>,
71 vec: Vec<T>,
72}
73
74impl<T> Default for UniqueVec<T> {
75 fn default() -> Self {
77 Self {
78 set: FxHashSet::default(),
79 vec: Vec::new(),
80 }
81 }
82}
83
84impl<T> From<Vec<T>> for UniqueVec<T>
85where
86 T: Eq + Hash + Clone,
87{
88 fn from(mut vec: Vec<T>) -> Self {
92 let mut set = FxHashSet::with_capacity_and_hasher(vec.len(), FxBuildHasher);
93 vec.retain(|item| set.insert(item.clone()));
94 Self { set, vec }
95 }
96}
97
98impl<T> FromIterator<T> for UniqueVec<T>
99where
100 T: Eq + Hash + Clone,
101{
102 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
104 let vec: Vec<T> = iter.into_iter().collect();
105 vec.into()
106 }
107}
108
109impl<T> From<UniqueVec<T>> for Vec<T> {
110 fn from(extender: UniqueVec<T>) -> Self {
112 extender.vec
113 }
114}
115
116impl<T> AsRef<[T]> for UniqueVec<T> {
117 fn as_ref(&self) -> &[T] {
119 &self.vec
120 }
121}
122
123impl<T> Deref for UniqueVec<T> {
124 type Target = Vec<T>;
125
126 fn deref(&self) -> &Self::Target {
128 &self.vec
129 }
130}
131
132impl<T> UniqueVec<T>
133where
134 T: Eq + Hash + Clone,
135{
136 pub fn new() -> Self {
138 UniqueVec::default()
139 }
140
141 pub fn with_capacity(capacity: usize) -> Self {
143 UniqueVec {
144 set: FxHashSet::with_capacity_and_hasher(capacity, FxBuildHasher),
145 vec: Vec::with_capacity(capacity),
146 }
147 }
148
149 pub fn contains<Q>(&self, item: &Q) -> bool
151 where
152 T: Borrow<Q>,
153 Q: Eq + Hash + ?Sized,
154 {
155 self.set.contains(item)
156 }
157
158 pub fn push(&mut self, item: T) -> bool {
168 if self.set.insert(item.clone()) {
169 self.vec.push(item);
170 true
171 } else {
172 false
173 }
174 }
175
176 pub fn extend(&mut self, items: impl IntoIterator<Item = T>) {
182 Extend::extend(self, items);
183 }
184
185 pub fn retain<F>(&mut self, mut f: F)
187 where
188 F: FnMut(&T) -> bool,
189 {
190 self.vec.retain(&mut f);
191 self.set.clear();
192 self.set.extend(self.vec.iter().cloned());
193 }
194
195 pub fn remove(&mut self, index: usize) -> T {
197 let item = self.vec.remove(index);
198 self.set.remove(&item);
199 item
200 }
201
202 pub fn remove_if<P>(&mut self, mut predicate: P) -> Option<T>
205 where
206 P: FnMut(&T) -> bool,
207 {
208 if let Some(index) = self.vec.iter().position(&mut predicate) {
209 let item = self.vec.remove(index);
210 self.set.remove(&item);
211 Some(item)
212 } else {
213 None
214 }
215 }
216
217 pub fn swap_remove_if<P>(&mut self, mut predicate: P) -> Option<T>
220 where
221 P: FnMut(&T) -> bool,
222 {
223 if let Some(index) = self.vec.iter().position(&mut predicate) {
224 let item = self.vec.swap_remove(index);
225 self.set.remove(&item);
226 Some(item)
227 } else {
228 None
229 }
230 }
231
232 pub fn intersect_with(&mut self, other: &UniqueVec<T>) {
234 self.vec.retain(|item| other.set.contains(item));
235 self.set.clear();
236 self.set.extend(self.vec.iter().cloned());
237 }
238
239 pub fn into_vec(self) -> Vec<T> {
241 self.vec
242 }
243
244 pub fn into_set(self) -> FxHashSet<T> {
246 self.set
247 }
248
249 pub fn to_vec(&self) -> Vec<T> {
251 self.vec.clone()
252 }
253
254 pub fn to_set(&self) -> FxHashSet<T> {
256 self.set.clone()
257 }
258}
259
260impl<T> Extend<T> for UniqueVec<T>
261where
262 T: Eq + Hash + Clone,
263{
264 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
266 self.vec.extend(
267 iter.into_iter()
268 .filter(|item| self.set.insert(item.clone())),
269 );
270 }
271}
272
273impl<T> Serialize for UniqueVec<T>
274where
275 T: Eq + Hash + Clone + Serialize,
276{
277 #[inline]
279 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
280 serializer.collect_seq(self.vec.iter())
281 }
282}
283
284impl<'de, T> Deserialize<'de> for UniqueVec<T>
285where
286 T: Eq + Hash + Clone + DeserializeOwned,
287{
288 #[inline]
290 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
291 let vec: Vec<T> = Deserialize::deserialize(deserializer)?;
292 Ok(UniqueVec::from(vec))
293 }
294}
295
296#[derive(Clone, Debug, Eq, PartialEq)]
298pub struct CountingWriter {
299 count: usize,
300}
301
302impl Default for CountingWriter {
303 fn default() -> Self {
305 Self::new()
306 }
307}
308
309impl CountingWriter {
310 pub const fn new() -> Self {
312 CountingWriter { count: 0 }
313 }
314
315 pub const fn size(&self) -> usize {
317 self.count
318 }
319}
320
321impl std::io::Write for CountingWriter {
322 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
325 let len = buf.len();
326 self.count = self
327 .count
328 .checked_add(len)
329 .ok_or_else(|| std::io::Error::other("byte count overflow"))?;
330 Ok(len)
331 }
332
333 fn flush(&mut self) -> std::io::Result<()> {
336 Ok(())
337 }
338}
339
340#[cfg(test)]
341mod tests {
342 use super::*;
343 use std::io::Write;
344
345 #[test]
346 fn test_pipe_trait() {
347 let result = 5.pipe(|x| x * 2).pipe(|x| x + 1);
349 assert_eq!(result, 11);
350
351 let string_result = "hello"
353 .pipe(|s| s.to_uppercase())
354 .pipe(|s| format!("{} world", s));
355 assert_eq!(string_result, "HELLO world");
356
357 let vec_result = vec![1, 2, 3].pipe(|v| v.len()).pipe(|len| len as f64);
359 assert_eq!(vec_result, 3.0);
360 }
361
362 #[test]
363 fn test_unique_vec_new() {
364 let uv: UniqueVec<i32> = UniqueVec::new();
365 assert_eq!(uv.len(), 0);
366 assert!(uv.is_empty());
367 }
368
369 #[test]
370 fn test_unique_vec_with_capacity() {
371 let uv: UniqueVec<i32> = UniqueVec::with_capacity(10);
372 assert_eq!(uv.len(), 0);
373 assert_eq!(uv.capacity(), 10);
374 }
375
376 #[test]
377 fn test_unique_vec_from_vec() {
378 let vec = vec![1, 2, 2, 3, 2, 1];
379 let uv = UniqueVec::from(vec);
380 assert_eq!(uv.len(), 3);
381 assert!(uv.contains(&1));
382 assert!(uv.contains(&2));
383 assert!(uv.contains(&3));
384 }
385
386 #[test]
387 fn test_unique_vec_from_iterator() {
388 let uv: UniqueVec<i32> = [2, 2, 1, 3, 2, 1].iter().cloned().collect();
389 assert_eq!(uv.len(), 3);
390 assert!(uv.contains(&2));
391 assert!(uv.contains(&1));
392 assert!(uv.contains(&3));
393 }
394
395 #[test]
396 fn test_unique_vec_push() {
397 let mut uv = UniqueVec::new();
398
399 assert!(uv.push(1));
401 assert!(uv.push(2));
402 assert!(uv.push(3));
403 assert_eq!(uv.len(), 3);
404
405 assert!(!uv.push(1));
407 assert!(!uv.push(2));
408 assert_eq!(uv.len(), 3);
409
410 assert_eq!(uv.as_ref(), &[1, 2, 3]);
412 }
413
414 #[test]
415 fn test_unique_vec_extend() {
416 let mut uv = UniqueVec::from(vec![1, 2, 3]);
417
418 uv.extend(vec![3, 4, 5, 2, 6]);
420
421 assert_eq!(uv.len(), 6);
422 assert_eq!(uv.as_ref(), &[1, 2, 3, 4, 5, 6]);
423 }
424
425 #[test]
426 fn test_unique_vec_retain() {
427 let mut uv = UniqueVec::from(vec![1, 2, 3, 4, 5]);
428
429 uv.retain(|&x| x % 2 == 0);
431
432 assert_eq!(uv.len(), 2);
433 assert_eq!(uv.as_ref(), &[2, 4]);
434 assert!(uv.contains(&2));
435 assert!(uv.contains(&4));
436 assert!(!uv.contains(&1));
437 assert!(!uv.contains(&3));
438 assert!(!uv.contains(&5));
439 }
440
441 #[test]
442 fn test_unique_vec_remove() {
443 let mut uv = UniqueVec::from(vec![1, 2, 3, 4, 5]);
444
445 let removed = uv.remove(2); assert_eq!(removed, 3);
447 assert_eq!(uv.len(), 4);
448 assert_eq!(uv.as_ref(), &[1, 2, 4, 5]);
449 assert!(!uv.contains(&3));
450 }
451
452 #[test]
453 #[should_panic]
454 fn test_unique_vec_remove_out_of_bounds() {
455 let mut uv = UniqueVec::from(vec![1, 2, 3]);
456 uv.remove(5); }
458
459 #[test]
460 fn test_unique_vec_remove_if() {
461 let mut uv = UniqueVec::from(vec![1, 2, 3, 4, 5]);
462
463 let removed = uv.remove_if(|&x| x % 2 == 0);
465 assert_eq!(removed, Some(2));
466 assert_eq!(uv.len(), 4);
467 assert_eq!(uv.as_ref(), &[1, 3, 4, 5]);
468 assert!(!uv.contains(&2));
469
470 let removed = uv.remove_if(|&x| x > 10);
472 assert_eq!(removed, None);
473 assert_eq!(uv.len(), 4);
474 }
475
476 #[test]
477 fn test_unique_vec_swap_remove_if() {
478 let mut uv = UniqueVec::from(vec![1, 2, 3, 4, 5]);
479
480 let removed = uv.swap_remove_if(|&x| x % 2 == 0);
482 assert_eq!(removed, Some(2));
483 assert_eq!(uv.len(), 4);
484 assert_eq!(uv.as_ref(), &[1, 5, 3, 4]);
486 assert!(!uv.contains(&2));
487 }
488
489 #[test]
490 fn test_unique_vec_contains() {
491 let uv = UniqueVec::from(vec![1, 2, 3]);
492
493 assert!(uv.contains(&1));
494 assert!(uv.contains(&2));
495 assert!(uv.contains(&3));
496 assert!(!uv.contains(&4));
497 }
498
499 #[test]
500 fn test_unique_vec_intersect_with() {
501 let mut uv1 = UniqueVec::from(vec![1, 2, 3, 4, 5]);
502 let uv2 = UniqueVec::from(vec![3, 4, 5, 6, 7]);
503
504 uv1.intersect_with(&uv2);
505
506 assert_eq!(uv1.len(), 3);
507 assert!(uv1.contains(&3));
508 assert!(uv1.contains(&4));
509 assert!(uv1.contains(&5));
510 assert!(!uv1.contains(&1));
511 assert!(!uv1.contains(&2));
512 }
513
514 #[test]
515 fn test_unique_vec_to_vec() {
516 let uv = UniqueVec::from(vec![1, 2, 2, 3]);
517 let vec = uv.to_vec();
518 assert_eq!(vec, vec![1, 2, 3]);
519 }
520
521 #[test]
522 fn test_unique_vec_to_set() {
523 let uv = UniqueVec::from(vec![1, 2, 3]);
524 let set = uv.to_set();
525 assert_eq!(set.len(), 3);
526 assert!(set.contains(&1));
527 assert!(set.contains(&2));
528 assert!(set.contains(&3));
529 }
530
531 #[test]
532 fn test_unique_vec_as_ref() {
533 let uv = UniqueVec::from(vec![1, 2, 3]);
534 let slice: &[i32] = uv.as_ref();
535 assert_eq!(slice, &[1, 2, 3]);
536 }
537
538 #[test]
539 fn test_unique_vec_deref() {
540 let uv = UniqueVec::from(vec![1, 2, 3]);
541 assert_eq!(uv.len(), 3);
543 assert_eq!(uv[0], 1);
544 assert_eq!(uv[1], 2);
545 assert_eq!(uv[2], 3);
546 }
547
548 #[test]
549 fn test_unique_vec_into_vec() {
550 let uv = UniqueVec::from(vec![1, 2, 3]);
551 let vec: Vec<i32> = uv.into();
552 assert_eq!(vec, vec![1, 2, 3]);
553 }
554
555 #[test]
556 fn test_unique_vec_serialize_deserialize() {
557 let uv = UniqueVec::from(vec![1, 2, 2, 3, 2, 1]); let json = serde_json::to_string(&uv).unwrap();
561 assert_eq!(json, "[1,2,3]");
562
563 let deserialized: UniqueVec<i32> = serde_json::from_str("[1,3,2,3,3,2,1]").unwrap();
565 assert_eq!(deserialized.len(), 3);
566 assert_eq!(deserialized.as_ref(), &[1, 3, 2]);
567 }
568
569 #[test]
570 fn test_unique_vec_clone() {
571 let uv1 = UniqueVec::from(vec![1, 2, 3]);
572 let uv2 = uv1.clone();
573
574 assert_eq!(uv1.len(), uv2.len());
575 assert_eq!(uv1.as_ref(), uv2.as_ref());
576 }
577
578 #[test]
579 fn test_counting_writer_new() {
580 let writer = CountingWriter::new();
581 assert_eq!(writer.size(), 0);
582 }
583
584 #[test]
585 fn test_counting_writer_default() {
586 let writer = CountingWriter::default();
587 assert_eq!(writer.size(), 0);
588 }
589
590 #[test]
591 fn test_counting_writer_write() {
592 let mut writer = CountingWriter::new();
593
594 let result = writer.write(b"hello");
595 assert!(result.is_ok());
596 assert_eq!(result.unwrap(), 5);
597 assert_eq!(writer.size(), 5);
598
599 let result = writer.write(b" world");
600 assert!(result.is_ok());
601 assert_eq!(result.unwrap(), 6);
602 assert_eq!(writer.size(), 11);
603 }
604
605 #[test]
606 fn test_counting_writer_flush() {
607 let mut writer = CountingWriter::new();
608 let result = writer.flush();
609 assert!(result.is_ok());
610 assert_eq!(writer.size(), 0); }
612
613 #[test]
614 fn test_counting_writer_multiple_writes() {
615 let mut writer = CountingWriter::new();
616
617 writer.write_all(b"a").unwrap();
619 assert_eq!(writer.size(), 1);
620
621 writer.write_all(b"bc").unwrap();
622 assert_eq!(writer.size(), 3);
623
624 writer.write_all(b"defg").unwrap();
625 assert_eq!(writer.size(), 7);
626 }
627
628 #[test]
629 fn test_counting_writer_empty_write() {
630 let mut writer = CountingWriter::new();
631
632 let result = writer.write(b"");
633 assert!(result.is_ok());
634 assert_eq!(result.unwrap(), 0);
635 assert_eq!(writer.size(), 0);
636 }
637
638 #[test]
639 fn test_unique_vec_edge_cases() {
640 let uv = UniqueVec::from(vec![] as Vec<i32>);
642 assert_eq!(uv.len(), 0);
643 assert!(uv.is_empty());
644
645 let mut uv = UniqueVec::from(vec![42]);
647 assert_eq!(uv.len(), 1);
648 assert!(uv.contains(&42));
649
650 let removed = uv.remove(0);
652 assert_eq!(removed, 42);
653 assert_eq!(uv.len(), 0);
654 assert!(!uv.contains(&42));
655 }
656
657 #[test]
658 fn test_unique_vec_string_type() {
659 let mut uv = UniqueVec::new();
660
661 uv.push("hello".to_string());
662 uv.push("world".to_string());
663 uv.push("hello".to_string()); assert_eq!(uv.len(), 2);
666 assert!(uv.contains("hello"));
667 assert!(uv.contains("world"));
668 }
669
670 #[test]
671 fn test_counting_writer_overflow() {
672 let mut writer = CountingWriter { count: usize::MAX };
673 let err = writer.write(b"x").unwrap_err();
674
675 assert_eq!(err.kind(), std::io::ErrorKind::Other);
676 assert_eq!(writer.size(), usize::MAX);
677 }
678}