use dashmap::DashMap;
use crate::core::fields::m31::BaseField;
use crate::prover::backend::{Col, Column, ColumnOps};
pub struct BaseColumnPool<B: ColumnOps<BaseField>> {
pools: DashMap<u32, Vec<Col<B, BaseField>>>,
}
impl<B: ColumnOps<BaseField>> BaseColumnPool<B> {
pub fn new() -> Self {
Self {
pools: DashMap::new(),
}
}
pub fn reserve(&self, log_size: u32, count: usize) {
let mut pool = self.pools.entry(log_size).or_default();
for _ in 0..count {
pool.push(Col::<B, BaseField>::zeros(1 << log_size));
}
}
pub fn take(&self, log_size: u32) -> Col<B, BaseField> {
self.pools
.get_mut(&log_size)
.and_then(|mut pool| pool.pop())
.unwrap_or_else(|| {
panic!("BaseColumnPool: no buffer available for log_size={log_size}")
})
}
pub fn take_or_alloc(&self, log_size: u32) -> Col<B, BaseField> {
self.pools
.get_mut(&log_size)
.and_then(|mut pool| pool.pop())
.unwrap_or_else(|| unsafe { Col::<B, BaseField>::uninitialized(1 << log_size) })
}
pub fn give_back(&self, log_size: u32, buf: Col<B, BaseField>) {
debug_assert_eq!(buf.len(), 1 << log_size);
self.pools.entry(log_size).or_default().push(buf);
}
}
impl<B: ColumnOps<BaseField>> Default for BaseColumnPool<B> {
fn default() -> Self {
Self::new()
}
}