1pub trait DeepSize {
2 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);