@@ -18,6 +18,10 @@ use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater};
18
18
use clone:: Clone ;
19
19
use iter:: BaseIter ;
20
20
use iter;
21
+ #[ cfg( stage1) ]
22
+ #[ cfg( stage2) ]
23
+ #[ cfg( stage3) ]
24
+ use iterator:: Iterator ;
21
25
use kinds:: Copy ;
22
26
use libc;
23
27
use option:: { None , Option , Some } ;
@@ -1919,6 +1923,7 @@ impl<'self,T> ImmutableVector<T> for &'self [T] {
1919
1923
#[ cfg( stage3) ]
1920
1924
pub trait ImmutableVector < ' self , T > {
1921
1925
fn slice ( & self , start : uint , end : uint ) -> & ' self [ T ] ;
1926
+ fn iter ( self ) -> VecIterator < ' self , T > ;
1922
1927
fn head ( & self ) -> & ' self T ;
1923
1928
fn head_opt ( & self ) -> Option < & ' self T > ;
1924
1929
fn tail ( & self ) -> & ' self [ T ] ;
@@ -1949,6 +1954,15 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
1949
1954
slice ( * self , start, end)
1950
1955
}
1951
1956
1957
+ #[ inline]
1958
+ fn iter ( self ) -> VecIterator < ' self , T > {
1959
+ unsafe {
1960
+ let p = vec:: raw:: to_ptr ( self ) ;
1961
+ VecIterator { ptr : p, end : p. offset ( self . len ( ) ) ,
1962
+ lifetime : cast:: transmute ( p) }
1963
+ }
1964
+ }
1965
+
1952
1966
/// Returns the first element of a vector, failing if the vector is empty.
1953
1967
#[ inline]
1954
1968
fn head ( & self ) -> & ' self T { head ( * self ) }
@@ -2795,7 +2809,33 @@ impl<A:Clone> Clone for ~[A] {
2795
2809
}
2796
2810
}
2797
2811
2798
- // ___________________________________________________________________________
2812
+ // could be implemented with &[T] with .slice(), but this avoids bounds checks
2813
+ #[ cfg( stage1) ]
2814
+ #[ cfg( stage2) ]
2815
+ #[ cfg( stage3) ]
2816
+ pub struct VecIterator < ' self , T > {
2817
+ priv ptr: * T ,
2818
+ priv end: * T ,
2819
+ priv lifetime : & ' self T // FIXME: #5922
2820
+ }
2821
+
2822
+ #[ cfg( stage1) ]
2823
+ #[ cfg( stage2) ]
2824
+ #[ cfg( stage3) ]
2825
+ impl < ' self , T > Iterator < & ' self T > for VecIterator < ' self , T > {
2826
+ #[ inline]
2827
+ fn next ( & mut self ) -> Option < & ' self T > {
2828
+ unsafe {
2829
+ if self . ptr == self . end {
2830
+ None
2831
+ } else {
2832
+ let old = self . ptr ;
2833
+ self . ptr = self . ptr . offset ( 1 ) ;
2834
+ Some ( cast:: transmute ( old) )
2835
+ }
2836
+ }
2837
+ }
2838
+ }
2799
2839
2800
2840
#[ cfg( test) ]
2801
2841
mod tests {
@@ -4421,6 +4461,19 @@ mod tests {
4421
4461
[ 1 , 2 , 3 , 4 , 5 , 5 , 5 , 5 ] . cmp ( & & [ 1 , 2 , 3 , 4 , 5 , 6 ] ) == Less ;
4422
4462
[ 2 , 2 ] . cmp ( & & [ 1 , 2 , 3 , 4 ] ) == Greater ;
4423
4463
}
4464
+
4465
+ #[ test]
4466
+ fn test_iterator ( ) {
4467
+ use iterator:: * ;
4468
+ let xs = [ 1 , 2 , 5 , 10 , 11 ] ;
4469
+ let ys = [ 1 , 2 , 5 , 10 , 11 , 19 ] ;
4470
+ let mut it = xs. iter ( ) ;
4471
+ let mut i = 0 ;
4472
+ for it. advance |& x| {
4473
+ assert_eq ! ( x, ys[ i] ) ;
4474
+ i += 1 ;
4475
+ }
4476
+ }
4424
4477
}
4425
4478
4426
4479
// Local Variables:
0 commit comments