Skip to main content

wiwi_memory_usage/impls/
reference.rs

1use 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}