diff --git a/src/libcore/send_map.rs b/src/libcore/send_map.rs index 4cd3502bd62..5c7b0643d3d 100644 --- a/src/libcore/send_map.rs +++ b/src/libcore/send_map.rs @@ -1,4 +1,4 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -46,6 +46,8 @@ pub trait SendMap { /// Open addressing with linear probing. pub mod linear { + use iter::BaseIter; + use container::Set; use cmp::Eq; use cmp; use hash::Hash; @@ -442,7 +444,7 @@ pub mod linear { } } - impl LinearMap: cmp::Eq { + impl LinearMap: Eq { pure fn eq(&self, other: &LinearMap) -> bool { if self.len() != other.len() { return false; } @@ -460,6 +462,47 @@ pub mod linear { !self.eq(other) } } + + pub struct LinearSet { + priv map: LinearMap + } + + impl LinearSet: BaseIter { + /// Visit all values in order + pure fn each(&self, f: fn(&T) -> bool) { self.map.each_key(f) } + pure fn size_hint(&self) -> Option { Some(self.len()) } + } + + impl LinearSet: Eq { + pure fn eq(&self, other: &LinearSet) -> bool { self.map == other.map } + pure fn ne(&self, other: &LinearSet) -> bool { self.map != other.map } + } + + impl LinearSet: Set { + /// Return true if the set contains a value + pure fn contains(&self, value: &T) -> bool { + self.map.contains_key(value) + } + + /// Add a value to the set. Return true if the value was not already + /// present in the set. + fn insert(&mut self, value: T) -> bool { self.map.insert(value, ()) } + + /// Remove a value from the set. Return true if the value was + /// present in the set. + fn remove(&mut self, value: &T) -> bool { self.map.remove(value) } + } + + impl LinearSet { + /// Create an empty LinearSet + static fn new() -> LinearSet { LinearSet{map: LinearMap()} } + + /// Return the number of elements in the set + pure fn len(&self) -> uint { self.map.len() } + + /// Return true if the set contains no elements + pure fn is_empty(&self) -> bool { self.map.is_empty() } + } } #[test]