1#![cfg_attr(not(feature = "std"), no_std)]
2
3#[cfg(not(feature = "std"))]
4#[doc(hidden)]
5extern crate alloc;
6
7#[cfg(not(feature = "std"))]
8pub use alloc::*;
9
10#[cfg(not(feature = "std"))]
11pub use core::*;
12
13#[cfg(not(feature = "std"))]
14pub mod fmt {
15 pub use alloc::fmt::*;
16 pub use core::fmt::*;
17}
18
19#[cfg(not(feature = "std"))]
20pub mod borrow {
21 pub use alloc::borrow::*;
22 pub use core::borrow::*;
23}
24
25#[cfg(not(feature = "std"))]
26pub mod slice {
27 pub use alloc::slice::*;
28 pub use core::slice::*;
29}
30
31#[cfg(not(feature = "std"))]
32pub mod str {
33 pub use alloc::str::*;
34 pub use core::str::*;
35}
36
37#[cfg(not(feature = "std"))]
38pub mod io;
39
40#[cfg(not(feature = "std"))]
41pub mod error;
42
43#[cfg(feature = "std")]
44#[doc(hidden)]
45pub use std::*;
46
47#[cfg(target_has_atomic = "ptr")]
48#[doc(hidden)]
49pub mod sync {
50 #[cfg(not(feature = "std"))]
51 pub use alloc::sync::*;
52 #[cfg(feature = "std")]
53 pub use std::sync::*;
54}
55
56mod rand_helper;
57pub use rand_helper::*;
58
59pub mod perf_trace;
60
61pub mod iterable;
62
63pub use num_traits::{One, Zero};
64
65#[inline(always)]
79pub const fn log2(x: usize) -> u32 {
80 if x == 0 {
81 0
82 } else if x.is_power_of_two() {
83 1usize.leading_zeros() - x.leading_zeros()
84 } else {
85 0usize.leading_zeros() - x.leading_zeros()
86 }
87}
88
89#[macro_export]
94macro_rules! cfg_iter {
95 ($e: expr, $min_len: expr) => {{
96 #[cfg(feature = "parallel")]
97 let result = $e.par_iter().with_min_len($min_len);
98
99 #[cfg(not(feature = "parallel"))]
100 let result = $e.iter();
101
102 result
103 }};
104 ($e: expr) => {{
105 #[cfg(feature = "parallel")]
106 let result = $e.par_iter();
107
108 #[cfg(not(feature = "parallel"))]
109 let result = $e.iter();
110
111 result
112 }};
113}
114
115#[macro_export]
120macro_rules! cfg_iter_mut {
121 ($e: expr, $min_len: expr) => {{
122 #[cfg(feature = "parallel")]
123 let result = $e.par_iter_mut().with_min_len($min_len);
124
125 #[cfg(not(feature = "parallel"))]
126 let result = $e.iter_mut();
127
128 result
129 }};
130 ($e: expr) => {{
131 #[cfg(feature = "parallel")]
132 let result = $e.par_iter_mut();
133
134 #[cfg(not(feature = "parallel"))]
135 let result = $e.iter_mut();
136
137 result
138 }};
139}
140
141#[macro_export]
146macro_rules! cfg_into_iter {
147 ($e: expr, $min_len: expr) => {{
148 #[cfg(feature = "parallel")]
149 let result = $e.into_par_iter().with_min_len($min_len);
150
151 #[cfg(not(feature = "parallel"))]
152 let result = $e.into_iter();
153
154 result
155 }};
156 ($e: expr) => {{
157 #[cfg(feature = "parallel")]
158 let result = $e.into_par_iter();
159
160 #[cfg(not(feature = "parallel"))]
161 let result = $e.into_iter();
162
163 result
164 }};
165}
166
167#[macro_export]
170macro_rules! cfg_chunks {
171 ($e: expr, $size: expr) => {{
172 #[cfg(feature = "parallel")]
173 let result = $e.par_chunks($size);
174
175 #[cfg(not(feature = "parallel"))]
176 let result = $e.chunks($size);
177
178 result
179 }};
180}
181
182#[macro_export]
185macro_rules! cfg_chunks_mut {
186 ($e: expr, $size: expr) => {{
187 #[cfg(feature = "parallel")]
188 let result = $e.par_chunks_mut($size);
189
190 #[cfg(not(feature = "parallel"))]
191 let result = $e.chunks_mut($size);
192
193 result
194 }};
195}
196
197#[cfg(test)]
198mod test {
199 use super::*;
200 #[cfg(feature = "parallel")]
201 use rayon::prelude::*;
202
203 #[test]
204 fn test_cfg_macros() {
205 #[cfg(feature = "parallel")]
206 println!("In parallel mode");
207
208 let mut thing = crate::vec![1, 2, 3, 4, 5u64];
209 println!("Iterating");
210 cfg_iter!(&thing).for_each(|i| println!("{:?}", i));
211 println!("Iterating Mut");
212 cfg_iter_mut!(&mut thing).for_each(|i| *i += 1);
213 println!("Iterating By Value");
214 cfg_into_iter!(thing.clone()).for_each(|i| println!("{:?}", i));
215 println!("Chunks");
216 cfg_chunks!(&thing, 2).for_each(|chunk| println!("{:?}", chunk));
217 println!("Chunks Mut");
218 cfg_chunks_mut!(&mut thing, 2).for_each(|chunk| println!("{:?}", chunk));
219
220 println!("Iterating");
221 cfg_iter!(&thing, 3).for_each(|i| println!("{:?}", i));
222 println!("Iterating Mut");
223 cfg_iter_mut!(&mut thing, 3).for_each(|i| *i += 1);
224 println!("Iterating By Value");
225 cfg_into_iter!(thing, 3).for_each(|i| println!("{:?}", i));
226 }
227}