use glaredb_error::Result;
use super::array::Array;
use super::array::array_buffer::AnyArrayBuffer;
use crate::arrays::array::validity::Validity;
use crate::buffer::buffer_manager::{BufferManager, RawBufferManager};
pub trait MaybeCache {
fn maybe_cache(&mut self, buffer: AnyArrayBuffer);
}
impl<M> MaybeCache for Option<M>
where
M: MaybeCache,
{
fn maybe_cache(&mut self, buffer: AnyArrayBuffer) {
match self {
Some(cache) => cache.maybe_cache(buffer),
None => NopCache.maybe_cache(buffer),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct NopCache;
impl MaybeCache for NopCache {
fn maybe_cache(&mut self, _buffer: AnyArrayBuffer) {
}
}
#[derive(Debug)]
pub struct BufferCache {
pub(crate) manager: RawBufferManager,
pub(crate) capacity: usize,
}
impl BufferCache {
pub fn new(manager: &impl BufferManager, capacity: usize, _num_arrays: usize) -> Self {
BufferCache {
manager: RawBufferManager::from_buffer_manager(manager),
capacity,
}
}
pub const fn capacity(&self) -> usize {
self.capacity
}
pub fn reset_arrays(&mut self, arrays: &mut [Array]) -> Result<()> {
for array in arrays {
Self::reset_array(&self.manager, array, self.capacity)?;
}
Ok(())
}
fn reset_array(manager: &RawBufferManager, array: &mut Array, cap: usize) -> Result<()> {
let data = AnyArrayBuffer::new_for_datatype(manager, &array.datatype, cap)?;
array.data = data;
array.validity = Validity::new_all_valid(cap);
Ok(())
}
}