Skip to main content

get_size2/impls/std_impls/
collections.rs

1use 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}