loupe/memory_usage/
option.rs1#[cfg(test)]
2use crate::{assert_size_of_val_eq, POINTER_BYTE_SIZE};
3use crate::{MemoryUsage, MemoryUsageTracker};
4use std::mem;
5
6impl<T> MemoryUsage for Option<T>
7where
8 T: MemoryUsage,
9{
10 fn size_of_val(&self, tracker: &mut dyn MemoryUsageTracker) -> usize {
11 mem::size_of_val(self)
12 + self
13 .iter()
14 .map(|value| value.size_of_val(tracker))
15 .sum::<usize>()
16 }
17}
18
19#[cfg(test)]
20mod test_option_types {
21 use super::*;
22
23 #[test]
24 fn test_option() {
25 let option: Option<i8> = None;
26 assert_size_of_val_eq!(option, 1 + 1 );
27
28 let option: Option<i8> = Some(1);
29 assert_size_of_val_eq!(option, 1 + 1 + 1 );
30
31 let option: Option<i32> = None;
32 assert_size_of_val_eq!(option, 1 + 7 );
33
34 let option: Option<i32> = Some(1);
35 assert_size_of_val_eq!(option, 1 + 7 + 4 );
36
37 let option: Option<&str> = None;
38 assert_size_of_val_eq!(option, 1 + 15 );
39
40 let option: Option<&str> = Some("abc");
41 assert_size_of_val_eq!(
42 option,
43 1 + 15 + 2 * POINTER_BYTE_SIZE + 1 * 3, );
45 }
46}