use crate::iter;
use crate::tree_core;
use std::cmp;
pub struct Iter<'a, T: 'a> {
iter: iter::Iter<'a, Item<T>, ()>,
}
impl<'a, T: 'a> Iter<'a, T> {
fn new(tree: &'a tree_core::Tree<Item<T>, ()>) -> Self {
Iter { iter: tree.iter() }
}
}
impl<'a, T: 'a> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|(i, _)| &i.0)
}
}
pub struct IntoIter<T>(iter::IntoIter<Item<T>, ()>);
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|(k, _)| k.0)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
struct Item<T>(T, u64);
impl<T> PartialOrd for Item<T>
where
T: PartialOrd,
{
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
self.0.partial_cmp(&other.0).map(|order| match order {
cmp::Ordering::Equal => self.1.cmp(&other.1),
cmp::Ordering::Less => cmp::Ordering::Greater,
cmp::Ordering::Greater => cmp::Ordering::Less,
})
}
}
impl<T> Ord for Item<T>
where
T: Ord,
{
fn cmp(&self, other: &Self) -> cmp::Ordering {
match self.0.cmp(&other.0) {
cmp::Ordering::Equal => self.1.cmp(&other.1),
cmp::Ordering::Less => cmp::Ordering::Greater,
cmp::Ordering::Greater => cmp::Ordering::Less,
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SplayHeap<T> {
tree: tree_core::Tree<Item<T>, ()>,
seq: u64,
}
impl<T> SplayHeap<T>
where
T: Ord,
{
pub fn new() -> Self {
SplayHeap {
tree: tree_core::Tree::new(),
seq: 0,
}
}
pub fn peek(&mut self) -> Option<&T> {
self.tree.get_lftmost().map(|(i, _)| &i.0)
}
pub fn peek_immut(&self) -> Option<&T> {
self.tree.get_lftmost_immut().map(|(i, _)| &i.0)
}
pub fn pop(&mut self) -> Option<T> {
self.tree.take_lftmost().map(|(i, _)| i.0)
}
pub fn push(&mut self, item: T) {
let seq = self.seq;
self.seq = seq.wrapping_add(1);
self.tree.insert(Item(item, seq), ());
}
pub fn clear(&mut self) {
self.tree = tree_core::Tree::new();
}
}
impl<T> SplayHeap<T> {
pub fn iter(&self) -> Iter<'_, T> {
Iter::new(&self.tree)
}
pub fn len(&self) -> usize {
self.tree.len()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<T> Default for SplayHeap<T>
where
T: Ord,
{
fn default() -> Self {
SplayHeap::new()
}
}
impl<T> std::iter::FromIterator<T> for SplayHeap<T>
where
T: Ord,
{
fn from_iter<I>(iter: I) -> Self
where
I: IntoIterator<Item = T>,
{
let mut heap = SplayHeap::new();
for x in iter {
heap.push(x);
}
heap
}
}
impl<T> IntoIterator for SplayHeap<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
IntoIter(self.tree.into_iter())
}
}
impl<'a, T> IntoIterator for &'a SplayHeap<T> {
type Item = &'a T;
type IntoIter = Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<T> Extend<T> for SplayHeap<T>
where
T: Ord,
{
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = T>,
{
for x in iter {
self.push(x);
}
}
}
impl<'a, T> Extend<&'a T> for SplayHeap<T>
where
T: Copy + 'a + Ord,
{
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = &'a T>,
{
for x in iter {
self.push(*x);
}
}
}