#![forbid(unsafe_code, bare_trait_objects)]
#![warn(missing_docs)]
use ::std::collections::VecDeque;
use ::std::hash::{Hash, Hasher};
use ::std::ops::{Deref, Index, IndexMut, RangeBounds};
mod iter;
mod test;
pub use ::iter::{Iter, IterMut, IntoIter, Drain, Append};
#[derive(Debug)]
pub struct BoundedVecDeque<T> {
vec_deque: VecDeque<T>,
max_len: usize,
}
impl<T> BoundedVecDeque<T> {
pub fn new(max_len: usize) -> Self {
BoundedVecDeque::with_capacity(max_len, max_len)
}
pub fn with_capacity(capacity: usize, max_len: usize) -> Self {
BoundedVecDeque {
vec_deque: VecDeque::with_capacity(capacity),
max_len,
}
}
pub fn from_iter<I>(iterable: I, max_len: usize) -> Self
where I: IntoIterator<Item=T> {
BoundedVecDeque {
vec_deque: iterable.into_iter().take(max_len).collect(),
max_len,
}
}
pub fn from_unbounded(mut vec_deque: VecDeque<T>, max_len: usize) -> Self {
vec_deque.truncate(max_len);
if vec_deque.capacity() > max_len {
vec_deque.shrink_to_fit();
}
BoundedVecDeque {
vec_deque,
max_len,
}
}
pub fn into_unbounded(self) -> VecDeque<T> {
self.vec_deque
}
pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
self.vec_deque.get_mut(index)
}
pub fn swap(&mut self, i: usize, j: usize) {
self.vec_deque.swap(i, j)
}
fn reserve_priv(&mut self, additional: usize, exact: bool) {
let new_capacity = self.capacity()
.checked_add(additional)
.expect("capacity overflow");
if new_capacity > self.max_len {
panic!(
"capacity out of bounds: the max len is {} but the new cap is {}",
self.max_len,
new_capacity,
)
}
if exact {
self.vec_deque.reserve_exact(additional)
} else {
self.vec_deque.reserve(additional)
}
}
pub fn reserve(&mut self, additional: usize) {
self.reserve_priv(additional, false)
}
pub fn reserve_exact(&mut self, additional: usize) {
self.reserve_priv(additional, true)
}
pub fn reserve_maximum(&mut self) {
let capacity = self.max_len().saturating_sub(self.len());
self.vec_deque.reserve_exact(capacity)
}
pub fn shrink_to_fit(&mut self) {
self.vec_deque.shrink_to_fit()
}
pub fn max_len(&self) -> usize {
self.max_len
}
pub fn set_max_len(&mut self, max_len: usize) -> Drain<'_, T> {
let len = max_len.min(self.len());
self.max_len = max_len;
self.drain(len..)
}
pub fn truncate(&mut self, new_len: usize) {
self.vec_deque.truncate(new_len)
}
pub fn iter(&self) -> Iter<'_, T> {
Iter {
iter: self.vec_deque.iter(),
}
}
pub fn iter_mut(&mut self) -> IterMut<'_, T> {
IterMut {
iter: self.vec_deque.iter_mut(),
}
}
pub fn as_unbounded(&self) -> &VecDeque<T> {
self.as_ref()
}
pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]) {
self.vec_deque.as_mut_slices()
}
pub fn is_full(&self) -> bool {
self.len() >= self.max_len
}
pub fn drain<R>(&mut self, range: R) -> Drain<'_, T>
where R: RangeBounds<usize> {
Drain {
iter: self.vec_deque.drain(range),
}
}
pub fn clear(&mut self) {
self.vec_deque.clear()
}
pub fn front_mut(&mut self) -> Option<&mut T> {
self.vec_deque.front_mut()
}
pub fn back_mut(&mut self) -> Option<&mut T> {
self.vec_deque.back_mut()
}
pub fn push_front(&mut self, value: T) -> Option<T> {
if self.max_len == 0 {
return Some(value)
}
let displaced_value = if self.is_full() { self.pop_back() } else { None };
self.vec_deque.push_front(value);
displaced_value
}
pub fn pop_front(&mut self) -> Option<T> {
self.vec_deque.pop_front()
}
pub fn push_back(&mut self, value: T) -> Option<T> {
if self.max_len == 0 {
return Some(value)
}
let displaced_value = if self.is_full() { self.pop_front() } else { None };
self.vec_deque.push_back(value);
displaced_value
}
pub fn pop_back(&mut self) -> Option<T> {
self.vec_deque.pop_back()
}
pub fn swap_remove_front(&mut self, index: usize) -> Option<T> {
self.vec_deque.swap_remove_front(index)
}
pub fn swap_remove_back(&mut self, index: usize) -> Option<T> {
self.vec_deque.swap_remove_back(index)
}
pub fn insert_spill_back(&mut self, index: usize, value: T) -> Option<T> {
if self.max_len == 0 {
return Some(value)
}
let displaced_value = if self.is_full() {
self.pop_back()
} else {
None
};
self.vec_deque.insert(index, value);
displaced_value
}
pub fn insert_spill_front(&mut self, index: usize, value: T) -> Option<T> {
if self.max_len == 0 {
return Some(value)
}
let displaced_value = if self.is_full() {
self.pop_front()
} else {
None
};
self.vec_deque.insert(index, value);
displaced_value
}
pub fn remove(&mut self, index: usize) -> Option<T> {
self.vec_deque.remove(index)
}
pub fn split_off(&mut self, at: usize) -> Self {
BoundedVecDeque {
vec_deque: self.vec_deque.split_off(at),
max_len: self.max_len,
}
}
pub fn append<'a>(&'a mut self, other: &'a mut Self) -> Append<'a, T> {
Append {
source: other,
destination: self,
}
}
pub fn retain<F>(&mut self, predicate: F)
where F: FnMut(&T) -> bool {
self.vec_deque.retain(predicate)
}
pub fn resize(&mut self, new_len: usize, value: T)
where T: Clone {
if new_len > self.max_len {
panic!(
"length out of bounds: the new len is {} but the max len is {}",
new_len,
self.max_len,
)
}
self.vec_deque.resize(new_len, value)
}
#[cfg(feature = "resize_with")]
pub fn resize_with<F>(&mut self, new_len: usize, producer: F)
where F: FnMut() -> T {
if new_len > self.max_len {
panic!(
"length out of bounds: the new len is {} but the max len is {}",
new_len,
self.max_len,
)
}
self.vec_deque.resize_with(new_len, producer)
}
}
impl<T: Clone> Clone for BoundedVecDeque<T> {
fn clone(&self) -> Self {
BoundedVecDeque {
vec_deque: self.vec_deque.clone(),
max_len: self.max_len,
}
}
fn clone_from(&mut self, other: &Self) {
self.clear();
self.max_len = other.max_len;
let should_shrink = self.capacity() > self.max_len;
if should_shrink {
self.reserve_exact(other.len());
} else {
self.reserve(other.len());
}
self.extend(other.iter().cloned());
if should_shrink {
self.shrink_to_fit();
}
}
}
impl<T: Hash> Hash for BoundedVecDeque<T> {
fn hash<H>(&self, hasher: &mut H)
where H: Hasher {
self.vec_deque.hash(hasher)
}
}
impl<T> Deref for BoundedVecDeque<T> {
type Target = VecDeque<T>;
fn deref(&self) -> &Self::Target {
self.as_ref()
}
}
impl<T> AsRef<VecDeque<T>> for BoundedVecDeque<T> {
fn as_ref(&self) -> &VecDeque<T> {
&self.vec_deque
}
}
impl<T> Index<usize> for BoundedVecDeque<T> {
type Output = T;
fn index(&self, index: usize) -> &T {
&self.vec_deque[index]
}
}
impl<T> IndexMut<usize> for BoundedVecDeque<T> {
fn index_mut(&mut self, index: usize) -> &mut T {
&mut self.vec_deque[index]
}
}
impl<T> IntoIterator for BoundedVecDeque<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
IntoIter {
iter: self.vec_deque.into_iter(),
}
}
}
impl<'a, T> IntoIterator for &'a BoundedVecDeque<T> {
type Item = &'a T;
type IntoIter = Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<'a, T> IntoIterator for &'a mut BoundedVecDeque<T> {
type Item = &'a mut T;
type IntoIter = IterMut<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter_mut()
}
}
impl<T> Extend<T> for BoundedVecDeque<T> {
fn extend<I>(&mut self, iter: I)
where I: IntoIterator<Item=T> {
for value in iter {
self.push_back(value);
}
}
}