loupe/memory_usage/
ptr.rs

1#[cfg(test)]
2use crate::assert_size_of_val_eq;
3use crate::{MemoryUsage, MemoryUsageTracker, POINTER_BYTE_SIZE};
4use std::mem;
5use std::ptr::NonNull;
6
7impl<T> MemoryUsage for *const T {
8    fn size_of_val(&self, _tracker: &mut dyn MemoryUsageTracker) -> usize {
9        POINTER_BYTE_SIZE
10    }
11}
12
13impl<T> MemoryUsage for *mut T {
14    fn size_of_val(&self, _tracker: &mut dyn MemoryUsageTracker) -> usize {
15        POINTER_BYTE_SIZE
16    }
17}
18
19impl<T> MemoryUsage for NonNull<T> {
20    fn size_of_val(&self, _tracker: &mut dyn MemoryUsageTracker) -> usize {
21        POINTER_BYTE_SIZE
22    }
23}
24
25#[cfg(test)]
26mod test_pointer_types {
27    use super::*;
28
29    #[test]
30    fn test_pointer() {
31        let x = 1i8;
32        let ptr = &x as *const _;
33        assert_size_of_val_eq!(ptr, POINTER_BYTE_SIZE);
34    }
35
36    #[test]
37    fn test_mutable_pointer() {
38        let mut x = 1i8;
39        let ptr = &mut x as *mut _;
40        assert_size_of_val_eq!(ptr, POINTER_BYTE_SIZE);
41    }
42
43    #[test]
44    fn test_nonnull_pointer() {
45        let mut x = 1i8;
46        let ptr = NonNull::new(&mut x as *mut _).unwrap();
47        assert_size_of_val_eq!(ptr, POINTER_BYTE_SIZE);
48    }
49}
50
51impl<T> MemoryUsage for &T
52where
53    T: MemoryUsage,
54{
55    fn size_of_val(&self, tracker: &mut dyn MemoryUsageTracker) -> usize {
56        mem::size_of_val(self)
57            + if tracker.track(*self as *const T as *const ()) {
58                (*self).size_of_val(tracker)
59            } else {
60                0
61            }
62    }
63}
64
65impl<T> MemoryUsage for &mut T
66where
67    T: MemoryUsage,
68{
69    fn size_of_val(&self, tracker: &mut dyn MemoryUsageTracker) -> usize {
70        mem::size_of_val(self)
71            + if tracker.track(*self as *const T as *const ()) {
72                MemoryUsage::size_of_val(*self, tracker)
73            } else {
74                0
75            }
76    }
77}
78
79#[cfg(test)]
80mod test_reference_types {
81    use super::*;
82
83    #[test]
84    fn test_reference() {
85        assert_size_of_val_eq!(&1i8, POINTER_BYTE_SIZE + 1);
86        assert_size_of_val_eq!(&1i64, POINTER_BYTE_SIZE + 8);
87    }
88
89    #[test]
90    fn test_mutable_reference() {
91        assert_size_of_val_eq!(&mut 1i8, POINTER_BYTE_SIZE + 1);
92        assert_size_of_val_eq!(&mut 1i64, POINTER_BYTE_SIZE + 8);
93    }
94}