1 extern crate heapsize;
2 
3 use self::heapsize::{heap_size_of, HeapSizeOf};
4 use std::hash::{BuildHasher, Hash};
5 
6 use {KeyRef, LinkedHashMap, Node};
7 
8 impl<K> HeapSizeOf for KeyRef<K> {
heap_size_of_children(&self) -> usize9     fn heap_size_of_children(&self) -> usize {
10         0
11     }
12 }
13 
14 impl<K, V> HeapSizeOf for Node<K, V>
15 where
16     K: HeapSizeOf,
17     V: HeapSizeOf,
18 {
heap_size_of_children(&self) -> usize19     fn heap_size_of_children(&self) -> usize {
20         self.key.heap_size_of_children() + self.value.heap_size_of_children()
21     }
22 }
23 
24 impl<K, V, S> HeapSizeOf for LinkedHashMap<K, V, S>
25 where
26     K: HeapSizeOf + Hash + Eq,
27     V: HeapSizeOf,
28     S: BuildHasher,
29 {
heap_size_of_children(&self) -> usize30     fn heap_size_of_children(&self) -> usize {
31         unsafe {
32             let mut size = self.map.heap_size_of_children();
33             for &value in self.map.values() {
34                 size += (*value).heap_size_of_children();
35                 size += heap_size_of(value as *const _ as *const _);
36             }
37 
38             if !self.head.is_null() {
39                 size += heap_size_of(self.head as *const _ as *const _);
40             }
41 
42             let mut free = self.free;
43             while !free.is_null() {
44                 size += heap_size_of(free as *const _ as *const _);
45                 free = (*free).next
46             }
47 
48             size
49         }
50     }
51 }
52