Skip to main content

wiwi_memory_usage/impls/
option.rs

1use crate::{ MemoryUsage, MemoryUsageConst };
2use crate::macros::{ impl_memory_usage, impl_memory_usage_only_const };
3
4impl_memory_usage! {
5	{ T: MemoryUsage }
6	Option<T>
7	|self| match self {
8		Some(val) => {
9			let remaining = size_of::<Option<T>>() - size_of::<T>();
10			val.memory_usage() + remaining
11		}
12		None => { size_of::<Option<T>>() }
13	};
14	compacted |self| match self {
15		Some(val) => {
16			let remaining = size_of::<Option<T>>() - size_of::<T>();
17			val.memory_usage_compacted() + remaining
18		}
19		None => { size_of::<Option<T>>() }
20	};
21	compact |self| match self {
22		Some(val) => { val.compact_memory() }
23		None => { 0 }
24	};
25	ref compacted |self| match self {
26		Some(val) => {
27			let remaining = size_of::<Option<T>>() - size_of::<T>();
28			val.memory_usage_compacted_ref() + remaining
29		}
30		None => { size_of::<Option<T>>() }
31	};
32	ref compact |self| match self {
33		Some(val) => { val.compact_memory_ref() }
34		None => { 0 }
35	};
36}
37
38impl_memory_usage_only_const! {
39	{ T: MemoryUsageConst }
40	{ T: [const] MemoryUsageConst }
41	Option<T>
42	|self| match self {
43		Some(val) => {
44			let remaining = size_of::<Option<T>>() - size_of::<T>();
45			val.memory_usage_const() + remaining
46		}
47		None => { size_of::<Option<T>>() }
48	};
49
50}
51
52// Option can't be MemoryUsageStatic because it might or might not have a value
53// with indirect memory (ex. Option<&usize>, &usize is MemoryUsageStatic, but
54// Option could be either Some (2 * size_of::<usize>()) or None (size_of::<usize>()))