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