@@ -66,7 +66,7 @@ use core::prelude::*;
66
66
use core:: cmp;
67
67
use core:: default:: Default ;
68
68
use core:: fmt;
69
- use core:: iter:: Take ;
69
+ use core:: iter:: { Chain , Enumerate , Repeat , Skip , Take } ;
70
70
use core:: iter;
71
71
use core:: ops:: Index ;
72
72
use core:: slice;
@@ -76,25 +76,22 @@ use std::hash;
76
76
use { Collection , Mutable , Set , MutableSet , MutableSeq } ;
77
77
use vec:: Vec ;
78
78
79
+ type MatchWords < ' a > = Chain < MaskWords < ' a > , Skip < Take < Enumerate < Repeat < uint > > > > > ;
79
80
// Take two BitV's, and return iterators of their words, where the shorter one
80
81
// has been padded with 0's
81
- macro_rules! match_words(
82
- ( $a_expr: expr, $b_expr: expr) => ( {
83
- let a = $a_expr;
84
- let b = $b_expr;
85
- let a_len = a. storage. len( ) ;
86
- let b_len = b. storage. len( ) ;
87
-
88
- // have to uselessly pretend to pad the longer one for type matching
89
- if a_len < b_len {
90
- ( a. mask_words( 0 ) . chain( iter:: Repeat :: new( 0 u) . enumerate( ) . take( b_len) . skip( a_len) ) ,
91
- b. mask_words( 0 ) . chain( iter:: Repeat :: new( 0 u) . enumerate( ) . take( 0 ) . skip( 0 ) ) )
92
- } else {
93
- ( a. mask_words( 0 ) . chain( iter:: Repeat :: new( 0 u) . enumerate( ) . take( 0 ) . skip( 0 ) ) ,
94
- b. mask_words( 0 ) . chain( iter:: Repeat :: new( 0 u) . enumerate( ) . take( a_len) . skip( b_len) ) )
95
- }
96
- } )
97
- )
82
+ fn match_words < ' a , ' b > ( a : & ' a Bitv , b : & ' b Bitv ) -> ( MatchWords < ' a > , MatchWords < ' b > ) {
83
+ let a_len = a. storage . len ( ) ;
84
+ let b_len = b. storage . len ( ) ;
85
+
86
+ // have to uselessly pretend to pad the longer one for type matching
87
+ if a_len < b_len {
88
+ ( a. mask_words ( 0 ) . chain ( Repeat :: new ( 0 u) . enumerate ( ) . take ( b_len) . skip ( a_len) ) ,
89
+ b. mask_words ( 0 ) . chain ( Repeat :: new ( 0 u) . enumerate ( ) . take ( 0 ) . skip ( 0 ) ) )
90
+ } else {
91
+ ( a. mask_words ( 0 ) . chain ( Repeat :: new ( 0 u) . enumerate ( ) . take ( 0 ) . skip ( 0 ) ) ,
92
+ b. mask_words ( 0 ) . chain ( Repeat :: new ( 0 u) . enumerate ( ) . take ( a_len) . skip ( b_len) ) )
93
+ }
94
+ }
98
95
99
96
static TRUE : bool = true ;
100
97
static FALSE : bool = false ;
@@ -1015,23 +1012,23 @@ impl Extendable<bool> for BitvSet {
1015
1012
impl PartialOrd for BitvSet {
1016
1013
#[ inline]
1017
1014
fn partial_cmp ( & self , other : & BitvSet ) -> Option < Ordering > {
1018
- let ( a_iter, b_iter) = match_words ! ( self . get_ref( ) , other. get_ref( ) ) ;
1015
+ let ( a_iter, b_iter) = match_words ( self . get_ref ( ) , other. get_ref ( ) ) ;
1019
1016
iter:: order:: partial_cmp ( a_iter, b_iter)
1020
1017
}
1021
1018
}
1022
1019
1023
1020
impl Ord for BitvSet {
1024
1021
#[ inline]
1025
1022
fn cmp ( & self , other : & BitvSet ) -> Ordering {
1026
- let ( a_iter, b_iter) = match_words ! ( self . get_ref( ) , other. get_ref( ) ) ;
1023
+ let ( a_iter, b_iter) = match_words ( self . get_ref ( ) , other. get_ref ( ) ) ;
1027
1024
iter:: order:: cmp ( a_iter, b_iter)
1028
1025
}
1029
1026
}
1030
1027
1031
1028
impl cmp:: PartialEq for BitvSet {
1032
1029
#[ inline]
1033
1030
fn eq ( & self , other : & BitvSet ) -> bool {
1034
- let ( a_iter, b_iter) = match_words ! ( self . get_ref( ) , other. get_ref( ) ) ;
1031
+ let ( a_iter, b_iter) = match_words ( self . get_ref ( ) , other. get_ref ( ) ) ;
1035
1032
iter:: order:: eq ( a_iter, b_iter)
1036
1033
}
1037
1034
}
@@ -1192,10 +1189,10 @@ impl BitvSet {
1192
1189
self_bitv. reserve ( other_bitv. capacity ( ) ) ;
1193
1190
1194
1191
// virtually pad other with 0's for equal lengths
1195
- let self_len = self_bitv . storage . len ( ) ;
1196
- let other_len = other_bitv. storage . len ( ) ;
1197
- let mut other_words = other_bitv . mask_words ( 0 )
1198
- . chain ( iter :: Repeat :: new ( 0 u ) . enumerate ( ) . take ( self_len ) . skip ( other_len ) ) ;
1192
+ let mut other_words = {
1193
+ let ( _ , result ) = match_words ( self_bitv , other_bitv) ;
1194
+ result
1195
+ } ;
1199
1196
1200
1197
// Apply values found in other
1201
1198
for ( i, w) in other_words {
0 commit comments