use std::{ops,fmt};
pub struct PinnedVec<T>(Vec<T>);
impl<T> PinnedVec<T> {
pub fn with_capacity(capacity: usize) -> PinnedVec<T> {
PinnedVec(Vec::with_capacity(capacity))
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn capacity(&self) -> usize {
self.0.capacity()
}
pub fn push(&mut self, value: T) -> Result<(),PinnedVecError<T>> {
if self.0.len() == self.0.capacity() {
Err(PinnedVecError(value))
} else {
self.0.push(value);
Ok(())
}
}
pub unsafe fn set_len(&mut self, len: usize) -> Result<(),()> {
if len > self.0.capacity() {
Err(())
} else {
self.0.set_len(len);
Ok(())
}
}
}
impl<T> PinnedVec<T> where T: Clone {
pub fn extend_from_slice(&mut self, other: &[T]) -> Result<(),()> {
if self.0.len() + other.len() > self.0.capacity() {
Err(())
} else {
self.0.extend_from_slice(other);
Ok(())
}
}
}
impl<T> Clone for PinnedVec<T> where T: Clone {
fn clone(&self) -> Self {
let mut pv = PinnedVec(Vec::with_capacity(self.capacity()));
pv.0.clone_from(&self.0);
pv
}
}
impl<T> ops::Deref for PinnedVec<T> {
type Target = [T];
fn deref(&self) -> &[T] {
&*self.0
}
}
impl<T> ops::DerefMut for PinnedVec<T> {
fn deref_mut(&mut self) -> &mut [T] {
&mut *self.0
}
}
impl<T> AsRef<PinnedVec<T>> for PinnedVec<T> {
fn as_ref(&self) -> &PinnedVec<T> {
self
}
}
impl<T> AsMut<PinnedVec<T>> for PinnedVec<T> {
fn as_mut(&mut self) -> &mut PinnedVec<T> {
self
}
}
impl<T> AsRef<[T]> for PinnedVec<T> {
fn as_ref(&self) -> &[T] {
self
}
}
impl<T> AsMut<[T]> for PinnedVec<T> {
fn as_mut(&mut self) -> &mut [T] {
self
}
}
pub struct PinnedVecError<T>(T);
impl<T> fmt::Debug for PinnedVecError<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "PinnedVecError")
}
}