s2_common/
deep_size.rs

1pub trait DeepSize {
2    /// - size_of(primitive)
3    /// - length for chunks of data like strings and bytes (so not including the container overhead)
4    /// - deep size of all struct fields
5    /// - deep size of actual variant for enums
6    fn deep_size(&self) -> usize;
7}
8
9impl<X: DeepSize, Y: DeepSize> DeepSize for (X, Y) {
10    fn deep_size(&self) -> usize {
11        self.0.deep_size() + self.1.deep_size()
12    }
13}
14
15impl<T: DeepSize> DeepSize for &[T] {
16    fn deep_size(&self) -> usize {
17        self.iter().map(DeepSize::deep_size).sum::<usize>()
18    }
19}
20
21impl<T: DeepSize> DeepSize for Vec<T> {
22    fn deep_size(&self) -> usize {
23        self.iter().map(DeepSize::deep_size).sum::<usize>()
24    }
25}
26
27impl<T: DeepSize> DeepSize for Option<T> {
28    fn deep_size(&self) -> usize {
29        match self {
30            Some(v) => v.deep_size(),
31            None => 1,
32        }
33    }
34}
35
36impl DeepSize for String {
37    fn deep_size(&self) -> usize {
38        self.len()
39    }
40}
41
42impl DeepSize for bytes::Bytes {
43    fn deep_size(&self) -> usize {
44        self.len()
45    }
46}
47
48impl<T: DeepSize> DeepSize for std::ops::Bound<T> {
49    fn deep_size(&self) -> usize {
50        match self {
51            std::ops::Bound::Included(x) => x.deep_size(),
52            std::ops::Bound::Excluded(x) => x.deep_size(),
53            std::ops::Bound::Unbounded => 1,
54        }
55    }
56}
57
58macro_rules! impl_deep_size_prim {
59    ($($t:ty),+) => {
60        $(
61            impl DeepSize for $t {
62                fn deep_size(&self) -> usize {
63                    size_of_val(self)
64                }
65            }
66        )+
67    };
68}
69
70impl_deep_size_prim!(bool, u64, usize, std::num::NonZeroU64);