@@ -2116,8 +2116,7 @@ macro_rules! iterator {
2116
2116
2117
2117
#[ inline]
2118
2118
fn size_hint( & self ) -> ( uint, Option <uint>) {
2119
- let diff = ( self . end as uint) - ( self . ptr as uint) ;
2120
- let exact = diff / sys:: nonzero_size_of:: <$elem>( ) ;
2119
+ let exact = self . indexable( ) ;
2121
2120
( exact, Some ( exact) )
2122
2121
}
2123
2122
}
@@ -2145,6 +2144,28 @@ macro_rules! double_ended_iterator {
2145
2144
}
2146
2145
}
2147
2146
2147
+ macro_rules! random_access_iterator {
2148
+ ( impl $name: ident -> $elem: ty) => {
2149
+ impl <' self , T > RandomAccessIterator <$elem> for $name<' self , T > {
2150
+ #[ inline]
2151
+ fn indexable( & self ) -> uint {
2152
+ let diff = ( self . end as uint) - ( self . ptr as uint) ;
2153
+ diff / sys:: nonzero_size_of:: <T >( )
2154
+ }
2155
+
2156
+ fn idx( & self , index: uint) -> Option <$elem> {
2157
+ unsafe {
2158
+ if index < self . indexable( ) {
2159
+ cast:: transmute( self . ptr. offset( index) )
2160
+ } else {
2161
+ None
2162
+ }
2163
+ }
2164
+ }
2165
+ }
2166
+ }
2167
+ }
2168
+
2148
2169
//iterator!{struct VecIterator -> *T, &'self T}
2149
2170
/// An iterator for iterating over a vector.
2150
2171
pub struct VecIterator <' self , T > {
@@ -2154,6 +2175,7 @@ pub struct VecIterator<'self, T> {
2154
2175
}
2155
2176
iterator!{ impl VecIterator -> & ' self T }
2156
2177
double_ended_iterator!{ impl VecIterator -> & ' self T }
2178
+ random_access_iterator!{ impl VecIterator -> & ' self T }
2157
2179
pub type VecRevIterator <' self , T > = InvertIterator <& ' self T , VecIterator <' self , T >>;
2158
2180
2159
2181
impl <' self , T > Clone for VecIterator <' self , T > {
@@ -2169,6 +2191,7 @@ pub struct VecMutIterator<'self, T> {
2169
2191
}
2170
2192
iterator!{ impl VecMutIterator -> & ' self mut T }
2171
2193
double_ended_iterator!{ impl VecMutIterator -> & ' self mut T }
2194
+ random_access_iterator!{ impl VecMutIterator -> & ' self mut T }
2172
2195
pub type VecMutRevIterator <' self , T > = InvertIterator <& ' self mut T , VecMutIterator <' self , T >>;
2173
2196
2174
2197
/// An iterator that moves out of a vector.
@@ -3108,6 +3131,45 @@ mod tests {
3108
3131
assert ! ( it. next( ) . is_none( ) ) ;
3109
3132
}
3110
3133
3134
+ #[ test]
3135
+ fn test_random_access_iterator ( ) {
3136
+ use iterator:: * ;
3137
+ let xs = [ 1 , 2 , 5 , 10 , 11 ] ;
3138
+ let mut it = xs. iter ( ) ;
3139
+
3140
+ assert_eq ! ( it. indexable( ) , 5 ) ;
3141
+ assert_eq ! ( it. idx( 0 ) . unwrap( ) , & 1 ) ;
3142
+ assert_eq ! ( it. idx( 2 ) . unwrap( ) , & 5 ) ;
3143
+ assert_eq ! ( it. idx( 4 ) . unwrap( ) , & 11 ) ;
3144
+ assert ! ( it. idx( 5 ) . is_none( ) ) ;
3145
+
3146
+ assert_eq ! ( it. next( ) . unwrap( ) , & 1 ) ;
3147
+ assert_eq ! ( it. indexable( ) , 4 ) ;
3148
+ assert_eq ! ( it. idx( 0 ) . unwrap( ) , & 2 ) ;
3149
+ assert_eq ! ( it. idx( 3 ) . unwrap( ) , & 11 ) ;
3150
+ assert ! ( it. idx( 4 ) . is_none( ) ) ;
3151
+
3152
+ assert_eq ! ( it. next( ) . unwrap( ) , & 2 ) ;
3153
+ assert_eq ! ( it. indexable( ) , 3 ) ;
3154
+ assert_eq ! ( it. idx( 1 ) . unwrap( ) , & 10 ) ;
3155
+ assert ! ( it. idx( 3 ) . is_none( ) ) ;
3156
+
3157
+ assert_eq ! ( it. next( ) . unwrap( ) , & 5 ) ;
3158
+ assert_eq ! ( it. indexable( ) , 2 ) ;
3159
+ assert_eq ! ( it. idx( 1 ) . unwrap( ) , & 11 ) ;
3160
+
3161
+ assert_eq ! ( it. next( ) . unwrap( ) , & 10 ) ;
3162
+ assert_eq ! ( it. indexable( ) , 1 ) ;
3163
+ assert_eq ! ( it. idx( 0 ) . unwrap( ) , & 11 ) ;
3164
+ assert ! ( it. idx( 1 ) . is_none( ) ) ;
3165
+
3166
+ assert_eq ! ( it. next( ) . unwrap( ) , & 11 ) ;
3167
+ assert_eq ! ( it. indexable( ) , 0 ) ;
3168
+ assert ! ( it. idx( 0 ) . is_none( ) ) ;
3169
+
3170
+ assert ! ( it. next( ) . is_none( ) ) ;
3171
+ }
3172
+
3111
3173
#[ test]
3112
3174
fn test_iter_size_hints ( ) {
3113
3175
use iterator:: * ;
0 commit comments