Skip to main content

get_size2/impls/core_impls/
wrappers.rs

1use core::cell::RefCell;
2
3use crate::{GetSize, GetSizeTracker};
4
5impl<T> GetSize for Option<T>
6where
7    T: GetSize,
8{
9    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
10        match self {
11            None => (0, tracker),
12            Some(value) => T::get_heap_size_with_tracker(value, tracker),
13        }
14    }
15}
16
17impl<T, E> GetSize for Result<T, E>
18where
19    T: GetSize,
20    E: GetSize,
21{
22    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
23        // The result's stack size already accounts for the values stack size.
24        match self {
25            Ok(value) => T::get_heap_size_with_tracker(value, tracker),
26            Err(err) => E::get_heap_size_with_tracker(err, tracker),
27        }
28    }
29}
30
31impl<T> GetSize for RefCell<T>
32where
33    T: GetSize,
34{
35    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
36        // We assume that a `RefCell` holds its data on the stack.
37        // Use try_borrow to avoid panicking if the RefCell is already mutably borrowed
38        match self.try_borrow() {
39            Ok(borrowed) => T::get_heap_size_with_tracker(&*borrowed, tracker),
40            Err(_) => {
41                // If the RefCell is already mutably borrowed, we cannot safely access it.
42                // Return 0 for heap size to avoid panic, though this is a rare edge case.
43                (0, tracker)
44            }
45        }
46    }
47}