use ::std::collections::vec_deque;
#[cfg(feature = "fused")]
use ::std::iter::FusedIterator;
use ::BoundedVecDeque;
macro_rules! forward_iterator_impls {
( impl($($param:tt)*), $impl_type:ty, $item_type:ty ) => {
impl<$($param)*> Iterator for $impl_type {
type Item = $item_type;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
fn count(self) -> usize {
self.iter.count()
}
fn last(self) -> Option<Self::Item> {
self.iter.last()
}
fn nth(&mut self, n: usize) -> Option<Self::Item> {
self.iter.nth(n)
}
fn fold<A, F>(self, init: A, function: F) -> A
where F: FnMut(A, Self::Item) -> A {
self.iter.fold(init, function)
}
}
impl<$($param)*> DoubleEndedIterator for $impl_type {
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back()
}
}
impl<$($param)*> ExactSizeIterator for $impl_type {
fn len(&self) -> usize {
self.iter.len()
}
}
#[cfg(feature = "fused")]
impl<$($param)*> FusedIterator for $impl_type {}
};
}
#[derive(Debug)]
pub struct Iter<'a, T: 'a> {
pub(crate) iter: vec_deque::Iter<'a, T>,
}
forward_iterator_impls!(impl('a, T), Iter<'a, T>, &'a T);
impl<'a, T> Clone for Iter<'a, T> {
fn clone(&self) -> Self {
Iter {
iter: self.iter.clone(),
}
}
}
#[derive(Debug)]
pub struct IterMut<'a, T: 'a> {
pub(crate) iter: vec_deque::IterMut<'a, T>,
}
forward_iterator_impls!(impl('a, T: 'a), IterMut<'a, T>, &'a mut T);
#[derive(Debug, Clone)]
pub struct IntoIter<T> {
pub(crate) iter: vec_deque::IntoIter<T>,
}
forward_iterator_impls!(impl(T), IntoIter<T>, T);
#[derive(Debug)]
pub struct Drain<'a, T: 'a> {
pub(crate) iter: vec_deque::Drain<'a, T>,
}
forward_iterator_impls!(impl('a, T: 'a), Drain<'a, T>, T);
#[derive(Debug)]
pub struct Append<'a, T: 'a> {
pub(crate) source: &'a mut BoundedVecDeque<T>,
pub(crate) destination: &'a mut BoundedVecDeque<T>,
}
impl<'a, T: 'a> Drop for Append<'a, T> {
fn drop(&mut self) {
while let Some(_) = self.next() {
continue
}
}
}
impl<'a, T: 'a> Iterator for Append<'a, T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
loop {
match self.source.pop_front() {
Some(value) => match self.destination.push_back(value) {
Some(displaced_value) => return Some(displaced_value),
None => continue,
},
None => return None,
}
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.len(), Some(self.len()))
}
}
impl<'a, T: 'a> ExactSizeIterator for Append<'a, T> {
fn len(&self) -> usize {
self.destination
.max_len()
.saturating_sub(self.destination.len())
.saturating_sub(self.source.len())
}
}
#[cfg(feature = "fused")]
impl<'a, T: 'a> FusedIterator for Append<'a, T> {}