use std::default::Default; use std::iter::{FromIterator, IntoIterator}; use map::{self, SplayMap}; #[derive(Clone)] pub struct SplaySet { map: SplayMap } pub struct IntoIter { inner: map::IntoIter, } impl SplaySet { /// Creates a new empty set pub fn new() -> SplaySet { SplaySet { map: SplayMap::new() } } /// Moves all values out of this set, transferring ownership to the given /// iterator. pub fn into_iter(self) -> IntoIter { IntoIter { inner: self.map.into_iter() } } pub fn len(&self) -> usize { self.map.len() } pub fn is_empty(&self) -> bool { self.len() == 0 } pub fn clear(&mut self) { self.map.clear() } /// Return true if the set contains a value pub fn contains(&self, t: &T) -> bool { self.map.contains_key(t) } /// Add a value to the set. Return true if the value was not already /// present in the set. pub fn insert(&mut self, t: T) -> bool { self.map.insert(t, ()).is_none() } /// Remove a value from the set. Return true if the value was /// present in the set. pub fn remove(&mut self, t: &T) -> bool { self.map.remove(t).is_some() } } impl Iterator for IntoIter { type Item = T; fn next(&mut self) -> Option { self.inner.next().map(|p| p.0) } fn size_hint(&self) -> (usize, Option) { self.inner.size_hint() } } impl DoubleEndedIterator for IntoIter { fn next_back(&mut self) -> Option { self.inner.next_back().map(|(k, _)| k) } } impl Default for SplaySet { fn default() -> SplaySet { SplaySet::new() } } impl FromIterator for SplaySet { fn from_iter>(iterator: I) -> SplaySet { let mut set = SplaySet::new(); set.extend(iterator); set } } impl Extend for SplaySet { fn extend>(&mut self, i: I) { for t in i { self.insert(t); } } }