Skip to main content

get_size2/impls/
ownership.rs

1use std::borrow::Cow;
2use std::rc::{Rc, Weak as RcWeak};
3use std::sync::{Arc, Weak as ArcWeak};
4
5use crate::{GetSize, GetSizeTracker};
6
7impl<T> GetSize for Cow<'_, T>
8where
9    T: ToOwned + ?Sized,
10    T::Owned: GetSize,
11{
12    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
13        match self {
14            Self::Borrowed(_borrowed) => (0, tracker),
15            Self::Owned(owned) => <T::Owned>::get_heap_size_with_tracker(owned, tracker),
16        }
17    }
18}
19
20impl<T> GetSize for &[T] where T: GetSize {}
21
22impl<T> GetSize for &T {}
23impl<T> GetSize for &mut T {}
24impl<T> GetSize for *const T {}
25impl<T> GetSize for *mut T {}
26
27impl<T> GetSize for Box<T>
28where
29    T: GetSize,
30{
31    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
32        T::get_size_with_tracker(&**self, tracker)
33    }
34}
35
36impl<T> GetSize for Rc<T>
37where
38    T: GetSize,
39{
40    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, mut tracker: Tr) -> (usize, Tr) {
41        if tracker.track(Self::as_ptr(self)) {
42            T::get_size_with_tracker(&**self, tracker)
43        } else {
44            (0, tracker)
45        }
46    }
47}
48
49impl<T> GetSize for RcWeak<T> {}
50
51impl<T> GetSize for Arc<T>
52where
53    T: GetSize,
54{
55    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, mut tracker: Tr) -> (usize, Tr) {
56        if tracker.track(Self::as_ptr(self)) {
57            T::get_size_with_tracker(&**self, tracker)
58        } else {
59            (0, tracker)
60        }
61    }
62}
63
64impl<T> GetSize for ArcWeak<T> {}
65
66impl<T> GetSize for Option<T>
67where
68    T: GetSize,
69{
70    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
71        match self {
72            None => (0, tracker),
73            Some(value) => T::get_heap_size_with_tracker(value, tracker),
74        }
75    }
76}
77
78impl<T, E> GetSize for Result<T, E>
79where
80    T: GetSize,
81    E: GetSize,
82{
83    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
84        // The result's stack size already accounts for the values stack size.
85        match self {
86            Ok(value) => T::get_heap_size_with_tracker(value, tracker),
87            Err(err) => E::get_heap_size_with_tracker(err, tracker),
88        }
89    }
90}