blueprint_std/
lib.rs

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/// Creates parallel iterator over refs if `parallel` feature is enabled.
59///
60/// Additionally, if the object being iterated implements
61/// `IndexedParallelIterator`, then one can specify a minimum size for
62/// iteration.
63#[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/// Creates parallel iterator over mut refs if `parallel` feature is enabled.
86///
87/// Additionally, if the object being iterated implements
88/// `IndexedParallelIterator`, then one can specify a minimum size for
89/// iteration.
90#[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/// Creates parallel iterator if `parallel` feature is enabled.
113/// Additionally, if the object being iterated implements
114/// `IndexedParallelIterator`, then one can specify a minimum size for
115/// iteration.
116#[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/// Returns an iterator over `chunk_size` elements of the slice at a
139/// time.
140#[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/// Returns an iterator over `chunk_size` mutable elements of the slice at a
154/// time.
155#[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}