risingwave_common_estimate_size/collections/
vecdeque.rsuse std::collections::VecDeque;
use educe::Educe;
use crate::{EstimateSize, KvSize};
#[derive(Educe)]
#[educe(Default)]
pub struct EstimatedVecDeque<T: EstimateSize> {
inner: VecDeque<T>,
heap_size: KvSize,
}
impl<T: EstimateSize> EstimatedVecDeque<T> {
pub fn pop_back(&mut self) -> Option<T> {
self.inner.pop_back().inspect(|v| {
self.heap_size.sub_val(v);
})
}
pub fn pop_front(&mut self) -> Option<T> {
self.inner.pop_front().inspect(|v| {
self.heap_size.sub_val(v);
})
}
pub fn push_back(&mut self, value: T) {
self.heap_size.add_val(&value);
self.inner.push_back(value)
}
pub fn push_front(&mut self, value: T) {
self.heap_size.add_val(&value);
self.inner.push_front(value)
}
pub fn get(&self, index: usize) -> Option<&T> {
self.inner.get(index)
}
pub fn front(&self) -> Option<&T> {
self.inner.front()
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
}
impl<T: EstimateSize> std::ops::Index<usize> for EstimatedVecDeque<T> {
type Output = T;
fn index(&self, index: usize) -> &Self::Output {
&self.inner[index]
}
}
impl<T: EstimateSize> EstimateSize for EstimatedVecDeque<T> {
fn estimated_heap_size(&self) -> usize {
self.heap_size.size()
}
}