use std::{cell, marker};
pub struct Pool<const N: usize = 1, Tag = (), W: crate::mem::raw::Word = usize> {
pub(in crate::mem::raw) shared: cell::Cell<[W; N]>,
pub(in crate::mem::raw) domain: crate::mem::raw::Domain<Tag>,
pub(in crate::mem::raw) limit: [W; N],
}
impl<const N: usize, Tag, W: crate::mem::raw::Word> Pool<N, Tag, W> {
pub const fn new(shared: [W; N]) -> Self {
const { assert!(N != 0) };
Self {
shared: cell::Cell::new(shared),
limit: shared,
domain: marker::PhantomData,
}
}
pub unsafe fn lane<'p, 's>(
&'p self,
state: &'s crate::mem::raw::State<N, Tag, W>,
) -> crate::mem::raw::Lane<'p, 's, N, Tag, W> {
crate::mem::raw::Lane { pool: self, state }
}
pub fn shared(&self) -> [W; N] {
self.shared.get()
}
}