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 let (elem_size, tracker) = T::get_heap_size_with_tracker(element, tracker);
84 (size + elem_size, tracker)
85 })
86 }
87}