mod circularqueue;
pub use circularqueue::CircularQueue;
pub trait Deque<T: Sized> {
fn back(&self) -> Option<&T>;
fn capacity(&self) -> usize;
fn clear(&mut self);
fn front(&self) -> Option<&T>;
fn is_empty(&self) -> bool;
fn is_full(&self) -> bool {
false
}
fn len(&self) -> usize;
fn pop_back(&mut self) -> Option<T>;
fn pop_front(&mut self) -> Option<T>;
fn push_back(&mut self, value: T) -> Result<(), T>;
fn push_front(&mut self, value: T) -> Result<(), T>;
}
#[cfg(feature = "std")]
impl<T> Deque<T> for std::collections::VecDeque<T> {
fn push_front(&mut self, value: T) -> Result<(), T> {
Ok(self.push_front(value))
}
fn pop_front(&mut self) -> Option<T> {
self.pop_front()
}
fn push_back(&mut self, value: T) -> Result<(), T> {
Ok(self.push_back(value))
}
fn pop_back(&mut self) -> Option<T> {
self.pop_back()
}
fn is_empty(&self) -> bool {
self.is_empty()
}
fn len(&self) -> usize {
self.len()
}
fn clear(&mut self) {
self.clear();
}
fn capacity(&self) -> usize {
self.capacity()
}
fn back(&self) -> Option<&T> {
self.back()
}
fn front(&self) -> Option<&T> {
self.front()
}
}
#[cfg(feature = "heapless")]
impl<T, const N: usize> Deque<T> for heapless::Deque<T, N> {
fn push_front(&mut self, value: T) -> Result<(), T> {
self.push_front(value)
}
fn pop_front(&mut self) -> Option<T> {
self.pop_front()
}
fn push_back(&mut self, value: T) -> Result<(), T> {
self.push_back(value)
}
fn pop_back(&mut self) -> Option<T> {
self.pop_back()
}
fn is_empty(&self) -> bool {
self.is_empty()
}
fn is_full(&self) -> bool {
self.is_full()
}
fn len(&self) -> usize {
self.len()
}
fn clear(&mut self) {
self.clear();
}
fn capacity(&self) -> usize {
self.capacity()
}
fn back(&self) -> Option<&T> {
self.back()
}
fn front(&self) -> Option<&T> {
self.front()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn test_queue<T: Deque<u32>>(que: &mut T) {
assert_eq!(true, que.is_empty());
que.push_front(1).unwrap();
que.push_front(2).unwrap();
assert_eq!(que.pop_back(), Some(1));
assert_eq!(que.pop_back(), Some(2));
assert_eq!(true, que.is_empty());
que.push_front(2).unwrap();
assert_eq!(false, que.is_empty());
que.clear();
assert_eq!(true, que.is_empty());
}
fn test_capacity<T: Deque<u32>>(que: &mut T) {
que.clear();
assert_eq!(0, que.len());
assert_eq!(4, que.capacity());
for i in 0..4 {
que.push_front(i).unwrap();
}
assert_eq!(4, que.len());
assert_eq!(4, que.capacity());
assert!(que.push_front(1).is_err());
}
#[cfg(feature = "std")]
#[test]
fn test_std_queue() {
let mut que = std::collections::VecDeque::new();
test_queue(&mut que);
}
#[cfg(feature = "heapless")]
#[test]
fn test_heapless_queue() {
let mut que = heapless::Deque::<_, 4>::new();
test_queue(&mut que);
test_capacity(&mut que);
}
#[test]
fn test_circular_queue() {
let mut que = circularqueue::CircularQueue::<u32, 4>::new();
test_queue(&mut que);
test_capacity(&mut que);
}
}