pub trait ThreadPool: Send + Sync {
fn parallel_for<F>(&self, count: usize, f: F)
where
F: Fn(usize) + Send + Sync;
fn num_threads(&self) -> usize;
fn join<A, B, RA, RB>(&self, a: A, b: B) -> (RA, RB)
where
A: FnOnce() -> RA + Send,
B: FnOnce() -> RB + Send,
RA: Send,
RB: Send;
fn parallel_for_chunks<F>(&self, count: usize, chunk_size: usize, f: F)
where
F: Fn(usize, usize) + Send + Sync,
{
let num_chunks = (count + chunk_size - 1) / chunk_size;
self.parallel_for(num_chunks, |chunk_idx| {
let start = chunk_idx * chunk_size;
let len = core::cmp::min(chunk_size, count - start);
f(start, len);
});
}
fn parallel_split<F>(&self, start: usize, count: usize, min_chunk_size: usize, f: &F)
where
F: Fn(usize, usize) + Send + Sync,
{
if count <= min_chunk_size || self.num_threads() <= 1 {
f(start, count);
} else {
let mid = count / 2;
self.join(
|| self.parallel_split(start, mid, min_chunk_size, f),
|| self.parallel_split(start + mid, count - mid, min_chunk_size, f),
);
}
}
}