use crate::RBQueue;
#[cfg(feature = "set")]
use crate::RBTree;
use crate::helpers::{ordered_insertion, write_to_level};
use crate::node::Colour::Black;
use crate::node::Node::Leaf;
use std::fmt::{Debug, Display, Formatter, Result};
use std::iter::{ExactSizeIterator, FusedIterator};
impl<T: Debug, P> Debug for RBQueue<T, P>
where
P: Fn(&T, &T) -> std::cmp::Ordering,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
let mut levels = Vec::new();
write_to_level(&self.root, "".to_string(), 0, &mut levels);
let mut f_string = "".to_string();
for i in 0..levels.len() {
f_string += &levels[i];
if i != levels.len() - 1 {
f_string += "\n";
}
}
write!(f, "{}", f_string)
}
}
impl<T: Debug, P> Display for RBQueue<T, P>
where
P: Fn(&T, &T) -> std::cmp::Ordering,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(f, "{:?}", self.ordered())
}
}
impl<T, P> RBQueue<T, P>
where
P: Fn(&T, &T) -> std::cmp::Ordering,
{
pub fn new(cmp: P) -> RBQueue<T, P> {
RBQueue {
root: Leaf(Black),
contained: 0,
cmp,
}
}
pub fn clear(&mut self) {
self.root = Leaf(Black);
self.contained = 0;
}
pub fn drain(&mut self) -> Drain<T> {
let mut vec = Vec::with_capacity(self.len());
while let Some(v) = self.pop_back() {
vec.push(v);
}
Drain { ordered: vec }
}
pub fn ordered(&self) -> Vec<&T> {
let mut order = Vec::with_capacity(self.len());
ordered_insertion(&self.root, &mut order);
order
}
pub fn len(&self) -> usize {
self.contained
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn insert(&mut self, val: T) -> bool {
match self.root.insert(val, &self.cmp) {
Some(_) => false,
None => {
self.contained += 1;
true
}
}
}
pub fn replace(&mut self, val: T) -> Option<T> {
match self.root.insert(val, &self.cmp) {
Some(v) => Some(v),
None => {
self.contained += 1;
None
}
}
}
pub fn contains(&self, val: &T) -> bool {
self.get(val).is_some()
}
pub fn get(&self, val: &T) -> Option<&T> {
self.root.get(val, &self.cmp)
}
pub fn take(&mut self, val: &T) -> Option<T> {
match self.root.remove(val, &self.cmp) {
Some(v) => {
self.contained -= 1;
Some(v)
}
None => None,
}
}
pub fn remove(&mut self, val: &T) -> bool {
match self.root.remove(val, &self.cmp) {
Some(_) => {
self.contained -= 1;
true
}
None => false,
}
}
pub fn pop(&mut self) -> Option<T> {
match self.root.pop(false) {
Some(v) => {
self.contained -= 1;
Some(v)
}
None => None,
}
}
pub fn peek(&self) -> Option<&T> {
self.root.peek(false)
}
pub fn pop_back(&mut self) -> Option<T> {
match self.root.pop(true) {
Some(v) => {
self.contained -= 1;
Some(v)
}
None => None,
}
}
pub fn peek_back(&self) -> Option<&T> {
self.root.peek(true)
}
pub fn iter(&self) -> Iter<T> {
Iter {
pos: 0,
ordered: self.ordered(),
}
}
pub fn retain<F: FnMut(&T) -> bool>(&mut self, mut f: F) {
let mut tmp = Vec::with_capacity(self.len());
while let Some(v) = self.pop() {
if f(&v) {
tmp.push(v);
}
}
while let Some(v) = tmp.pop() {
self.insert(v);
}
}
}
impl<T, P> RBQueue<T, P>
where
T: PartialOrd,
P: Fn(&T, &T) -> std::cmp::Ordering,
{
#[cfg(feature = "set")]
pub fn into_set(self) -> RBTree<T> {
self.into_iter().collect()
}
}
pub struct IntoIter<T> {
order: Vec<T>,
}
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<T> {
self.order.pop()
}
}
impl<T> ExactSizeIterator for IntoIter<T> {
fn len(&self) -> usize {
self.order.len()
}
}
impl<T> FusedIterator for IntoIter<T> {}
impl<T, P> IntoIterator for RBQueue<T, P>
where
P: Fn(&T, &T) -> std::cmp::Ordering,
{
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(mut self) -> IntoIter<T> {
let mut vec = Vec::with_capacity(self.len());
while let Some(v) = self.pop_back() {
vec.push(v);
}
IntoIter { order: vec }
}
}
impl<T, P> Extend<T> for RBQueue<T, P>
where
P: Fn(&T, &T) -> std::cmp::Ordering,
{
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
for i in iter {
self.insert(i);
}
}
}
impl<'a, T, P> Extend<&'a T> for RBQueue<T, P>
where
T: Copy + 'a,
P: Fn(&T, &T) -> std::cmp::Ordering,
{
fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
for &i in iter {
self.insert(i);
}
}
}
pub struct Drain<T> {
ordered: Vec<T>,
}
impl<T> Iterator for Drain<T> {
type Item = T;
fn next(&mut self) -> Option<T> {
self.ordered.pop()
}
}
impl<T> ExactSizeIterator for Drain<T> {
fn len(&self) -> usize {
self.ordered.len()
}
}
impl<T> FusedIterator for Drain<T> {}
pub struct Iter<'a, T> {
pos: usize,
ordered: Vec<&'a T>,
}
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<&'a T> {
let ret = self.ordered.get(self.pos);
match ret {
Some(v) => {
self.pos += 1;
Some(*v)
}
None => None,
}
}
}
impl<'a, T> ExactSizeIterator for Iter<'a, T> {
fn len(&self) -> usize {
self.ordered.len() - self.pos
}
}
impl<'a, T> FusedIterator for Iter<'a, T> {}