dfir_rs/util/
clear.rs

1//! Module for the [`Clear`] trait.
2
3use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, LinkedList, VecDeque};
4use std::ffi::OsString;
5
6/// A trait for abstracting over the `.clear()` method available in many
7/// collection types.
8pub trait Clear {
9    /// Clears the collection without neccesarily freeing allocations.
10    fn clear(&mut self);
11}
12
13/// A wrapper struct which implements [`Clear`] by setting self to `Default::default()`.
14#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
15pub struct ClearDefault<T>(pub T)
16where
17    T: Default;
18impl<T> Default for ClearDefault<T>
19where
20    T: Default,
21{
22    fn default() -> Self {
23        Self(Default::default())
24    }
25}
26impl<T> Clear for ClearDefault<T>
27where
28    T: Default,
29{
30    fn clear(&mut self) {
31        *self = ClearDefault(Default::default());
32    }
33}
34
35macro_rules! clear_impl {
36    (
37        $t:ident $( < $( $g:ident ),* > )?
38    ) => {
39        impl $( < $( $g ),* > )? Clear for $t $( < $( $g ),* > )? {
40            fn clear(&mut self) {
41                self.clear()
42            }
43        }
44    }
45}
46
47clear_impl!(BTreeMap<K, V>);
48clear_impl!(BTreeSet<T>);
49clear_impl!(BinaryHeap<T>);
50clear_impl!(HashMap<K, V, S>);
51clear_impl!(HashSet<T, S>);
52clear_impl!(LinkedList<T>);
53clear_impl!(OsString);
54clear_impl!(String);
55clear_impl!(Vec<T>);
56clear_impl!(VecDeque<T>);
57
58impl<T> Clear for Option<T> {
59    fn clear(&mut self) {
60        *self = None;
61    }
62}