Skip to main content

wiwi_memory_usage/impls/
array.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	{ T: MemoryUsage, const N: usize } [T; N]
10	|self| self.as_slice().memory_usage();
11	compacted |self| self.as_slice().memory_usage_compacted();
12	compact |self| self.as_mut_slice().compact_memory();
13	ref compacted |self| self.as_slice().memory_usage_compacted_ref();
14	ref compact |self| self.as_slice().compact_memory_ref();
15}
16
17impl_memory_usage_only_const! {
18	{ T: MemoryUsageConst, const N: usize }
19	{ T: [const] MemoryUsageConst, const N: usize }
20	[T; N]
21	|self| self.as_slice().memory_usage_const();
22}
23
24impl_memory_usage_only_static! {
25	{ T: MemoryUsageStatic, const N: usize }
26	{ T: [const] MemoryUsageStatic, const N: usize }
27	[T; N]
28	// each element counts its own stack usage too
29	=> T::MEMORY_USAGE * N;
30}
31
32#[cfg(test)]
33mod tests {
34	use super::*;
35
36	#[test]
37	fn array_usage() {
38		let str_size = usize::MEMORY_USAGE + <*const ()>::MEMORY_USAGE;
39
40		let array = [1u8, 2, 3, 4, 5];
41
42		assert_eq!(array.memory_usage(), 5);
43		assert_eq!(array.memory_usage_const(), 5);
44		assert_eq!(<[u8; 5]>::MEMORY_USAGE, 5);
45
46		let array = ["1", "12", "123"];
47		let expected = (3 * str_size) + 1 + 2 + 3;
48
49		assert_eq!(array.memory_usage(), expected);
50		assert_eq!(array.memory_usage_const(), expected);
51	}
52}