Skip to main content

wiwi_memory_usage/impls/
string.rs

1#[cfg(feature = "std")]
2use crate::macros::impl_memory_usage;
3use crate::macros::impl_memory_usage_const;
4
5impl_memory_usage_const! {
6	str |self| self.len();
7}
8
9#[cfg(feature = "std")]
10impl_memory_usage! {
11	String
12	|self| size_of::<String>() + self.capacity();
13	compacted |self| size_of::<String>() + self.len();
14	compact |self| {
15		let old_cap = self.capacity();
16		self.shrink_to_fit();
17		old_cap - self.len()
18	};
19	// can't do anything to compact string behind a ref
20	// not getting any benefit from calling it on the u8s lmao
21}
22
23#[cfg(test)]
24mod tests {
25	#[cfg(feature = "std")]
26	use crate::MemoryUsageStatic as _;
27	use crate::{ MemoryUsage as _, MemoryUsageConst as _ };
28
29	#[test]
30	fn str_usage() {
31		let str = "awawawa";
32
33		assert_eq!(str.memory_usage(), 7);
34		assert_eq!(str.memory_usage_const(), 7);
35	}
36
37	#[cfg(feature = "std")]
38	#[test]
39	fn string_usage() {
40		let string_size = <*const u8>::MEMORY_USAGE + usize::MEMORY_USAGE + usize::MEMORY_USAGE;
41
42		let mut string = String::with_capacity(247);
43		let string_capacity = string.capacity();
44		string.push_str("awawawa");
45		let expected = string_size + string_capacity;
46		let expected_compacted = string_size + 7;
47		let expected_compact = expected - expected_compacted;
48
49		assert_eq!(string.memory_usage(), expected);
50		assert_eq!(string.memory_usage_compacted(), expected_compacted);
51		assert_eq!(string.compact_memory(), expected_compact);
52	}
53}