diff --git a/src/libcore/container.rs b/src/libcore/container.rs new file mode 100644 index 00000000000..619622ceb95 --- /dev/null +++ b/src/libcore/container.rs @@ -0,0 +1,24 @@ +// 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. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Container traits + +pub trait Set { + /// Return true if the set contains a value + pure fn contains(&self, value: &T) -> bool; + + /// 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; + + /// Remove a value from the set. Return true if the value was + /// present in the set. + fn remove(&mut self, value: &T) -> bool; +} diff --git a/src/libcore/core.rc b/src/libcore/core.rc index b800564b8e1..24623f20c80 100644 --- a/src/libcore/core.rc +++ b/src/libcore/core.rc @@ -122,6 +122,7 @@ pub mod to_bytes; pub mod clone; pub mod io; pub mod hash; +pub mod container; /* Common data structures */ 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] diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index b5f60a66978..1b20b35bda1 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -14,6 +14,7 @@ #[forbid(deprecated_mode)]; +use core::container::Set; use core::cmp::{Eq, Ord}; use core::option::{Option, Some, None}; use core::prelude::*; @@ -197,6 +198,21 @@ impl TreeSet: Eq { pure fn ne(&self, other: &TreeSet) -> bool { self.map != other.map } } +impl TreeSet: 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 TreeSet { /// Create an empty TreeSet static pure fn new() -> TreeSet { TreeSet{map: TreeMap::new()} } @@ -215,19 +231,6 @@ impl TreeSet { self.map.each_key_reverse(f) } - /// 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) } - /// Get a lazy iterator over the values in the set. /// Requires that it be frozen (immutable). pure fn iter(&self) -> TreeSetIterator/&self {