get_size2/impls/std_impls/
collections.rs1use std::collections::{HashMap, HashSet};
2use std::hash::BuildHasher;
3
4use crate::{GetSize, GetSizeTracker};
5
6impl<K, V, S: BuildHasher> GetSize for HashMap<K, V, S>
7where
8 K: GetSize,
9 V: GetSize,
10{
11 fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
12 let (size, tracker) = self
13 .iter()
14 .fold((0, tracker), |(size, tracker), (key, value)| {
15 let (key_size, tracker) = K::get_heap_size_with_tracker(key, tracker);
16 let (value_size, tracker) = V::get_heap_size_with_tracker(value, tracker);
17 (size + key_size + value_size, tracker)
18 });
19
20 let allocation_size = self.capacity() * <(K, V)>::get_stack_size();
21 (size + allocation_size, tracker)
22 }
23}
24
25impl<T, S: BuildHasher> GetSize for HashSet<T, S>
26where
27 T: GetSize,
28{
29 fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
30 let (size, tracker) = self.iter().fold((0, tracker), |(size, tracker), elem| {
31 let (elem_size, tracker) = T::get_heap_size_with_tracker(elem, tracker);
32 (size + elem_size, tracker)
33 });
34
35 let allocation_size = self.capacity() * T::get_stack_size();
36 (size + allocation_size, tracker)
37 }
38}