use std::collections::VecDeque;
use std::iter::FromIterator;
use std::ops::RangeBounds;
use std::collections::vec_deque::Drain;
#[derive(Debug, Clone, PartialEq)]
pub struct TreeIter<T>
where T: Copy + Clone + Ord + Eq
{
pub(crate)iter: VecDeque<T>
}
impl<T> Default for TreeIter<T>
where T: Copy + Clone + Ord + Eq
{
#[inline]
fn default() -> Self {
TreeIter { iter: VecDeque::new() }
}
}
impl<T> TreeIter<T>
where T: Copy + Clone + Ord + Eq
{
#[inline]
pub fn new() -> Self {
TreeIter { iter: VecDeque::new() }
}
#[inline]
pub fn with_capacity(capacity: usize) -> Self {
TreeIter { iter: VecDeque::with_capacity(capacity) }
}
#[inline]
pub fn capacity(&self) -> usize {
self.iter.capacity()
}
#[inline]
pub fn len(&self) -> usize {
self.iter.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.iter.is_empty()
}
#[inline]
pub fn append(&mut self, src: Self) {
self.iter.extend(src)
}
#[inline]
pub fn clear(&mut self) {
self.iter.clear()
}
pub fn full_dedup(&mut self) {
let mut vec = Vec::from(self.iter.clone());
vec.sort(); vec.dedup();
self.clear(); self.extend(vec);
}
#[inline]
pub fn drain<R> (&mut self, range: R) -> Drain<T>
where R: RangeBounds<usize>
{
self.iter.drain(range)
}
pub fn drain_filter<F: FnMut(&T) -> bool>(&mut self, mut filter: F) -> Self {
let mut remove_it = Vec::with_capacity(self.len());
let iter = self.iter.clone();
for elem in iter {
if filter(&elem) {
remove_it.push(elem.clone());
}
}
let mut old_vec = Vec::with_capacity(self.len());
for elem in &self.iter {
if let Err(_) = remove_it.binary_search(elem) {
old_vec.push(elem.clone());
}
}
self.clear();
self.extend(old_vec);
remove_it.shrink_to_fit();
let mut rem = TreeIter::with_capacity(remove_it.len());
rem.extend(remove_it);
rem
}
#[inline]
pub fn extend_from_slice(&mut self, slice: &[T]) {
let mut vec = Vec::with_capacity(slice.len());
vec.extend_from_slice(slice);
self.extend(vec);
}
#[inline]
pub fn insert(&mut self, index: usize, val: &T) {
self.iter.insert(index, val.clone());
}
#[inline]
pub fn push_front(&mut self, val: &T) {
self.iter.push_front(val.clone());
}
#[inline]
pub fn pop_front(&mut self) -> Option<T> {
self.iter.pop_front()
}
#[inline]
pub fn push_back(&mut self, val: &T) {
self.iter.push_back(val.clone());
}
#[inline]
pub fn pop_back(&mut self) -> Option<T> {
self.iter.pop_back()
}
#[inline]
pub fn remove(&mut self, index: usize) -> Option<T> {
self.iter.remove(index)
}
#[inline]
pub fn reserve(&mut self, reserve: usize) {
self.iter.reserve(reserve)
}
pub fn retain<F: FnMut(&T) -> bool>(&mut self, fun: F) {
let rem = self.drain_filter(fun);
self.clear(); self.extend(rem);
}
#[inline]
pub fn shrink_to_fit(&mut self) {
self.iter.shrink_to_fit()
}
pub fn split_off(&mut self, at: usize) -> Self {
let vec = self.iter.split_off(at);
let mut res = TreeIter::with_capacity(vec.len());
res.extend(vec);
res
}
#[inline]
pub fn swap_remove_back(&mut self, at: usize) -> Option<T> {
self.iter.swap_remove_back(at)
}
#[inline]
pub fn swap_remove_front(&mut self, at: usize) -> Option<T> {
self.iter.swap_remove_front(at)
}
#[inline]
pub fn truncate(&mut self, len: usize) {
self.iter.truncate(len)
}
#[inline]
pub fn to_vec(&self) -> Vec<T> {
self.clone().collect::<Vec<T>>()
}
#[inline]
pub fn to_deque(&self) -> VecDeque<T> {
self.clone().collect::<VecDeque<T>>()
}
}
impl<T> Iterator for TreeIter<T>
where T: Copy + Clone + Ord + Eq
{
type Item = T;
fn next(&mut self) -> Option<T> {
return self.iter.pop_front()
}
}
impl<T> ExactSizeIterator for TreeIter<T>
where T: Copy + Clone + Ord + Eq
{
fn len(&self) -> usize {
self.len()
}
}
impl<T> DoubleEndedIterator for TreeIter<T>
where T: Copy + Clone + Ord + Eq
{
fn next_back(&mut self) -> Option<T> {
return self.iter.pop_back()
}
}
impl<T> Extend<T> for TreeIter<T>
where T: Copy + Clone + Ord + Eq
{
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
self.iter.extend(iter);
}
}
impl<T> FromIterator<T> for TreeIter<T>
where T: Copy + Clone + Ord + Eq
{
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let mut it = TreeIter::new();
it.iter.extend(iter);
it
}
}