shared_lru/
memory_size.rs

1use std::mem::size_of;
2
3pub trait MemorySize {
4    fn bytes(&self) -> usize;
5}
6
7// TODO(shelbyd): Specialize for T: JustStack.
8impl<T> MemorySize for Vec<T>
9where
10    T: MemorySize,
11{
12    fn bytes(&self) -> usize {
13        size_of::<Self>()
14            + self.iter().map(|v| v.bytes()).sum::<usize>()
15            + (self.capacity() - self.len()) * size_of::<T>()
16    }
17}
18
19impl<T: MemorySize> MemorySize for std::collections::VecDeque<T> {
20    fn bytes(&self) -> usize {
21        size_of::<Self>()
22            + self.iter().map(|v| v.bytes()).sum::<usize>()
23            + (self.capacity() - self.len()) * size_of::<T>()
24    }
25}
26
27impl<K: MemorySize, V: MemorySize> MemorySize for std::collections::HashMap<K, V> {
28    fn bytes(&self) -> usize {
29        size_of::<Self>()
30            + self
31                .iter()
32                .map(|(k, v)| k.bytes() + v.bytes())
33                .sum::<usize>()
34            + (self.capacity() - self.len()) * size_of::<(K, V)>()
35    }
36}
37
38impl MemorySize for str {
39    fn bytes(&self) -> usize {
40        self.len()
41    }
42}
43
44impl MemorySize for String {
45    fn bytes(&self) -> usize {
46        size_of::<Self>() + self.len()
47    }
48}
49
50impl<T> MemorySize for T
51where
52    T: JustStack,
53{
54    fn bytes(&self) -> usize {
55        size_of::<Self>()
56    }
57}
58
59impl<T> MemorySize for Option<T>
60where
61    T: MemorySize,
62{
63    fn bytes(&self) -> usize {
64        size_of::<Self>()
65            + match self {
66                Some(v) => MemorySize::bytes(v),
67                None => 0,
68            }
69    }
70}
71
72#[cfg(feature = "serde_json")]
73impl MemorySize for serde_json::Value {
74    fn bytes(&self) -> usize {
75        use serde_json::Value::*;
76
77        let bonus = match self {
78            Null | Bool(_) | Number(_) => 0,
79            String(s) => s.len(),
80            Array(arr) => arr.iter().map(MemorySize::bytes).sum(),
81            Object(map) => map
82                .iter()
83                .map(|(key, value)| MemorySize::bytes(key) + MemorySize::bytes(value))
84                .sum(),
85        };
86
87        size_of::<Self>() + bonus
88    }
89}
90
91pub trait JustStack {}
92
93impl JustStack for bool {}
94
95impl JustStack for u8 {}
96impl JustStack for u16 {}
97impl JustStack for u32 {}
98impl JustStack for u64 {}
99impl JustStack for usize {}
100
101impl JustStack for i8 {}
102impl JustStack for i16 {}
103impl JustStack for i32 {}
104impl JustStack for i64 {}
105impl JustStack for isize {}
106
107impl<T: ?Sized> JustStack for &T {}
108impl<T: ?Sized> JustStack for &mut T {}
109
110impl<A: JustStack> JustStack for (A,) {}
111impl<A: JustStack, B: JustStack> JustStack for (A, B) {}
112impl<A: JustStack, B: JustStack, C: JustStack> JustStack for (A, B, C) {}