ark_std/
lib.rs

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/// Returns the ceiling of the base-2 logarithm of `x`.
66///
67/// ```
68/// use ark_std::log2;
69///
70/// assert_eq!(log2(16), 4);
71/// assert_eq!(log2(17), 5);
72/// assert_eq!(log2(1), 0);
73/// assert_eq!(log2(0), 0);
74/// assert_eq!(log2(usize::MAX), (core::mem::size_of::<usize>() * 8) as u32);
75/// assert_eq!(log2(1 << 15), 15);
76/// assert_eq!(log2(2usize.pow(18)), 18);
77/// ```
78#[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/// Creates parallel iterator over refs if `parallel` feature is enabled.
90/// Additionally, if the object being iterated implements
91/// `IndexedParallelIterator`, then one can specify a minimum size for
92/// iteration.
93#[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/// Creates parallel iterator over mut refs if `parallel` feature is enabled.
116/// Additionally, if the object being iterated implements
117/// `IndexedParallelIterator`, then one can specify a minimum size for
118/// iteration.
119#[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/// Creates parallel iterator if `parallel` feature is enabled.
142/// Additionally, if the object being iterated implements
143/// `IndexedParallelIterator`, then one can specify a minimum size for
144/// iteration.
145#[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/// Returns an iterator over `chunk_size` elements of the slice at a
168/// time.
169#[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/// Returns an iterator over `chunk_size` mutable elements of the slice at a
183/// time.
184#[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}