@@ -11,28 +11,28 @@ use core::cmp::{Eq, Ord};
11
11
use core:: option:: { Some , None } ;
12
12
use Option = core:: Option ;
13
13
14
- pub type TreeMap < K , V > = @mut TreeEdge < K , V > ;
14
+ pub type TreeMap < K : Copy Eq Ord , V : Copy > = @mut TreeEdge < K , V > ;
15
15
16
- type TreeEdge < K , V > = Option < @TreeNode < K , V > > ;
16
+ type TreeEdge < K : Copy Eq Ord , V : Copy > = Option < @TreeNode < K , V > > ;
17
17
18
- enum TreeNode < K , V > = {
18
+ struct TreeNode < K : Copy Eq Ord , V : Copy > {
19
19
key : K ,
20
20
mut value : V ,
21
21
mut left : TreeEdge < K , V > ,
22
22
mut right : TreeEdge < K , V >
23
- } ;
23
+ }
24
24
25
25
/// Create a treemap
26
- pub fn TreeMap < K , V > ( ) -> TreeMap < K , V > { @mut None }
26
+ pub fn TreeMap < K : Copy Eq Ord , V : Copy > ( ) -> TreeMap < K , V > { @mut None }
27
27
28
28
/// Insert a value into the map
29
29
pub fn insert < K : Copy Eq Ord , V : Copy > ( m : & mut TreeEdge < K , V > , k : K , v : V ) {
30
30
match copy * m {
31
31
None => {
32
- * m = Some ( @TreeNode ( { key: k,
33
- mut value: v,
34
- mut left: None ,
35
- mut right: None } ) ) ;
32
+ * m = Some ( @TreeNode { key : k,
33
+ mut value : v,
34
+ mut left : None ,
35
+ mut right : None } ) ;
36
36
return ;
37
37
}
38
38
Some ( node) => {
@@ -67,7 +67,8 @@ pub fn find<K: Copy Eq Ord, V: Copy>(m: &const TreeEdge<K, V>, k: K)
67
67
}
68
68
69
69
/// Visit all pairs in the map in order.
70
- pub fn traverse < K , V : Copy > ( m : & const TreeEdge < K , V > , f : fn ( ( & K ) , ( & V ) ) ) {
70
+ pub fn traverse < K : Copy Eq Ord , V : Copy > ( m : & const TreeEdge < K , V > ,
71
+ f : fn ( ( & K ) , ( & V ) ) ) {
71
72
match copy * m {
72
73
None => ( ) ,
73
74
Some ( node) => {
@@ -79,6 +80,19 @@ pub fn traverse<K, V: Copy>(m: &const TreeEdge<K, V>, f: fn((&K), (&V))) {
79
80
}
80
81
}
81
82
83
+ /// Compare two treemaps and return true iff
84
+ /// they contain same keys and values
85
+ pub fn equals < K : Copy Eq Ord , V : Copy Eq > ( t1 : & const TreeEdge < K , V > ,
86
+ t2 : & const TreeEdge < K , V > )
87
+ -> bool {
88
+ let mut v1 = ~[ ] ;
89
+ let mut v2 = ~[ ] ;
90
+ traverse ( t1, |k, v| { v1. push ( ( copy * k, copy * v) ) } ) ;
91
+ traverse ( t2, |k, v| { v2. push ( ( copy * k, copy * v) ) } ) ;
92
+ return v1 == v2;
93
+ }
94
+
95
+
82
96
#[ cfg( test) ]
83
97
mod tests {
84
98
#[ legacy_exports] ;
@@ -127,6 +141,28 @@ mod tests {
127
141
traverse ( m, |x, y| t ( n, * x, * y) ) ;
128
142
}
129
143
144
+ #[ test]
145
+ fn equality ( ) {
146
+ let m1 = TreeMap ( ) ;
147
+ insert ( m1, 3 , ( ) ) ;
148
+ insert ( m1, 0 , ( ) ) ;
149
+ insert ( m1, 4 , ( ) ) ;
150
+ insert ( m1, 2 , ( ) ) ;
151
+ insert ( m1, 1 , ( ) ) ;
152
+ let m2 = TreeMap ( ) ;
153
+ insert ( m2, 2 , ( ) ) ;
154
+ insert ( m2, 1 , ( ) ) ;
155
+ insert ( m2, 3 , ( ) ) ;
156
+ insert ( m2, 0 , ( ) ) ;
157
+ insert ( m2, 4 , ( ) ) ;
158
+
159
+ assert equals( m1, m2) ;
160
+
161
+ let m3 = TreeMap ( ) ;
162
+ assert ! equals( m1, m3) ;
163
+
164
+ }
165
+
130
166
#[ test]
131
167
fn u8_map ( ) {
132
168
let m = TreeMap ( ) ;
0 commit comments