@@ -17,6 +17,7 @@ use core::default::Default;
17
17
use core:: mem:: zeroed;
18
18
use core:: mem;
19
19
use core:: uint;
20
+ use std:: hash:: { Writer , Hash } ;
20
21
21
22
use { Collection , Mutable , Map , MutableMap , Set , MutableSet } ;
22
23
use slice:: { Items , MutItems } ;
@@ -40,6 +41,15 @@ pub struct TrieMap<T> {
40
41
length : uint
41
42
}
42
43
44
+ impl < T : PartialEq > PartialEq for TrieMap < T > {
45
+ fn eq ( & self , other : & TrieMap < T > ) -> bool {
46
+ self . len ( ) == other. len ( ) &&
47
+ self . iter ( ) . zip ( other. iter ( ) ) . all ( |( a, b) | a == b)
48
+ }
49
+ }
50
+
51
+ impl < T : Eq > Eq for TrieMap < T > { }
52
+
43
53
impl < T > Collection for TrieMap < T > {
44
54
/// Return the number of elements in the map
45
55
#[ inline]
@@ -292,7 +302,16 @@ impl<T> Extendable<(uint, T)> for TrieMap<T> {
292
302
}
293
303
}
294
304
305
+ impl < S : Writer , T : Hash < S > > Hash < S > for TrieMap < T > {
306
+ fn hash ( & self , state : & mut S ) {
307
+ for elt in self . iter ( ) {
308
+ elt. hash ( state) ;
309
+ }
310
+ }
311
+ }
312
+
295
313
#[ allow( missing_doc) ]
314
+ #[ deriving( Hash , PartialEq , Eq ) ]
296
315
pub struct TrieSet {
297
316
map : TrieMap < ( ) >
298
317
}
@@ -661,6 +680,7 @@ mod test_map {
661
680
use std:: prelude:: * ;
662
681
use std:: iter:: range_step;
663
682
use std:: uint;
683
+ use std:: hash;
664
684
665
685
use { MutableMap , Map } ;
666
686
use super :: { TrieMap , TrieNode , Internal , External , Nothing } ;
@@ -933,6 +953,41 @@ mod test_map {
933
953
assert ! ( m_lower. iter( ) . all( |( _, & x) | x == 0 ) ) ;
934
954
assert ! ( m_upper. iter( ) . all( |( _, & x) | x == 0 ) ) ;
935
955
}
956
+
957
+ #[ test]
958
+ fn test_eq ( ) {
959
+ let mut a = TrieMap :: new ( ) ;
960
+ let mut b = TrieMap :: new ( ) ;
961
+
962
+ assert ! ( a == b) ;
963
+ assert ! ( a. insert( 0 , 5 i) ) ;
964
+ assert ! ( a != b) ;
965
+ assert ! ( b. insert( 0 , 4 i) ) ;
966
+ assert ! ( a != b) ;
967
+ assert ! ( a. insert( 5 , 19 ) ) ;
968
+ assert ! ( a != b) ;
969
+ assert ! ( !b. insert( 0 , 5 ) ) ;
970
+ assert ! ( a != b) ;
971
+ assert ! ( b. insert( 5 , 19 ) ) ;
972
+ assert ! ( a == b) ;
973
+ }
974
+
975
+ #[ test]
976
+ fn test_hash ( ) {
977
+ let mut x = TrieMap :: new ( ) ;
978
+ let mut y = TrieMap :: new ( ) ;
979
+
980
+ assert ! ( hash:: hash( & x) == hash:: hash( & y) ) ;
981
+ x. insert ( 1 , 'a' ) ;
982
+ x. insert ( 2 , 'b' ) ;
983
+ x. insert ( 3 , 'c' ) ;
984
+
985
+ y. insert ( 3 , 'c' ) ;
986
+ y. insert ( 2 , 'b' ) ;
987
+ y. insert ( 1 , 'a' ) ;
988
+
989
+ assert ! ( hash:: hash( & x) == hash:: hash( & y) ) ;
990
+ }
936
991
}
937
992
938
993
#[ cfg( test) ]
0 commit comments