wiwi_memory_usage/impls/
reference.rs1use crate::{ MemoryUsage, MemoryUsageStatic };
2use crate::macros::{ impl_memory_usage, impl_memory_usage_only_static };
3
4impl_memory_usage! {
5 { 'h, T: MemoryUsage + ?Sized }
6 { 'h, T: [const] MemoryUsage + ?Sized }
7 &'h T
8 |self| size_of::<&'h T>() + (*self).memory_usage();
9 ref compacted |self| (**self).memory_usage_compacted_ref();
10 ref compact |self| (**self).compact_memory_ref();
11}
12
13impl_memory_usage_only_static! {
14 { 'h, T: MemoryUsageStatic + ?Sized }
15 { 'h, T: [const] MemoryUsageStatic + ?Sized }
16 &'h T
17 => size_of::<&'h T>() + T::MEMORY_USAGE;
18}
19
20impl_memory_usage! {
21 { 'h, T: MemoryUsage + ?Sized }
22 { 'h, T: [const] MemoryUsage + ?Sized }
23 &'h mut T
24 |self| size_of::<&'h mut T>() + (**self).memory_usage();
25 compacted |self| (**self).memory_usage_compacted();
26 compact |self| (**self).compact_memory();
27 ref compacted |self| (**self).memory_usage_compacted_ref();
28 ref compact |self| (**self).compact_memory_ref();
29}
30
31impl_memory_usage_only_static! {
32 { 'h, T: MemoryUsageStatic + ?Sized }
33 { 'h, T: [const] MemoryUsageStatic + ?Sized }
34 &'h mut T
35 => size_of::<&'h mut T>() + T::MEMORY_USAGE;
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn reference_usage() {
44 let ref_size = cfg_select! {
45 target_pointer_width = "16" => { 2 }
46 target_pointer_width = "32" => { 4 }
47 target_pointer_width = "64" => { 8 }
48 };
49
50 let reference = &0u8;
51 let expected = ref_size + u8::MEMORY_USAGE;
52
53 assert_eq!((&reference).memory_usage(), expected);
54 assert_eq!(<&u8>::MEMORY_USAGE, expected);
55 }
56
57 #[test]
58 fn reference_dst_usage() {
59 let ref_size = cfg_select! {
60 target_pointer_width = "16" => { 4 }
61 target_pointer_width = "32" => { 8 }
62 target_pointer_width = "64" => { 16 }
63 };
64
65 let reference = &[0u8; 5] as &[_];
66 let expected = ref_size + (5 * u8::MEMORY_USAGE);
67
68 assert_eq!((&reference).memory_usage(), expected);
69 }
70
71 #[test]
72 fn reference_mut_usage() {
73 let ref_size = cfg_select! {
74 target_pointer_width = "16" => { 2 }
75 target_pointer_width = "32" => { 4 }
76 target_pointer_width = "64" => { 8 }
77 };
78
79 let reference = &mut 0u8;
80 let expected = ref_size + u8::MEMORY_USAGE;
81
82 assert_eq!((&reference).memory_usage(), expected);
83 assert_eq!(<&mut u8>::MEMORY_USAGE, expected);
84 }
85
86 #[test]
87 fn reference_mut_dst_usage() {
88 let ref_size = cfg_select! {
89 target_pointer_width = "16" => { 4 }
90 target_pointer_width = "32" => { 8 }
91 target_pointer_width = "64" => { 16 }
92 };
93
94 let reference = &mut [0u8; 5] as &mut [_];
95 let expected = ref_size + (5 * u8::MEMORY_USAGE);
96
97 assert_eq!((&reference).memory_usage(), expected);
98 }
99}