|
9 | 9 | // except according to those terms.
|
10 | 10 |
|
11 | 11 | //! A double-ended queue implemented as a circular buffer
|
12 |
| -
|
13 | 12 | use core::prelude::*;
|
14 | 13 |
|
15 | 14 | use core::uint;
|
@@ -156,98 +155,122 @@ impl<T> Deque<T> {
|
156 | 155 |
|
157 | 156 | /// Front-to-back iterator.
|
158 | 157 | 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 } |
160 | 159 | }
|
161 | 160 |
|
162 | 161 | /// Front-to-back iterator which returns mutable values.
|
163 | 162 | 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 } |
165 | 164 | }
|
166 | 165 |
|
167 | 166 | /// Back-to-front iterator.
|
168 | 167 | 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 } |
170 | 169 | }
|
171 | 170 |
|
172 | 171 | /// Back-to-front iterator which returns mutable values.
|
173 | 172 | 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 } |
175 | 174 | }
|
176 | 175 | }
|
177 | 176 |
|
178 | 177 | /// Deque iterator
|
179 | 178 | 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>] |
181 | 183 | }
|
182 | 184 |
|
183 | 185 | /// Deque reverse iterator
|
184 | 186 | 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>] |
186 | 191 | }
|
187 | 192 | /// Deque mutable iterator
|
188 | 193 | 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 | + |
190 | 199 | }
|
191 | 200 |
|
192 | 201 | /// Deque mutable reverse iterator
|
193 | 202 | 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>] |
195 | 207 | }
|
196 | 208 |
|
197 | 209 | /// Iterator visiting elements of the deque from front to back
|
198 | 210 | 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 | + } |
209 | 223 | }
|
210 | 224 |
|
211 | 225 | /// Iterator visiting elements of the deque mutably from front to back
|
212 | 226 | 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 | + } |
223 | 239 | }
|
224 | 240 |
|
225 | 241 | /// Iterator visiting elements of the deque from back to front
|
226 | 242 | 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 | + } |
237 | 257 | }
|
238 | 258 |
|
239 | 259 | /// Iterator visiting elements of the deque mutably from back to front
|
240 | 260 | 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 | + } |
251 | 274 | }
|
252 | 275 |
|
253 | 276 | /// Grow is only called on full elts, so nelts is also len(elts), unlike
|
|
0 commit comments