1#![cfg_attr(not(feature = "std"), no_std)]
2#![allow(ambiguous_glob_reexports)]
3
4#[cfg(not(feature = "std"))]
5pub extern 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}
17
18#[cfg(not(feature = "std"))]
19pub mod borrow {
20 pub use alloc::borrow::*;
21}
22
23#[cfg(not(feature = "std"))]
24pub mod slice {
25 pub use alloc::slice::*;
26 pub use core::slice::*;
27}
28
29#[cfg(not(feature = "std"))]
30pub mod str {
31 pub use alloc::str::*;
32 pub use core::str::*;
33}
34
35#[cfg(not(feature = "std"))]
36pub mod io;
37
38#[cfg(feature = "std")]
39#[doc(hidden)]
40pub use std::*;
41
42#[cfg(target_has_atomic = "ptr")]
43#[doc(hidden)]
44pub mod sync {
45 #[cfg(not(feature = "std"))]
46 pub use alloc::sync::*;
47 #[cfg(feature = "std")]
48 pub use std::sync::*;
49}
50
51mod rand_helper;
52pub use rand_helper::*;
53
54pub mod perf_trace;
55
56pub use num_traits::{One, Zero};
57
58#[macro_export]
64macro_rules! cfg_iter {
65 ($e:expr, $min_len:expr) => {{
66 #[cfg(feature = "parallel")]
67 let result = $e.par_iter().with_min_len($min_len);
68
69 #[cfg(not(feature = "parallel"))]
70 let result = $e.iter();
71
72 result
73 }};
74 ($e:expr) => {{
75 #[cfg(feature = "parallel")]
76 let result = $e.par_iter();
77
78 #[cfg(not(feature = "parallel"))]
79 let result = $e.iter();
80
81 result
82 }};
83}
84
85#[macro_export]
91macro_rules! cfg_iter_mut {
92 ($e:expr, $min_len:expr) => {{
93 #[cfg(feature = "parallel")]
94 let result = $e.par_iter_mut().with_min_len($min_len);
95
96 #[cfg(not(feature = "parallel"))]
97 let result = $e.iter_mut();
98
99 result
100 }};
101 ($e:expr) => {{
102 #[cfg(feature = "parallel")]
103 let result = $e.par_iter_mut();
104
105 #[cfg(not(feature = "parallel"))]
106 let result = $e.iter_mut();
107
108 result
109 }};
110}
111
112#[macro_export]
117macro_rules! cfg_into_iter {
118 ($e:expr, $min_len:expr) => {{
119 #[cfg(feature = "parallel")]
120 let result = $e.into_par_iter().with_min_len($min_len);
121
122 #[cfg(not(feature = "parallel"))]
123 let result = $e.into_iter();
124
125 result
126 }};
127 ($e:expr) => {{
128 #[cfg(feature = "parallel")]
129 let result = $e.into_par_iter();
130
131 #[cfg(not(feature = "parallel"))]
132 let result = $e.into_iter();
133
134 result
135 }};
136}
137
138#[macro_export]
141macro_rules! cfg_chunks {
142 ($e: expr, $size: expr) => {{
143 #[cfg(feature = "parallel")]
144 let result = $e.par_chunks($size);
145
146 #[cfg(not(feature = "parallel"))]
147 let result = $e.chunks($size);
148
149 result
150 }};
151}
152
153#[macro_export]
156macro_rules! cfg_chunks_mut {
157 ($e: expr, $size: expr) => {{
158 #[cfg(feature = "parallel")]
159 let result = $e.par_chunks_mut($size);
160
161 #[cfg(not(feature = "parallel"))]
162 let result = $e.chunks_mut($size);
163
164 result
165 }};
166}
167
168#[cfg(test)]
169mod test {
170 use super::*;
171 #[cfg(feature = "parallel")]
172 use rayon::prelude::*;
173
174 #[test]
175 fn test_cfg_macros() {
176 #[cfg(feature = "parallel")]
177 println!("In parallel mode");
178
179 let mut thing = crate::vec![1, 2, 3, 4, 5u64];
180 println!("Iterating");
181 cfg_iter!(&thing).for_each(|i| println!("{:?}", i));
182 println!("Iterating Mut");
183 cfg_iter_mut!(&mut thing).for_each(|i| *i += 1);
184 println!("Iterating By Value");
185 cfg_into_iter!(thing.clone()).for_each(|i| println!("{:?}", i));
186 println!("Chunks");
187 cfg_chunks!(&thing, 2).for_each(|chunk| println!("{:?}", chunk));
188 println!("Chunks Mut");
189 cfg_chunks_mut!(&mut thing, 2).for_each(|chunk| println!("{:?}", chunk));
190
191 println!("Iterating");
192 cfg_iter!(&thing, 3).for_each(|i| println!("{:?}", i));
193 println!("Iterating Mut");
194 cfg_iter_mut!(&mut thing, 3).for_each(|i| *i += 1);
195 println!("Iterating By Value");
196 cfg_into_iter!(thing, 3).for_each(|i| println!("{:?}", i));
197 }
198}