use core::mem::take;
use nalgebra::{base::allocator::Allocator, DefaultAllocator, DimName, OVector};
#[doc(hidden)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OVec<T: Default, D: DimName>
where
OVector<T, D>: Default,
DefaultAllocator: Allocator<T, D>,
{
size: usize,
data: OVector<T, D>,
}
impl<T: Default, D: DimName> OVec<T, D>
where
OVector<T, D>: Default,
DefaultAllocator: Allocator<T, D>,
{
#[must_use]
#[inline]
pub fn new() -> Self {
Self::default()
}
#[must_use]
#[inline]
pub fn capacity(&self) -> usize {
self.data.len()
}
#[must_use]
#[inline]
pub const fn len(&self) -> usize {
self.size
}
#[must_use]
#[inline]
pub const fn is_empty(&self) -> bool {
self.len() == 0
}
#[must_use]
#[inline]
pub fn is_full(&self) -> bool {
self.len() == self.data.len()
}
#[must_use]
#[inline]
pub fn as_slice(&self) -> &[T] {
&self.data.as_slice()[..self.len()]
}
#[inline]
pub fn push(&mut self, item: T) {
self.data[self.size] = item;
self.size += 1;
}
#[inline]
pub fn pop(&mut self) -> Option<T> {
if self.is_empty() {
None
} else {
self.size -= 1;
Some(take(&mut self.data[self.size]))
}
}
}
impl<T: Default, D: DimName> Default for OVec<T, D>
where
OVector<T, D>: Default,
DefaultAllocator: Allocator<T, D>,
{
fn default() -> Self {
Self {
size: 0,
data: OVector::default(),
}
}
}