Skip to main content

aphyn_reflection/
tuple_from_vec_of_any.rs

1use std::any::Any;
2
3pub trait TupleFromVecOfAny: 'static + Sized {
4    fn tuple_from_vec_of_any(v: Vec<Box<dyn Any>>) -> Option<Self>;
5    fn tuple_into_vec_of_any(self) -> Vec<Box<dyn Any>>;
6}
7
8macro_rules! tuple_from_vec_of_any_impl {
9    ($($P: ident),*) => {
10        impl<$($P: 'static),*> TupleFromVecOfAny for ($($P,)*) {
11            fn tuple_from_vec_of_any(mut _v: Vec<Box<dyn Any>>) -> Option<Self> {
12                let boxed_array: Box<[Box<dyn Any>; count!($($P),*)]> = _v.into_boxed_slice().try_into().ok()?;
13
14                #[allow(non_snake_case)]
15                let [$($P),*] = *boxed_array;
16
17                Some((
18                    $(*$P.downcast().ok()?,)*
19                ))
20            }
21            fn tuple_into_vec_of_any(self) -> Vec<Box<dyn Any>> {
22                #[allow(non_snake_case)]
23                let ($($P,)*) = self;
24
25                vec![
26                    $( Box::new($P), )*
27                ]
28            }
29        }
30    };
31}
32
33macro_rules! count {
34    () => { 0 };
35    ($t: ident$(, $ts: ident)*) => { 1 + count!($($ts),*) };
36}
37
38tuple_from_vec_of_any_impl!();
39tuple_from_vec_of_any_impl!(P0);
40tuple_from_vec_of_any_impl!(P0, P1);
41tuple_from_vec_of_any_impl!(P0, P1, P2);
42tuple_from_vec_of_any_impl!(P0, P1, P2, P3);
43tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4);
44tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5);
45tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6);
46tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7);
47tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7, P8);
48tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9);
49tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10);
50tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11);
51tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12);
52tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13);
53tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14);
54tuple_from_vec_of_any_impl!(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15);