#[cfg(feature = "rayon")]
mod rayon;
#[cfg(feature = "default-thread-pool")]
mod thread_pool;
#[cfg(feature = "rayon")]
pub use rayon::RayonThreadPool;
use std::num::NonZeroUsize;
#[cfg(feature = "default-thread-pool")]
pub use thread_pool::{CpuPinningPolicy, ThreadPool, ThreadPoolBuilder};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ThreadCount {
AvailableParallelism,
Count(NonZeroUsize),
}
impl ThreadCount {
pub fn count(self) -> NonZeroUsize {
match self {
ThreadCount::AvailableParallelism => std::thread::available_parallelism()
.expect("Getting the available parallelism failed"),
ThreadCount::Count(count) => count,
}
}
}
impl TryFrom<usize> for ThreadCount {
type Error = <NonZeroUsize as TryFrom<usize>>::Error;
fn try_from(thread_count: usize) -> Result<Self, Self::Error> {
let count = NonZeroUsize::try_from(thread_count)?;
Ok(ThreadCount::Count(count))
}
}
#[derive(Clone, Copy)]
pub enum RangeStrategy {
Fixed,
WorkStealing,
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_thread_count_try_from_usize() {
assert!(ThreadCount::try_from(0).is_err());
assert_eq!(
ThreadCount::try_from(1),
Ok(ThreadCount::Count(NonZeroUsize::try_from(1).unwrap()))
);
}
}