Skip to main content

const_tools/
zip.rs

1#[doc(hidden)]
2#[macro_export]
3macro_rules! __zip__expand {
4    ([$(($iae:expr, $ia:ident))*]) => {{
5        let mut oa = $crate::__maybe_uninit_array_uninit();
6        $(
7            let $ia = ::core::mem::ManuallyDrop::new($iae);
8            let $ia = $crate::__manually_drop_inner_ref(&$ia);
9        )*
10        let len = $crate::__same_len!(&oa $(,$ia)*);
11        let mut index = 0;
12        while index < len {
13            oa[index].write(($(unsafe { ::core::ptr::read(&$ia[index]) }),*));
14            index += 1;
15        }
16        unsafe { $crate::__maybe_uninit_array_assume_init(oa) }
17    }};
18}
19
20/// Zips multiple arrays into an array of tuples in const contexts.
21///
22/// # Examples
23///
24/// ```
25/// use const_tools::zip;
26///
27/// const fn zip_two<A, B, const N: usize>(a: [A; N], b: [B; N]) -> [(A, B); N] {
28///     zip!(a, b)
29/// }
30/// ```
31#[macro_export]
32macro_rules! zip {
33    ($($iae:expr),* $(,)?) => {
34        $crate::__zip_left!(
35            [$(($iae, ))*]
36            [(ia0) (ia1) (ia2) (ia3) (ia4) (ia5) (ia6) (ia7) (ia8) (ia9) (ia10) (ia11)]
37            "unsupported number of inputs"
38            $crate::__zip__expand!
39        )
40    };
41}