| 1 | // Take a look at the license at the top of the repository in the LICENSE file. | 
| 2 |  | 
|---|
| 3 | cfg_if! { | 
|---|
| 4 | if #[cfg(all( | 
|---|
| 5 | feature = "multithread", | 
|---|
| 6 | not(feature = "unknown-ci"), | 
|---|
| 7 | not(all(target_os = "macos", feature = "apple-sandbox")), | 
|---|
| 8 | ))] { | 
|---|
| 9 | /// Converts the value into a parallel iterator if the `multithread` feature is enabled. | 
|---|
| 10 | /// Uses the `rayon::iter::IntoParallelIterator` trait. | 
|---|
| 11 | #[cfg(all( | 
|---|
| 12 | feature = "multithread", | 
|---|
| 13 | not(feature = "unknown-ci"), | 
|---|
| 14 | not(all(target_os = "macos", feature = "apple-sandbox")), | 
|---|
| 15 | ))] | 
|---|
| 16 | #[allow(dead_code)] | 
|---|
| 17 | pub(crate) fn into_iter<T>(val: T) -> T::Iter | 
|---|
| 18 | where | 
|---|
| 19 | T: rayon::iter::IntoParallelIterator, | 
|---|
| 20 | { | 
|---|
| 21 | val.into_par_iter() | 
|---|
| 22 | } | 
|---|
| 23 |  | 
|---|
| 24 | /// Converts the value into a parallel mutable iterator if the `multithread` feature is | 
|---|
| 25 | /// enabled. Uses the `rayon::iter::IntoParallelRefMutIterator` trait. | 
|---|
| 26 | #[cfg(feature = "component")] | 
|---|
| 27 | pub(crate) fn into_iter_mut<'a, T>( | 
|---|
| 28 | val: &'a mut T, | 
|---|
| 29 | ) -> <T as rayon::iter::IntoParallelRefMutIterator<'a>>::Iter | 
|---|
| 30 | where | 
|---|
| 31 | T: rayon::iter::IntoParallelRefMutIterator<'a> + ?Sized, | 
|---|
| 32 | { | 
|---|
| 33 | val.par_iter_mut() | 
|---|
| 34 | } | 
|---|
| 35 | } else { | 
|---|
| 36 | /// Converts the value into a sequential iterator if the `multithread` feature is disabled. | 
|---|
| 37 | /// Uses the `std::iter::IntoIterator` trait. | 
|---|
| 38 | #[ allow(dead_code)] | 
|---|
| 39 | pub(crate) fn into_iter<T>(val: T) -> T::IntoIter | 
|---|
| 40 | where | 
|---|
| 41 | T: IntoIterator, | 
|---|
| 42 | { | 
|---|
| 43 | val.into_iter() | 
|---|
| 44 | } | 
|---|
| 45 |  | 
|---|
| 46 | // In the multithreaded version of `into_iter_mut` above, the `&mut` on the argument is | 
|---|
| 47 | // indicating the parallel iterator is an exclusive reference. In the non-multithreaded | 
|---|
| 48 | // case, the `&mut` is already part of `T` and specifying it will result in the argument | 
|---|
| 49 | // being `&mut &mut T`. | 
|---|
| 50 |  | 
|---|
| 51 | /// Converts the value into a sequential mutable iterator if the `multithread` feature is | 
|---|
| 52 | /// disabled. Uses the `std::iter::IntoIterator` trait. | 
|---|
| 53 | #[ cfg(feature = "component")] | 
|---|
| 54 | pub(crate) fn into_iter_mut<T>(val: T) -> T::IntoIter | 
|---|
| 55 | where | 
|---|
| 56 | T: IntoIterator, | 
|---|
| 57 | { | 
|---|
| 58 | val.into_iter() | 
|---|
| 59 | } | 
|---|
| 60 | } | 
|---|
| 61 | } | 
|---|
| 62 |  | 
|---|