const_tools/
map.rs

1#[macro_export]
2macro_rules! map {
3    // [args] [cb]
4    (@parse [zip!($($iae:expr),* $(,)?), |($($iip:pat_param),* $(,)?)| $($body:tt)*] $($cb:tt)*) => {
5        $crate::__zip_left!(
6            [$(($iae, $iip, ))*]
7            [(ia0) (ia1) (ia2) (ia3) (ia4) (ia5) (ia6) (ia7) (ia8) (ia9) (ia10) (ia11)]
8            "unsupported number of inputs"
9            $($cb)*([$($body)*] <>)
10        )
11    };
12    (@parse [zip!($($iae:expr),* $(,)?), $fn:expr] $($cb:tt)*) => {
13        $crate::__zip_left!(
14            [$(($iae, ))*]
15            [(ii0, ia0) (ii1, ia1) (ii2, ia2) (ii3, ia3) (ii4, ia4) (ii5, ia5) (ii6, ia6) (ii7, ia7) (ii8, ia8) (ii9, ia9) (ii10, ia10) (ii11, ia11)]
16            "unsupported number of inputs"
17            $crate::map!(@parse_fn [$fn] <> $($cb)*)
18        )
19    };
20    (@parse [$iae:expr, |$iip:pat_param| $($body:tt)*] $($cb:tt)*) => {
21        $crate::__call!($($cb)*([$($body)*] [($iae, $iip, ia0)]))
22    };
23    (@parse [$iae:expr, $fn:expr]  $($cb:tt)*) => {
24        $crate::__call!($($cb)*([$fn(ii)] [($iae, ii, ia)]))
25    };
26    // [fn] [(iae, ii, ia)]
27    (@parse_fn [$fn:expr] [$(($iae:expr, $ii:ident, $ia:ident))*] $($cb:tt)*) => {
28        $crate::__call!($($cb)*([$fn(($($ii,)*))] [$(($iae, $ii, $ia))*]))
29    };
30    // [body] [(iae, iip, ia)]
31    (@expand [$body:expr] [$(($iae:expr, $iip:pat_param, $ia:ident))*]) => {{
32        let mut oa = $crate::__maybe_uninit_array_uninit();
33        $(
34            let $ia = ::core::mem::ManuallyDrop::new($iae);
35            let $ia = $crate::__manually_drop_inner_ref(&$ia);
36        )*
37        let len = $crate::__same_len!(&oa $(,$ia)*);
38        let mut index = 0;
39        while index < len {
40            $(
41                let $iip = unsafe { ::core::ptr::read(&$ia[index]) };
42            )*
43            oa[index].write($body);
44            index += 1;
45        }
46        assert!(
47            index == len,
48            "break is not allowed because a value must be written into every array element"
49        );
50        unsafe { $crate::__maybe_uninit_array_assume_init(oa) }
51    }};
52    ($($map_args:tt)*) => {
53        $crate::map!(@parse [$($map_args)*] $crate::map!(@expand <>))
54    };
55}