1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Take a look at the license at the top of the repository in the LICENSE file.

/// Converts the value into a parallel iterator if the `multithread` feature is enabled.
/// Uses the `rayon::iter::IntoParallelIterator` trait.
#[cfg(all(
    feature = "multithread",
    not(feature = "unknown-ci"),
    not(all(target_os = "macos", feature = "apple-sandbox")),
))]
#[allow(dead_code)]
pub(crate) fn into_iter<T>(val: T) -> T::Iter
where
    T: rayon::iter::IntoParallelIterator,
{
    val.into_par_iter()
}

/// Converts the value into a sequential iterator if the `multithread` feature is disabled.
/// Uses the `std::iter::IntoIterator` trait.
#[cfg(any(
    not(feature = "multithread"),
    feature = "unknown-ci",
    all(target_os = "macos", feature = "apple-sandbox")
))]
#[allow(dead_code)]
pub(crate) fn into_iter<T>(val: T) -> T::IntoIter
where
    T: IntoIterator,
{
    val.into_iter()
}

/// Converts the value into a parallel mutable iterator if the `multithread` feature is enabled.
/// Uses the `rayon::iter::IntoParallelRefMutIterator` trait.
#[cfg(all(
    feature = "multithread",
    not(feature = "unknown-ci"),
    not(all(target_os = "macos", feature = "apple-sandbox")),
))]
pub(crate) fn into_iter_mut<'a, T>(
    val: &'a mut T,
) -> <T as rayon::iter::IntoParallelRefMutIterator<'a>>::Iter
where
    T: rayon::iter::IntoParallelRefMutIterator<'a> + ?Sized,
{
    val.par_iter_mut()
}

// In the multithreaded version of `into_iter_mut` above, the `&mut` on the argument is indicating
// the parallel iterator is an exclusive reference. In the non-multithreaded case, the `&mut` is
// already part of `T` and specifying it will result in the argument being `&mut &mut T`.

/// Converts the value into a sequential mutable iterator if the `multithread` feature is disabled.
/// Uses the `std::iter::IntoIterator` trait.
#[cfg(any(
    not(feature = "multithread"),
    feature = "unknown-ci",
    all(target_os = "macos", feature = "apple-sandbox")
))]
pub(crate) fn into_iter_mut<T>(val: T) -> T::IntoIter
where
    T: IntoIterator,
{
    val.into_iter()
}