1#[cfg(feature = "rayon")]
12mod rayon;
13#[cfg(feature = "default-thread-pool")]
14mod thread_pool;
15
16#[cfg(feature = "rayon")]
17pub use rayon::RayonThreadPool;
18use std::num::NonZeroUsize;
19#[cfg(feature = "default-thread-pool")]
20pub use thread_pool::{CpuPinningPolicy, ThreadPool, ThreadPoolBuilder};
21
22#[derive(Clone, Copy, Debug, PartialEq, Eq)]
24pub enum ThreadCount {
25 AvailableParallelism,
28 Count(NonZeroUsize),
30}
31
32impl ThreadCount {
33 pub fn count(self) -> NonZeroUsize {
35 match self {
36 ThreadCount::AvailableParallelism => std::thread::available_parallelism()
37 .expect("Getting the available parallelism failed"),
38 ThreadCount::Count(count) => count,
39 }
40 }
41}
42
43impl TryFrom<usize> for ThreadCount {
44 type Error = <NonZeroUsize as TryFrom<usize>>::Error;
45
46 fn try_from(thread_count: usize) -> Result<Self, Self::Error> {
47 let count = NonZeroUsize::try_from(thread_count)?;
48 Ok(ThreadCount::Count(count))
49 }
50}
51
52#[derive(Clone, Copy)]
54pub enum RangeStrategy {
55 Fixed,
57 WorkStealing,
59}
60
61#[cfg(test)]
62mod test {
63 use super::*;
64
65 #[test]
66 fn test_thread_count_try_from_usize() {
67 assert!(ThreadCount::try_from(0).is_err());
68 assert_eq!(
69 ThreadCount::try_from(1),
70 Ok(ThreadCount::Count(NonZeroUsize::try_from(1).unwrap()))
71 );
72 }
73}