use std::ops::Range;
use smallvec::SmallVec;
#[derive(Default)]
pub struct FlexHotData<T: Clone, const INLINE_COUNT: usize>(SmallVec<[T; INLINE_COUNT]>);
impl<T: Clone, const INLINE_COUNT: usize> FlexHotData<T, INLINE_COUNT> {
pub fn remove_last(&mut self) -> Option<T> {
self.0.pop()
}
pub fn append(
&mut self,
data: &[T],
) {
self.0
.extend(data.iter().cloned());
}
pub fn drain_range(
&mut self,
range: Range<usize>,
) {
debug_assert!(range.start <= self.0.len());
debug_assert!(range.end <= self.0.len());
debug_assert!(range.start <= range.end);
self.0.drain(range);
}
pub fn retain_newest(
&mut self,
count: usize,
) {
debug_assert!(count <= self.0.len());
let drain_count = self.0.len() - count;
self.drain_range(0..drain_count);
}
pub fn get(
&self,
idx: usize,
) -> Option<&T> {
self.0.get(idx)
}
pub fn iter(&self) -> impl IntoIterator<Item = &T> {
self.0.iter()
}
}