From fd6be2fa4eac4638174a484529ef782007d0fec1 Mon Sep 17 00:00:00 2001 From: Daniel Patterson Date: Thu, 4 Oct 2012 18:18:02 -0400 Subject: [PATCH] std::treemap - changing types to reflect constraints, adding equality check (space expensive) --- src/libstd/treemap.rs | 56 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/src/libstd/treemap.rs b/src/libstd/treemap.rs index 8ab0dc7f2e7..f332c06d0bc 100644 --- a/src/libstd/treemap.rs +++ b/src/libstd/treemap.rs @@ -11,28 +11,28 @@ use core::cmp::{Eq, Ord}; use core::option::{Some, None}; use Option = core::Option; -pub type TreeMap = @mut TreeEdge; +pub type TreeMap = @mut TreeEdge; -type TreeEdge = Option<@TreeNode>; +type TreeEdge = Option<@TreeNode>; -enum TreeNode = { +struct TreeNode { key: K, mut value: V, mut left: TreeEdge, mut right: TreeEdge -}; +} /// Create a treemap -pub fn TreeMap() -> TreeMap { @mut None } +pub fn TreeMap() -> TreeMap { @mut None } /// Insert a value into the map pub fn insert(m: &mut TreeEdge, k: K, v: V) { match copy *m { None => { - *m = Some(@TreeNode({key: k, - mut value: v, - mut left: None, - mut right: None})); + *m = Some(@TreeNode {key: k, + mut value: v, + mut left: None, + mut right: None}); return; } Some(node) => { @@ -67,7 +67,8 @@ pub fn find(m: &const TreeEdge, k: K) } /// Visit all pairs in the map in order. -pub fn traverse(m: &const TreeEdge, f: fn((&K), (&V))) { +pub fn traverse(m: &const TreeEdge, + f: fn((&K), (&V))) { match copy *m { None => (), Some(node) => { @@ -79,6 +80,19 @@ pub fn traverse(m: &const TreeEdge, f: fn((&K), (&V))) { } } +/// Compare two treemaps and return true iff +/// they contain same keys and values +pub fn equals(t1: &const TreeEdge, + t2: &const TreeEdge) + -> bool { + let mut v1 = ~[]; + let mut v2 = ~[]; + traverse(t1, |k,v| { v1.push((copy *k, copy *v)) }); + traverse(t2, |k,v| { v2.push((copy *k, copy *v)) }); + return v1 == v2; +} + + #[cfg(test)] mod tests { #[legacy_exports]; @@ -127,6 +141,28 @@ mod tests { traverse(m, |x,y| t(n, *x, *y)); } + #[test] + fn equality() { + let m1 = TreeMap(); + insert(m1, 3, ()); + insert(m1, 0, ()); + insert(m1, 4, ()); + insert(m1, 2, ()); + insert(m1, 1, ()); + let m2 = TreeMap(); + insert(m2, 2, ()); + insert(m2, 1, ()); + insert(m2, 3, ()); + insert(m2, 0, ()); + insert(m2, 4, ()); + + assert equals(m1, m2); + + let m3 = TreeMap(); + assert !equals(m1,m3); + + } + #[test] fn u8_map() { let m = TreeMap();