Skip to main content

get_size2/impls/core_impls/
tuples.rs

1use crate::{GetSize, GetSizeTracker};
2
3macro_rules! impl_size_tuple {
4    ($($t:ident, $T:ident),+) => {
5        impl<$($T,)*> GetSize for ($($T,)*)
6        where
7            $(
8                $T: GetSize,
9            )*
10        {
11            #[allow(unused_mut, reason = "the macro supports a variadic number of elements")]
12            #[expect(clippy::allow_attributes, reason = "the macro supports a variadic number of elements")]
13            fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, mut tracker: Tr) -> (usize, Tr) {
14                let mut total = 0;
15                let mut elem_size;
16
17                let ($($t,)*) = self;
18                $(
19                    (elem_size, tracker) = <$T>::get_heap_size_with_tracker($t, tracker);
20                    total += elem_size;
21                )*
22
23                (total, tracker)
24            }
25        }
26    }
27}
28
29macro_rules! execute_tuple_macro_16 {
30    ($name:ident) => {
31        $name!(v1, V1);
32        $name!(v1, V1, v2, V2);
33        $name!(v1, V1, v2, V2, v3, V3);
34        $name!(v1, V1, v2, V2, v3, V3, v4, V4);
35        $name!(v1, V1, v2, V2, v3, V3, v4, V4, v5, V5);
36        $name!(v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6);
37        $name!(v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7);
38        $name!(
39            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8
40        );
41        $name!(
42            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8, v9, V9
43        );
44        $name!(
45            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8, v9, V9, v10, V10
46        );
47        $name!(
48            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8, v9, V9, v10, V10, v11,
49            V11
50        );
51        $name!(
52            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8, v9, V9, v10, V10, v11,
53            V11, v12, V12
54        );
55        $name!(
56            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8, v9, V9, v10, V10, v11,
57            V11, v12, V12, v13, V13
58        );
59        $name!(
60            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8, v9, V9, v10, V10, v11,
61            V11, v12, V12, v13, V13, v14, V14
62        );
63        $name!(
64            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8, v9, V9, v10, V10, v11,
65            V11, v12, V12, v13, V13, v14, V14, v15, V15
66        );
67        $name!(
68            v1, V1, v2, V2, v3, V3, v4, V4, v5, V5, v6, V6, v7, V7, v8, V8, v9, V9, v10, V10, v11,
69            V11, v12, V12, v13, V13, v14, V14, v15, V15, v16, V16
70        );
71    };
72}
73
74execute_tuple_macro_16!(impl_size_tuple);
75
76impl<T, const SIZE: usize> GetSize for [T; SIZE]
77where
78    T: GetSize,
79{
80    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
81        self.iter().fold((0, tracker), |(size, tracker), element| {
82            // The array stack size already accounts for the stack size of the elements of the array.
83            let (elem_size, tracker) = T::get_heap_size_with_tracker(element, tracker);
84            (size + elem_size, tracker)
85        })
86    }
87}