diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index 858ebbf7073..a954860a789 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -39,19 +39,26 @@ pub struct TreeMap { priv length: uint } -// FIXME: this is a naive O(n*log(m)) implementation, could be O(n) -impl TreeMap: Eq { +impl TreeMap: Eq { pure fn eq(&self, other: &TreeMap) -> bool { if self.len() != other.len() { return false } - for self.each |x, y| { - match other.find(x) { - Some(z) => if z != y { return false }, - None => return false + unsafe { // purity workaround + let mut x = self.iter(); + let mut y = other.iter(); + for self.len().times { + // ICE: x.next() != y.next() + + let (x1, x2) = x.next().unwrap(); + let (y1, y2) = y.next().unwrap(); + + if x1 != y1 || x2 != y2 { + return false + } } + true } - true } pure fn ne(&self, other: &TreeMap) -> bool { !self.eq(other) @@ -137,8 +144,8 @@ impl TreeMap { ret } - /// Get a lazy iterator over the nodes in the map. Requires that it - /// be frozen (immutable). + /// Get a lazy iterator over the key-value pairs in the map. + /// Requires that it be frozen (immutable). fn iter(&self) -> TreeMapIterator/&self { TreeMapIterator{stack: ~[], node: &self.root} } @@ -183,7 +190,7 @@ impl TreeSet: iter::BaseIter { pure fn size_hint(&self) -> Option { Some(self.len()) } } -impl TreeSet: Eq { +impl TreeSet: Eq { pure fn eq(&self, other: &TreeSet) -> bool { self.map == other.map } pure fn ne(&self, other: &TreeSet) -> bool { self.map != other.map } }