@@ -96,9 +96,9 @@ fn main() {
96
96
}
97
97
98
98
// reverse complement, as
99
- // seq.reverse(); for c in seq.iter_mut() {*c = complements[*c]}
99
+ // seq.reverse(); for c in seq.iter_mut() { *c = complements[*c] }
100
100
// but faster:
101
- for ( front, back) in TwoSideIterator :: new ( seq) {
101
+ for ( front, back) in two_side_iter ( seq) {
102
102
let tmp = complements[ * front as uint ] ;
103
103
* front = complements[ * back as uint ] ;
104
104
* back = tmp;
@@ -112,30 +112,39 @@ fn main() {
112
112
stdout ( ) . write ( data. as_slice ( ) ) . unwrap ( ) ;
113
113
}
114
114
115
- pub struct TwoSideIterator < ' a , T : ' a > {
116
- last : uint ,
117
- nb : uint ,
118
- cur : uint ,
119
- slice : & ' a mut [ T ]
115
+ pub struct TwoSideIter < ' a , T : ' a > {
116
+ first : * mut T ,
117
+ last : * mut T ,
118
+ marker : std :: kinds :: marker :: ContravariantLifetime < ' a > ,
119
+ marker2 : std :: kinds :: marker :: NoCopy
120
120
}
121
- impl < ' a , T > TwoSideIterator < ' a , T > {
122
- pub fn new ( s : & ' a mut [ T ] ) -> TwoSideIterator < ' a , T > {
123
- TwoSideIterator {
124
- last : s. len ( ) - 1 ,
125
- nb : s. len ( ) / 2 ,
126
- cur : 0 ,
127
- slice : s
128
- }
121
+
122
+ pub fn two_side_iter < ' a , T > ( slice : & ' a mut [ T ] ) -> TwoSideIter < ' a , T > {
123
+ let len = slice. len ( ) ;
124
+ let first = slice. as_mut_ptr ( ) ;
125
+ let last = if len == 0 {
126
+ first
127
+ } else {
128
+ unsafe { first. offset ( len as int - 1 ) }
129
+ } ;
130
+
131
+ TwoSideIter {
132
+ first : first,
133
+ last : last,
134
+ marker : std:: kinds:: marker:: ContravariantLifetime ,
135
+ marker2 : std:: kinds:: marker:: NoCopy
129
136
}
130
137
}
131
- impl < ' a , T > Iterator < ( & ' a mut T , & ' a mut T ) > for TwoSideIterator < ' a , T > {
138
+
139
+ impl < ' a , T > Iterator < ( & ' a mut T , & ' a mut T ) > for TwoSideIter < ' a , T > {
132
140
fn next ( & mut self ) -> Option < ( & ' a mut T , & ' a mut T ) > {
133
- if self . cur >= self . nb { return None ; }
134
- let res = unsafe {
135
- ( std:: mem:: transmute ( self . slice . unsafe_mut ( self . cur ) ) ,
136
- std:: mem:: transmute ( self . slice . unsafe_mut ( self . last - self . cur ) ) )
137
- } ;
138
- self . cur += 1 ;
139
- Some ( res)
141
+ if self . first < self . last {
142
+ let result = unsafe { ( & mut * self . first , & mut * self . last ) } ;
143
+ self . first = unsafe { self . first . offset ( 1 ) } ;
144
+ self . last = unsafe { self . last . offset ( -1 ) } ;
145
+ Some ( result)
146
+ } else {
147
+ None
148
+ }
140
149
}
141
150
}
0 commit comments