#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct FixedVec<T>(Vec<T>);
impl<T: Clone> Clone for FixedVec<T> {
fn clone(&self) -> Self {
let mut inner = self.0.clone();
inner.reserve_exact(self.0.capacity() - self.0.len());
Self(inner)
}
}
impl<T> Default for FixedVec<T> {
fn default() -> Self {
Self::new(16)
}
}
impl<T> FixedVec<T> {
pub fn new(capacity: usize) -> Self {
let mut seq = Vec::new();
seq.reserve_exact(capacity);
Self(seq)
}
pub fn as_slice(&self) -> &[T] {
&self.0
}
pub fn as_mut_slice(&mut self) -> &mut [T] {
&mut self.0
}
pub fn push(&mut self, value: T) -> Option<T> {
if self.0.capacity() == 0 {
return None;
}
if self.0.len() == self.0.capacity() {
let popped = self.0.remove(0);
self.0.push(value);
Some(popped)
} else {
self.0.push(value);
None
}
}
pub fn clear(&mut self) {
self.0.clear();
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn capacity(&self) -> usize {
self.0.capacity()
}
}
impl<T> core::ops::Deref for FixedVec<T> {
type Target = [T];
fn deref(&self) -> &Self::Target {
self.as_slice()
}
}
impl<T> core::ops::DerefMut for FixedVec<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.as_mut_slice()
}
}