proc_unroll 0.1.1

Proc macro to unroll for loops
Documentation
use proc_unroll::unroll;

macro_rules! make_test {
    ($name:ident -> $type:ty, { $($body:tt)* }) => {
        #[test]
        fn $name() {
            fn normal() -> $type {
                $($body)*
            }

            #[unroll]
            fn unrolled() -> $type {
                $($body)*
            }

            assert_eq!(normal(), unrolled());
        }
    };
}

make_test!(simple -> Vec<isize>, {
    let mut vec = vec![];
    for x in 0..5 {
        vec.push(x);
    }
    vec
});

make_test!(negative -> Vec<isize>, {
    let mut vec = vec![];
    for x in -2..5 {
        vec.push(x);
    }
    vec
});

make_test!(suffixed -> Vec<isize>, {
    let mut vec = vec![];
    for x in 0..5usize {
        vec.push(x as isize);
    }
    vec
});

make_test!(slice -> Vec<isize>, {
    let mut vec = vec![];
    for &x in &[2, 4, 6, 8] {
        vec.push(x);
    }
    vec
});

#[test]
fn const_fn_range() {
    #[unroll]
    const fn inner() -> usize {
        let mut total = 0;
        for x in 1..5 {
            total += x;
        }
        total
    }

    assert_eq!(inner(), 10);
}

#[test]
fn const_fn_slice() {
    #[unroll]
    const fn inner() -> i32 {
        let mut total = 0;
        for x in &[5, 15] {
            total += *x;
        }
        total
    }

    assert_eq!(inner(), 20);
}