use core::fmt;
use super::{Queue, Storage};
use crate::list::{Array, Deque, Stack};
#[cfg(feature = "alloc")]
use crate::mem::Boxed;
impl<T: Clone, S: Storage, const CAP: usize> Clone for Queue<T, S, CAP>
where
S::Stored<[T; CAP]>: Clone,
{
fn clone(&self) -> Self {
Self {
array: self.array.clone(),
front: self.front,
back: self.back,
len: self.len,
}
}
}
impl<T: Copy, S: Storage, const CAP: usize> Copy for Queue<T, S, CAP> where S::Stored<[T; CAP]>: Copy
{}
impl<T: fmt::Debug, S: Storage, const CAP: usize> fmt::Debug for Queue<T, S, CAP>
where
S::Stored<[T; CAP]>: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut debug = f.debug_struct(stringify![Queue]);
debug
.field("CAP", &CAP)
.field("len", &self.len)
.field("front", &self.front)
.field("back", &self.back);
if CAP <= 6 {
debug.field("nodes", &self.array);
} else {
debug.field("array { ... }", &());
}
debug.finish()
}
}
impl<T: PartialEq, S: Storage, const CAP: usize> PartialEq for Queue<T, S, CAP>
where
S::Stored<[T; CAP]>: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
self.array == other.array
&& self.len == other.len
&& self.front == other.front
&& self.back == other.back
}
}
impl<T: Eq, S: Storage, const CAP: usize> Eq for Queue<T, S, CAP> where S::Stored<[T; CAP]>: Eq {}
impl<T: Default, const CAP: usize> Default for Queue<T, (), CAP> {
fn default() -> Self {
Self {
array: Array::default(),
front: 0,
back: 0,
len: 0,
}
}
}
#[cfg(feature = "alloc")]
#[cfg_attr(feature = "nightly", doc(cfg(feature = "alloc")))]
impl<T: Default, const CAP: usize> Default for Queue<T, Boxed, CAP> {
fn default() -> Self {
Self {
array: Array::default(),
front: 0,
back: 0,
len: 0,
}
}
}
impl<T: Default, I, const CAP: usize> From<I> for Queue<T, (), CAP>
where
I: IntoIterator<Item = T>,
{
fn from(iterator: I) -> Queue<T, (), CAP> {
let mut s = Queue::<T, (), CAP>::default();
let _ = s.extend(iterator);
s
}
}
#[cfg(feature = "alloc")]
#[cfg_attr(feature = "nightly", doc(cfg(feature = "alloc")))]
impl<T: Default, I, const CAP: usize> From<I> for Queue<T, Boxed, CAP>
where
I: IntoIterator<Item = T>,
{
fn from(iterator: I) -> Queue<T, Boxed, CAP> {
let mut s = Queue::<T, Boxed, CAP>::default();
let _ = s.extend(iterator);
s
}
}
impl<T, S: Storage, const CAP: usize> From<Deque<T, S, CAP>> for Queue<T, S, CAP> {
fn from(deque: Deque<T, S, CAP>) -> Self {
Queue {
array: deque.array,
front: deque.front,
back: deque.back,
len: deque.len,
}
}
}
impl<T, S: Storage, const CAP: usize> From<Stack<T, S, CAP>> for Queue<T, S, CAP> {
fn from(stack: Stack<T, S, CAP>) -> Self {
Queue {
array: stack.array,
len: stack.len,
front: 0,
back: stack.len,
}
}
}