get_size2/impls/
ownership.rs1use 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 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}