loupe/memory_usage/
ptr.rs1#[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}