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()
}
}