Skip to content

Commit a0c6a27

Browse files
jedestepemberian
authored andcommitted
---
yaml --- r: 66300 b: refs/heads/master c: dfc9392 h: refs/heads/master v: v3
1 parent 01a55c3 commit a0c6a27

File tree

2 files changed

+73
-50
lines changed

2 files changed

+73
-50
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 4f7a742a067dcd6e8dbcf1da2bbcf203147562cf
2+
refs/heads/master: dfc9392c381c9c5b3e4313e23765c4b04d128e99
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 18e3db7392d2d0697b7e27d6d986139960144d85
55
refs/heads/try: 7b78b52e602bb3ea8174f9b2006bff3315f03ef9

trunk/src/libextra/deque.rs

Lines changed: 72 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// except according to those terms.
1010

1111
//! A double-ended queue implemented as a circular buffer
12-
1312
use core::prelude::*;
1413

1514
use core::uint;
@@ -156,98 +155,122 @@ impl<T> Deque<T> {
156155

157156
/// Front-to-back iterator.
158157
pub fn iter<'a>(&'a self) -> DequeIterator<'a, T> {
159-
DequeIterator { iter: self.elts.iter() }
158+
DequeIterator { idx: self.lo, nelts: self.nelts, used: 0, vec: self.elts }
160159
}
161160

162161
/// Front-to-back iterator which returns mutable values.
163162
pub fn mut_iter<'a>(&'a mut self) -> DequeMutIterator<'a, T> {
164-
DequeMutIterator { iter: self.elts.mut_iter() }
163+
DequeMutIterator { idx: self.lo, nelts: self.nelts, used: 0, vec: self.elts }
165164
}
166165

167166
/// Back-to-front iterator.
168167
pub fn rev_iter<'a>(&'a self) -> DequeRevIterator<'a, T> {
169-
DequeRevIterator { iter: self.elts.rev_iter() }
168+
DequeRevIterator { idx: self.hi - 1u, nelts: self.nelts, used: 0, vec: self.elts }
170169
}
171170

172171
/// Back-to-front iterator which returns mutable values.
173172
pub fn mut_rev_iter<'a>(&'a mut self) -> DequeMutRevIterator<'a, T> {
174-
DequeMutRevIterator { iter: self.elts.mut_rev_iter() }
173+
DequeMutRevIterator { idx: self.hi - 1u, nelts: self.nelts, used: 0, vec: self.elts }
175174
}
176175
}
177176

178177
/// Deque iterator
179178
pub struct DequeIterator<'self, T> {
180-
priv iter: vec::VecIterator<'self, Option<T>>
179+
priv idx: uint,
180+
priv nelts: uint,
181+
priv used: uint,
182+
priv vec: &'self [Option<T>]
181183
}
182184

183185
/// Deque reverse iterator
184186
pub struct DequeRevIterator<'self, T> {
185-
priv iter: vec::VecRevIterator<'self, Option<T>>
187+
priv idx: uint,
188+
priv nelts: uint,
189+
priv used: uint,
190+
priv vec: &'self [Option<T>]
186191
}
187192
/// Deque mutable iterator
188193
pub struct DequeMutIterator<'self, T> {
189-
priv iter: vec::VecMutIterator<'self, Option<T>>
194+
priv idx: uint,
195+
priv nelts: uint,
196+
priv used: uint,
197+
priv vec: &'self mut [Option<T>]
198+
190199
}
191200

192201
/// Deque mutable reverse iterator
193202
pub struct DequeMutRevIterator<'self, T> {
194-
priv iter: vec::VecMutRevIterator<'self, Option<T>>
203+
priv idx: uint,
204+
priv nelts: uint,
205+
priv used: uint,
206+
priv vec: &'self mut [Option<T>]
195207
}
196208

197209
/// Iterator visiting elements of the deque from front to back
198210
impl<'self, T> Iterator<&'self T> for DequeIterator<'self, T> {
199-
#[inline]
200-
fn next(&mut self) -> Option<&'self T> {
201-
for self.iter.advance |elt| {
202-
match elt {
203-
&Some(ref e) => return Some(e),
204-
&None => {},
205-
}
206-
}
207-
None
208-
}
211+
fn next(&mut self) -> Option<&'self T> {
212+
if self.used >= self.nelts {
213+
return None;
214+
}
215+
let ret = match self.vec[self.idx % self.vec.len()] {
216+
Some(ref e) => Some(e),
217+
None => None
218+
};
219+
self.idx += 1;
220+
self.used += 1;
221+
ret
222+
}
209223
}
210224

211225
/// Iterator visiting elements of the deque mutably from front to back
212226
impl<'self, T> Iterator<&'self mut T> for DequeMutIterator<'self, T> {
213-
#[inline]
214-
fn next(&mut self) -> Option<&'self mut T> {
215-
for self.iter.advance |elt| {
216-
match elt {
217-
&Some(ref mut e) => return Some(e),
218-
&None => {},
219-
}
220-
}
221-
None
222-
}
227+
fn next(&mut self) -> Option<&'self mut T> {
228+
if self.used >= self.nelts {
229+
return None;
230+
}
231+
let ret = match self.vec[self.idx % self.vec.len()] {
232+
Some(ref mut e) => Some(e),
233+
None => None
234+
};
235+
self.idx += 1;
236+
self.used += 1;
237+
ret
238+
}
223239
}
224240

225241
/// Iterator visiting elements of the deque from back to front
226242
impl<'self, T> Iterator<&'self T> for DequeRevIterator<'self, T> {
227-
#[inline]
228-
fn next(&mut self) -> Option<&'self T> {
229-
for self.iter.advance |elt| {
230-
match elt {
231-
&Some(ref e) => return Some(e),
232-
&None => {},
233-
}
234-
}
235-
None
236-
}
243+
#[inline]
244+
fn next(&mut self) -> Option<&'self T> {
245+
if self.used >= self.nelts {
246+
return None;
247+
}
248+
let ret = match self.vec[self.idx % self.vec.len()] {
249+
Some(ref e) => Some(e),
250+
None => None
251+
};
252+
self.idx -= 1;
253+
self.used += 1;
254+
ret
255+
256+
}
237257
}
238258

239259
/// Iterator visiting elements of the deque mutably from back to front
240260
impl<'self, T> Iterator<&'self mut T> for DequeMutRevIterator<'self, T> {
241-
#[inline]
242-
fn next(&mut self) -> Option<&'self mut T> {
243-
for self.iter.advance |elt| {
244-
match elt {
245-
&Some(ref mut e) => return Some(e),
246-
&None => {},
247-
}
248-
}
249-
None
250-
}
261+
#[inline]
262+
fn next(&mut self) -> Option<&'self mut T> {
263+
if self.used >= self.nelts {
264+
return None;
265+
}
266+
let ret = match self.vec[self.idx % self.vec.len()] {
267+
Some(ref mut e) => Some(e),
268+
None => None
269+
};
270+
self.idx -= 1;
271+
self.used += 1;
272+
ret
273+
}
251274
}
252275

253276
/// Grow is only called on full elts, so nelts is also len(elts), unlike

0 commit comments

Comments
 (0)