shared_lru/
memory_size.rs1use std::mem::size_of;
2
3pub trait MemorySize {
4 fn bytes(&self) -> usize;
5}
6
7impl<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) {}