11
11
//! An ordered map and set for integer keys implemented as a radix trie
12
12
13
13
use prelude:: * ;
14
- use iterator:: IteratorUtil ;
14
+ use iterator:: { IteratorUtil , FromIterator } ;
15
15
use uint;
16
16
use util:: { swap, replace} ;
17
17
@@ -171,6 +171,18 @@ impl<T> TrieMap<T> {
171
171
}
172
172
}
173
173
174
+ impl < T , Iter : Iterator < ( uint , T ) > > FromIterator < ( uint , T ) , Iter > for TrieMap < T > {
175
+ pub fn from_iterator ( iter : & mut Iter ) -> TrieMap < T > {
176
+ let mut map = TrieMap :: new ( ) ;
177
+
178
+ for iter. advance |( k, v) | {
179
+ map. insert ( k, v) ;
180
+ }
181
+
182
+ map
183
+ }
184
+ }
185
+
174
186
#[ allow( missing_doc) ]
175
187
pub struct TrieSet {
176
188
priv map: TrieMap < ( ) >
@@ -230,6 +242,18 @@ impl TrieSet {
230
242
}
231
243
}
232
244
245
+ impl < Iter : Iterator < uint > > FromIterator < uint , Iter > for TrieSet {
246
+ pub fn from_iterator ( iter : & mut Iter ) -> TrieSet {
247
+ let mut set = TrieSet :: new ( ) ;
248
+
249
+ for iter. advance |elem| {
250
+ set. insert ( elem) ;
251
+ }
252
+
253
+ set
254
+ }
255
+ }
256
+
233
257
struct TrieNode < T > {
234
258
count : uint ,
235
259
children : [ Child < T > , ..SIZE ]
@@ -382,7 +406,7 @@ pub fn check_integrity<T>(trie: &TrieNode<T>) {
382
406
}
383
407
384
408
#[ cfg( test) ]
385
- mod tests {
409
+ mod test_map {
386
410
use super:: * ;
387
411
use core : : option:: { Some , None} ;
388
412
use uint;
@@ -510,6 +534,39 @@ mod tests {
510
534
}
511
535
}
512
536
537
+ #[ test]
538
+ fn test_swap ( ) {
539
+ let mut m = TrieMap :: new ( ) ;
540
+ assert_eq ! ( m. swap( 1 , 2 ) , None ) ;
541
+ assert_eq ! ( m. swap( 1 , 3 ) , Some ( 2 ) ) ;
542
+ assert_eq ! ( m. swap( 1 , 4 ) , Some ( 3 ) ) ;
543
+ }
544
+
545
+ #[ test]
546
+ fn test_pop ( ) {
547
+ let mut m = TrieMap :: new ( ) ;
548
+ m. insert ( 1 , 2 ) ;
549
+ assert_eq ! ( m. pop( & 1 ) , Some ( 2 ) ) ;
550
+ assert_eq ! ( m. pop( & 1 ) , None ) ;
551
+ }
552
+
553
+ #[ test]
554
+ fn test_from_iter( ) {
555
+ let xs = ~[ ( 1 u, 1 i) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) ] ;
556
+
557
+ let map: TrieMap < int > = xs. iter ( ) . transform ( |& x| x) . collect ( ) ;
558
+
559
+ for xs. iter( ) . advance |& ( k, v) | {
560
+ assert_eq ! ( map. find( & k) , Some ( & v) ) ;
561
+ }
562
+ }
563
+ }
564
+
565
+ #[ cfg( test) ]
566
+ mod test_set {
567
+ use super:: * ;
568
+ use uint;
569
+
513
570
#[ test]
514
571
fn test_sane_chunk( ) {
515
572
let x = 1 ;
@@ -533,18 +590,13 @@ mod tests {
533
590
}
534
591
535
592
#[ test]
536
- fn test_swap ( ) {
537
- let mut m = TrieMap :: new ( ) ;
538
- assert_eq ! ( m. swap( 1 , 2 ) , None ) ;
539
- assert_eq ! ( m. swap( 1 , 3 ) , Some ( 2 ) ) ;
540
- assert_eq ! ( m. swap( 1 , 4 ) , Some ( 3 ) ) ;
541
- }
593
+ fn test_from_iter( ) {
594
+ let xs = ~[ 9 u, 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ] ;
595
+
596
+ let set: TrieSet = xs. iter( ) . transform( |& x| x) . collect( ) ;
542
597
543
- #[ test]
544
- fn test_pop ( ) {
545
- let mut m = TrieMap :: new ( ) ;
546
- m. insert ( 1 , 2 ) ;
547
- assert_eq ! ( m. pop( & 1 ) , Some ( 2 ) ) ;
548
- assert_eq ! ( m. pop( & 1 ) , None ) ;
598
+ for xs. iter( ) . advance |x| {
599
+ assert ! ( set. contains( x) ) ;
600
+ }
549
601
}
550
602
}
0 commit comments