Skip to main content

wiwi_memory_usage/impls/
reference.rs

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