unroll_lite/
lib.rs

1#![doc = include_str!("../README.md")]
2#![cfg_attr(not(test), no_std)]
3
4#[macro_export]
5/// See the [crate-level documentation](crate) for usage examples.
6macro_rules! unroll {
7    ($var:pat_param in ($range:expr).step_by($step:expr) => $body:stmt) => {
8        {
9            let _: usize = $step;
10            let mut __ite = $range.start;
11            let __end = $range.end;
12            let mut __is_first = true;
13            let __step = $step;
14
15            loop {
16                if !__is_first {
17                    __ite += __step
18                }
19                __is_first = false;
20
21                let $var = __ite;
22
23                if __ite >= __end {
24                    break
25                }
26
27                $body
28            }
29        }
30    };
31
32    ($var:pat_param in ($range:expr).rev().step_by($step:expr) => $body:stmt) => {
33        {
34            let _: usize = $step;
35            let mut __ite = $range.end;
36            let __start = $range.start;
37            let mut __is_first = true;
38            let __step = $step;
39
40            loop {
41                if !__is_first {
42                    if __step + __start >= __ite {
43                        break
44                    }
45                    __ite -= __step
46                }
47                __is_first = false;
48
49                if __ite <= __start {
50                    break
51                }
52
53                // cannot underflow as __ite > __start
54                let $var = __ite - 1;
55
56                $body
57            }
58        }
59    };
60
61    ($var:pat_param in ($range:expr).rev() => $body:stmt) => {
62        $crate::unroll!($var in ($range).rev().step_by(1) => $body)
63    };
64
65    ($var:pat_param in ($range:expr).step_by($step:expr).rev() => $body:stmt) => {
66        $crate::unroll!($var in ($range.start..$range.end - ($range.end - $range.start - 1) % $step).rev().step_by($step) => $body)
67    };
68
69    ($var:pat_param in $range:expr => $body:stmt) => {
70        $crate::unroll!($var in ($range).step_by(1) => $body)
71    };
72}