Skip to main content

wiwi_memory_usage/impls/
slice.rs

1use crate::{ MemoryUsage, MemoryUsageConst };
2use crate::macros::{ impl_memory_usage, impl_memory_usage_only_const };
3
4impl_memory_usage! {
5	{ T: MemoryUsage }
6	[T]
7	|self| {
8		// each element counts its own stack usage too
9		self.iter().map(T::memory_usage).sum()
10	};
11	compacted |self| self.iter().map(T::memory_usage_compacted).sum();
12	compact |self| self.iter_mut().map(T::compact_memory).sum();
13	ref compacted |self| self.iter().map(T::memory_usage_compacted_ref).sum();
14	ref compact |self| self.iter().map(T::compact_memory_ref).sum();
15}
16
17impl_memory_usage_only_const! {
18	{ T: MemoryUsageConst }
19	{ T: [const] MemoryUsageConst }
20	[T]
21	|self| {
22		// each element counts its own stack usage too
23		// must use verbose syntax because traits are not const
24		// (this matters with nightly feature enabled)
25		let mut total = 0;
26		let mut i = 0;
27		let len = self.len();
28
29		while i < len {
30			total += self[i].memory_usage_const();
31			i += 1;
32		}
33
34		total
35	};
36}
37
38#[cfg(test)]
39mod tests {
40	use super::*;
41	use crate::MemoryUsageStatic as _;
42
43	#[test]
44	fn slice_usage() {
45		let str_size = usize::MEMORY_USAGE + <*const ()>::MEMORY_USAGE;
46
47		let slice = &[1u8, 2, 3, 4, 5] as &[_];
48
49		assert_eq!((*slice).memory_usage(), 5);
50		assert_eq!((*slice).memory_usage_const(), 5);
51
52		let slice = &["1", "12", "123"] as &[_];
53		let expected = (3 * str_size) + 1 + 2 + 3;
54
55		assert_eq!((*slice).memory_usage(), expected);
56		assert_eq!((*slice).memory_usage_const(), expected);
57	}
58}