use std::collections::VecDeque;
pub struct BatchContainer<T> {
batch_size: usize,
buffer: Vec<T>,
ready: VecDeque<Vec<T>>,
}
impl<T> BatchContainer<T> {
pub fn new(batch_size: usize) -> Self {
assert!(batch_size > 0);
Self { batch_size, buffer: Vec::with_capacity(batch_size), ready: VecDeque::new() }
}
pub fn add(&mut self, item: T) {
self.buffer.push(item);
if self.buffer.len() >= self.batch_size {
let batch = std::mem::replace(&mut self.buffer, Vec::with_capacity(self.batch_size));
self.ready.push_back(batch);
}
}
pub fn has_ready_batches(&self) -> bool { !self.ready.is_empty() }
pub fn drain_ready(&mut self) -> Vec<Vec<T>> {
self.ready.drain(..).collect()
}
pub fn flush(&mut self) -> Vec<Vec<T>> {
let mut out = self.drain_ready();
if !self.buffer.is_empty() {
out.push(std::mem::take(&mut self.buffer));
}
out
}
pub fn pending_len(&self) -> usize { self.buffer.len() }
}