Skip to main content

huski_auxies/
lib.rs

1//! Auxiliaries for huski implementation.
2
3/// Collects and concats `RangeInclusive<usize>` expression
4/// listing into `Vec<usize>`.
5///
6/// ```
7/// use huski_auxies::ccr1;
8/// let ri = 0..=3;
9/// let rs = ccr1!(0..=2,ri.clone());
10/// assert_eq!(0, rs[3]);
11/// ```
12#[macro_export]
13macro_rules! ccr1 {
14    ( $($r:expr),*) => {
15        {
16            let mut cap = 0;
17            $(
18                cap += $r.end() - $r.start() + 1;
19            )*
20
21            let mut rs = Vec::<usize>::with_capacity(cap);
22
23            $(
24                let sc = rs.spare_capacity_mut();
25                let mut wix = 0;
26                for i in $r.clone() {
27                    sc[wix].write(i);
28                    wix +=1;
29                }
30
31                unsafe {
32                    rs.set_len(rs.len() + wix);
33                }
34            )*
35
36            rs
37        }
38    }
39}
40
41/// Collects and concats `RangeInclusive<usize>`
42/// expressions from within for-loop iteratable into `Vec<usize>`.
43///
44/// ```
45/// use huski_auxies::{len, ccr1, ccr2};
46/// let ri = 0..=3;
47/// let rs = ccr2!(&[0..=2,ri.clone()]);
48/// assert_eq!(0, rs[3]);
49/// ```
50#[macro_export]
51macro_rules! ccr2 {
52    ($i:expr) => {{
53        let cap = len!($i);
54        let mut rs = Vec::<usize>::with_capacity(cap);
55
56        for r in $i {
57            rs.extend_from_slice(&ccr1!(r));
58        }
59
60        rs
61    }};
62}
63
64#[macro_export]
65/// Computes cumulative length of `RangeInclusive`s from within for-loop iteratable.
66///
67/// ```
68/// use huski_auxies::len;
69/// let len = len!(&[0..=2,0..=3]);
70/// assert_eq!(7, len);
71/// ```
72macro_rules! len {
73    ($i:expr) => {{
74        let mut len = 0;
75        for r in $i {
76            len += r.end() - r.start() + 1;
77        }
78
79        len
80    }};
81}
82
83#[cfg(test)]
84mod tests_of_units {
85
86    #[test]
87    fn ccr1() {
88        let r_1 = 0..=2;
89        let r_2 = 0..=3;
90
91        let rs = ccr1!(&r_1, &r_2);
92
93        assert_eq!(7, rs.len());
94        assert!(7 <= rs.capacity());
95        assert_eq!(2, rs[2]);
96        assert_eq!(3, rs[6]);
97    }
98
99    #[test]
100    fn ccr2() {
101        let r_1 = 0..=2;
102        let r_2 = 0..=3;
103        let rs = [r_1, r_2];
104
105        let test = ccr2!(&rs);
106
107        assert_eq!(7, test.len());
108        assert!(7 <= test.capacity());
109        assert_eq!(2, test[2]);
110        assert_eq!(3, test[6]);
111    }
112
113    #[test]
114    fn len() {
115        let r_1 = 0..=2;
116        let r_2 = 0..=3;
117        let rs = [r_1, r_2];
118
119        let len = len!(&rs);
120        assert_eq!(7, len);
121    }
122}
123
124// cargo fmt & cargo test --release