use std::{
collections::VecDeque,
fmt::Display,
ops::{Index, IndexMut, Shl, ShlAssign, Shr, ShrAssign},
};
use crate::detail;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Hash)]
pub struct Deque<T> {
data: VecDeque<T>,
}
impl<T> Deque<T> {
pub fn new() -> Self {
Self { data: VecDeque::new() }
}
pub fn with_capacity(capacity: usize) -> Self {
Self {
data: VecDeque::with_capacity(capacity),
}
}
pub fn len(&self) -> i32 {
self.data.len() as i32
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn iter(&self) -> std::collections::vec_deque::Iter<'_, T> {
self.data.iter()
}
pub fn back(&self) -> Option<&T> {
self.data.back()
}
pub fn front(&self) -> Option<&T> {
self.data.front()
}
pub fn back_mut(&mut self) -> Option<&mut T> {
self.data.back_mut()
}
pub fn front_mut(&mut self) -> Option<&mut T> {
self.data.front_mut()
}
pub fn push_back(&mut self, element: T) -> &Self {
detail::check_full(self.data.len(), i32::MAX as usize);
self.data.push_back(element);
self
}
pub fn push_front(&mut self, element: T) -> &Self {
detail::check_full(self.data.len(), i32::MAX as usize);
self.data.push_front(element);
self
}
pub fn pop_back(&mut self) -> Option<T> {
self.data.pop_back()
}
pub fn pop_front(&mut self) -> Option<T> {
self.data.pop_front()
}
pub fn clear(&mut self) {
self.data.clear()
}
pub fn reserve(&mut self, additional: usize) {
self.data.reserve(additional)
}
}
impl<T, const N: usize> From<[T; N]> for Deque<T> {
fn from(value: [T; N]) -> Self {
Self { data: VecDeque::from(value) }
}
}
impl<T> Index<i32> for Deque<T> {
type Output = T;
fn index(&self, index: i32) -> &Self::Output {
detail::check_bounds(index, -self.len(), self.len());
let index = detail::calc_index(index, self.data.len());
&self.data[index]
}
}
impl<T> IndexMut<i32> for Deque<T> {
fn index_mut(&mut self, index: i32) -> &mut Self::Output {
detail::check_bounds(index, -self.len(), self.len());
let index = detail::calc_index(index, self.data.len());
&mut self.data[index]
}
}
#[auto_impl_ops::auto_ops]
impl<T> ShlAssign<usize> for Deque<T> {
fn shl_assign(&mut self, mut rhs: usize) {
if self.data.len() <= 1 || rhs == 0 {
return;
}
rhs %= self.data.len();
let mut tail = self.data.split_off(rhs);
tail.append(&mut self.data);
self.data = tail;
}
}
#[auto_impl_ops::auto_ops]
impl<T> ShrAssign<usize> for Deque<T> {
fn shr_assign(&mut self, rhs: usize) {
if self.data.len() <= 1 || rhs == 0 {
return;
}
self.shl_assign(self.data.len() - rhs % self.data.len()); }
}
impl<T> Extend<T> for Deque<T> {
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
self.data.extend(iter)
}
}
impl<T: Display> Display for Deque<T> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
detail::print(f, self.iter(), '<', '>')
}
}
impl<T> FromIterator<T> for Deque<T> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let data = iter.into_iter().collect();
Self { data }
}
}
impl<T> IntoIterator for Deque<T> {
type Item = T;
type IntoIter = std::collections::vec_deque::IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
self.data.into_iter()
}
}