1#![doc = include_str!("../README.md")]
2#![cfg_attr(not(test), no_std)]
3
4#[macro_export]
5macro_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 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}