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);