use splay_tree::map::{SplayMap, SplayMapIntoIter, SplayMapIter};
use std::borrow::Borrow;
pub struct SplaySet<T> {
map: SplayMap<T, ()>,
}
impl<T> SplaySet<T> {
pub fn new() -> Self {
SplaySet {
map: SplayMap::new(),
}
}
pub fn insert(&mut self, key: T) -> Option<T>
where
T: Ord,
{
self.map.insert(key, ()).map(|pair| pair.0)
}
pub fn remove(&mut self, key: &T) -> Option<T>
where
T: Ord,
{
self.map.remove(key).map(|pair| pair.0)
}
pub fn contains<V>(&self, key: &V) -> bool
where
T: Borrow<V>,
V: Ord + ?Sized,
{
self.map.contains_key(key)
}
pub fn len(&self) -> usize {
self.map.len()
}
pub fn is_empty(&self) -> bool {
self.map.is_empty()
}
pub fn clear(&mut self) {
self.map.clear();
}
pub fn floor<V>(&self, key: &V) -> Option<&T>
where
T: Borrow<V>,
V: Ord + ?Sized,
{
self.map.floor(key)
}
pub fn ceil<V>(&self, key: &V) -> Option<&T>
where
T: Borrow<V>,
V: Ord + ?Sized,
{
self.map.ceil(key)
}
pub fn min(&self) -> Option<&T>
where
T: Ord,
{
self.map.min()
}
pub fn max(&self) -> Option<&T>
where
T: Ord,
{
self.map.max()
}
pub fn iter(&self) -> SplaySetIter<T> {
SplaySetIter {
map_iter: self.map.iter(),
}
}
}
impl<T> IntoIterator for SplaySet<T> {
type Item = T;
type IntoIter = SplaySetIntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
Self::IntoIter {
map_iter: self.map.into_iter(),
}
}
}
impl<'a, T> IntoIterator for &'a SplaySet<T>
where
T: 'a,
{
type Item = &'a T;
type IntoIter = SplaySetIter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
pub struct SplaySetIntoIter<T> {
map_iter: SplayMapIntoIter<T, ()>,
}
impl<T> Iterator for SplaySetIntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.map_iter.next().map(|pair| pair.0)
}
}
pub struct SplaySetIter<'a, T>
where
T: 'a,
{
map_iter: SplayMapIter<'a, T, ()>,
}
impl<'a, T> Iterator for SplaySetIter<'a, T>
where
T: 'a,
{
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.map_iter.next().map(|pair| pair.0)
}
}
impl<T> Default for SplaySet<T> {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::SplaySet;
#[test]
fn test_len_empty() {
let set: SplaySet<u32> = SplaySet::new();
assert_eq!(set.len(), 0);
}
#[test]
fn test_is_empty() {
let set: SplaySet<u32> = SplaySet::new();
assert!(set.is_empty());
}
#[test]
fn test_min_max_empty() {
let set: SplaySet<u32> = SplaySet::new();
assert_eq!(set.min(), None);
assert_eq!(set.max(), None);
}
#[test]
fn test_insert() {
let mut set = SplaySet::new();
assert_eq!(set.insert(1), None);
assert!(set.contains(&1));
}
#[test]
fn test_insert_replace() {
let mut set = SplaySet::new();
assert_eq!(set.insert(1), None);
assert_eq!(set.insert(1), Some(1));
}
#[test]
fn test_remove() {
let mut set = SplaySet::new();
set.insert(1);
assert_eq!(set.remove(&1), Some(1));
assert!(!set.contains(&1));
}
#[test]
fn test_min_max() {
let mut set = SplaySet::new();
set.insert(1);
set.insert(3);
set.insert(5);
assert_eq!(set.min(), Some(&1));
assert_eq!(set.max(), Some(&5));
}
#[test]
fn test_floor_ceil() {
let mut set = SplaySet::new();
set.insert(1);
set.insert(3);
set.insert(5);
assert_eq!(set.floor(&0), None);
assert_eq!(set.floor(&2), Some(&1));
assert_eq!(set.floor(&4), Some(&3));
assert_eq!(set.floor(&6), Some(&5));
assert_eq!(set.ceil(&0), Some(&1));
assert_eq!(set.ceil(&2), Some(&3));
assert_eq!(set.ceil(&4), Some(&5));
assert_eq!(set.ceil(&6), None);
}
#[test]
fn test_into_iter() {
let mut set = SplaySet::new();
set.insert(1);
set.insert(5);
set.insert(3);
assert_eq!(
set.into_iter().collect::<Vec<u32>>(),
vec![1, 3, 5],
);
}
#[test]
fn test_iter() {
let mut set = SplaySet::new();
set.insert(1);
set.insert(5);
set.insert(3);
assert_eq!(
set.iter().collect::<Vec<&u32>>(),
vec![&1, &3, &5],
);
}
}