1#[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#[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]
65macro_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