#[cfg(feature = "parallel")]
use std::sync::OnceLock;
#[cfg(feature = "parallel")]
use std::sync::atomic::{AtomicUsize, Ordering};
pub const PAR_THRESHOLD: usize = 4096;
const RESERVED_CORES: usize = 2;
pub fn should_parallelize(num_elements: usize) -> bool {
num_elements >= PAR_THRESHOLD
}
#[cfg(feature = "parallel")]
static POOL: OnceLock<rayon::ThreadPool> = OnceLock::new();
#[cfg(feature = "parallel")]
static NUM_THREADS_OVERRIDE: AtomicUsize = AtomicUsize::new(0);
#[cfg(feature = "parallel")]
pub fn set_num_threads(n: usize) {
NUM_THREADS_OVERRIDE.store(n, Ordering::Relaxed);
}
#[cfg(feature = "parallel")]
pub fn thread_pool() -> &'static rayon::ThreadPool {
POOL.get_or_init(|| {
let user = NUM_THREADS_OVERRIDE.load(Ordering::Relaxed);
let num_threads = if user > 0 {
user
} else {
let available = std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(1);
available.saturating_sub(RESERVED_CORES).max(1)
};
rayon::ThreadPoolBuilder::new()
.num_threads(num_threads)
.build()
.expect("failed to create rayon thread pool")
})
}