loupe/memory_usage/
option.rs

1#[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 /* variant */ + 1 /* padding */);
27
28        let option: Option<i8> = Some(1);
29        assert_size_of_val_eq!(option, 1 /* variant */ + 1 /* padding */ + 1 /* i8 */);
30
31        let option: Option<i32> = None;
32        assert_size_of_val_eq!(option, 1 /* variant */ + 7 /* padding */);
33
34        let option: Option<i32> = Some(1);
35        assert_size_of_val_eq!(option, 1 /* variant */ + 7 /* padding */ + 4 /* i32 */);
36
37        let option: Option<&str> = None;
38        assert_size_of_val_eq!(option, 1 /* variant */ + 15 /* padding */);
39
40        let option: Option<&str> = Some("abc");
41        assert_size_of_val_eq!(
42            option,
43            1 /* variant */ + 15 /* padding */ + 2 * POINTER_BYTE_SIZE + 1 * 3, /* &str */
44        );
45    }
46}