blob: e9a819d9292f582b253460210bc4c9a9df45a238 [file] [log] [blame]
Daniel Micayb47e1e92013-02-16 22:55:551// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
Graydon Hoare00c856c2012-12-04 00:48:012// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
Daniel Micayb2060172013-03-21 23:14:0211//! A double-ended queue implemented as a circular buffer
Patrick Waltonf3723cf2013-05-17 22:28:4412use core::prelude::*;
13
Patrick Walton206ab892013-05-25 02:35:2914use core::uint;
Alex Crichton998fece2013-05-06 04:42:5415use core::util::replace;
Patrick Walton206ab892013-05-25 02:35:2916use core::vec;
Alex Crichton998fece2013-05-06 04:42:5417
Patrick Walton85c9fc62013-03-22 21:00:1518static initial_capacity: uint = 32u; // 2^5
Daniel Micayb47e1e92013-02-16 22:55:5519
Alex Crichton39568502013-05-29 03:11:4120#[allow(missing_doc)]
Daniel Micayb47e1e92013-02-16 22:55:5521pub struct Deque<T> {
22 priv nelts: uint,
23 priv lo: uint,
24 priv hi: uint,
25 priv elts: ~[Option<T>]
Marijn Haverbeke26610db2012-01-11 11:49:3326}
Roy Frostig9c818892010-07-21 01:03:0927
Daniel Micayb47e1e92013-02-16 22:55:5528impl<T> Container for Deque<T> {
Daniel Micayb3ee49c2013-03-15 17:41:0229 /// Return the number of elements in the deque
Patrick Waltonc1084092013-03-22 04:34:3030 fn len(&const self) -> uint { self.nelts }
Daniel Micayb3ee49c2013-03-15 17:41:0231
32 /// Return true if the deque contains no elements
Patrick Waltonc1084092013-03-22 04:34:3033 fn is_empty(&const self) -> bool { self.len() == 0 }
Daniel Micayb47e1e92013-02-16 22:55:5534}
Roy Frostig9c818892010-07-21 01:03:0935
Daniel Micayed7c9c42013-02-16 23:55:2536impl<T> Mutable for Deque<T> {
Daniel Micayb3ee49c2013-03-15 17:41:0237 /// Clear the deque, removing all values.
Daniel Micayed7c9c42013-02-16 23:55:2538 fn clear(&mut self) {
Daniel Micayd68be892013-06-13 01:56:1639 for self.elts.mut_iter().advance |x| { *x = None }
Daniel Micayed7c9c42013-02-16 23:55:2540 self.nelts = 0;
41 self.lo = 0;
42 self.hi = 0;
43 }
44}
45
Patrick Walton5fb25462013-05-31 22:17:2246impl<T> Deque<T> {
Niko Matsakis03396472013-04-10 20:14:0647 /// Create an empty Deque
Patrick Walton5fb25462013-05-31 22:17:2248 pub fn new() -> Deque<T> {
Niko Matsakis03396472013-04-10 20:14:0649 Deque{nelts: 0, lo: 0, hi: 0,
50 elts: vec::from_fn(initial_capacity, |_| None)}
51 }
52
53 /// Return a reference to the first element in the deque
54 ///
55 /// Fails if the deque is empty
Patrick Walton5fb25462013-05-31 22:17:2256 pub fn peek_front<'a>(&'a self) -> &'a T { get(self.elts, self.lo) }
Niko Matsakis03396472013-04-10 20:14:0657
58 /// Return a reference to the last element in the deque
59 ///
60 /// Fails if the deque is empty
Patrick Walton5fb25462013-05-31 22:17:2261 pub fn peek_back<'a>(&'a self) -> &'a T { get(self.elts, self.hi - 1u) }
Niko Matsakis03396472013-04-10 20:14:0662
63 /// Retrieve an element in the deque by index
64 ///
65 /// Fails if there is no element with the given index
Patrick Walton5fb25462013-05-31 22:17:2266 pub fn get<'a>(&'a self, i: int) -> &'a T {
Niko Matsakis03396472013-04-10 20:14:0667 let idx = (self.lo + (i as uint)) % self.elts.len();
68 get(self.elts, idx)
69 }
70
Erick Tryzelaar909d8f02013-03-30 01:02:4471 /// Iterate over the elements in the deque
Patrick Walton5fb25462013-05-31 22:17:2272 pub fn each(&self, f: &fn(&T) -> bool) -> bool {
Alex Crichton3ce9dba2013-05-02 22:33:2773 self.eachi(|_i, e| f(e))
74 }
Erick Tryzelaar909d8f02013-03-30 01:02:4475
76 /// Iterate over the elements in the deque by index
Patrick Walton5fb25462013-05-31 22:17:2277 pub fn eachi(&self, f: &fn(uint, &T) -> bool) -> bool {
Alex Crichton3ce9dba2013-05-02 22:33:2778 uint::range(0, self.nelts, |i| f(i, self.get(i as int)))
Erick Tryzelaar909d8f02013-03-30 01:02:4479 }
80
Daniel Micayb3ee49c2013-03-15 17:41:0281 /// Remove and return the first element in the deque
82 ///
83 /// Fails if the deque is empty
Patrick Walton5fb25462013-05-31 22:17:2284 pub fn pop_front(&mut self) -> T {
Alex Crichton7d317fe2013-04-12 05:10:1285 let result = self.elts[self.lo].swap_unwrap();
Daniel Micay61906612013-02-17 00:43:2986 self.lo = (self.lo + 1u) % self.elts.len();
87 self.nelts -= 1u;
88 result
89 }
90
Daniel Micayb3ee49c2013-03-15 17:41:0291 /// Remove and return the last element in the deque
92 ///
93 /// Fails if the deque is empty
Patrick Walton5fb25462013-05-31 22:17:2294 pub fn pop_back(&mut self) -> T {
Daniel Micay61906612013-02-17 00:43:2995 if self.hi == 0u {
96 self.hi = self.elts.len() - 1u;
97 } else { self.hi -= 1u; }
Alex Crichton7d317fe2013-04-12 05:10:1298 let result = self.elts[self.hi].swap_unwrap();
Daniel Micay61906612013-02-17 00:43:2999 self.elts[self.hi] = None;
100 self.nelts -= 1u;
101 result
102 }
Marijn Haverbeke26610db2012-01-11 11:49:33103
Daniel Micayb3ee49c2013-03-15 17:41:02104 /// Prepend an element to the deque
Patrick Walton5fb25462013-05-31 22:17:22105 pub fn add_front(&mut self, t: T) {
Daniel Micay373c0722013-02-17 00:10:10106 let oldlo = self.lo;
Daniel Micayb47e1e92013-02-16 22:55:55107 if self.lo == 0u {
108 self.lo = self.elts.len() - 1u;
109 } else { self.lo -= 1u; }
110 if self.lo == self.hi {
111 self.elts = grow(self.nelts, oldlo, self.elts);
112 self.lo = self.elts.len() - 1u;
113 self.hi = self.nelts;
114 }
115 self.elts[self.lo] = Some(t);
116 self.nelts += 1u;
Erick Tryzelaare84576b2013-01-22 16:44:24117 }
Marijn Haverbeke26610db2012-01-11 11:49:33118
Daniel Micayb3ee49c2013-03-15 17:41:02119 /// Append an element to the deque
Patrick Walton5fb25462013-05-31 22:17:22120 pub fn add_back(&mut self, t: T) {
Daniel Micayb47e1e92013-02-16 22:55:55121 if self.lo == self.hi && self.nelts != 0u {
122 self.elts = grow(self.nelts, self.lo, self.elts);
123 self.lo = 0u;
124 self.hi = self.nelts;
Graydon Hoare2880ecd2010-09-22 22:44:13125 }
Daniel Micayb47e1e92013-02-16 22:55:55126 self.elts[self.hi] = Some(t);
127 self.hi = (self.hi + 1u) % self.elts.len();
128 self.nelts += 1u;
Graydon Hoarece729932011-06-15 18:19:50129 }
Tim Chevalier77de84b2013-05-27 18:47:38130
131 /// Reserve capacity for exactly `n` elements in the given deque,
132 /// doing nothing if `self`'s capacity is already equal to or greater
133 /// than the requested capacity
134 ///
135 /// # Arguments
136 ///
137 /// * n - The number of elements to reserve space for
Patrick Walton5fb25462013-05-31 22:17:22138 pub fn reserve(&mut self, n: uint) {
Tim Chevalier77de84b2013-05-27 18:47:38139 vec::reserve(&mut self.elts, n);
140 }
141
142 /// Reserve capacity for at least `n` elements in the given deque,
143 /// over-allocating in case the caller needs to reserve additional
144 /// space.
145 ///
146 /// Do nothing if `self`'s capacity is already equal to or greater
147 /// than the requested capacity.
148 ///
149 /// # Arguments
150 ///
151 /// * n - The number of elements to reserve space for
Patrick Walton5fb25462013-05-31 22:17:22152 pub fn reserve_at_least(&mut self, n: uint) {
Tim Chevalier77de84b2013-05-27 18:47:38153 vec::reserve_at_least(&mut self.elts, n);
154 }
Jed Estep4f7a7422013-06-25 19:08:47155
156 /// Front-to-back iterator.
157 pub fn iter<'a>(&'a self) -> DequeIterator<'a, T> {
Jed Estepdfc93922013-06-26 02:33:02158 DequeIterator { idx: self.lo, nelts: self.nelts, used: 0, vec: self.elts }
Jed Estep4f7a7422013-06-25 19:08:47159 }
160
161 /// Front-to-back iterator which returns mutable values.
162 pub fn mut_iter<'a>(&'a mut self) -> DequeMutIterator<'a, T> {
Jed Estepdfc93922013-06-26 02:33:02163 DequeMutIterator { idx: self.lo, nelts: self.nelts, used: 0, vec: self.elts }
Jed Estep4f7a7422013-06-25 19:08:47164 }
165
166 /// Back-to-front iterator.
167 pub fn rev_iter<'a>(&'a self) -> DequeRevIterator<'a, T> {
Jed Estepdfc93922013-06-26 02:33:02168 DequeRevIterator { idx: self.hi - 1u, nelts: self.nelts, used: 0, vec: self.elts }
Jed Estep4f7a7422013-06-25 19:08:47169 }
170
171 /// Back-to-front iterator which returns mutable values.
172 pub fn mut_rev_iter<'a>(&'a mut self) -> DequeMutRevIterator<'a, T> {
Jed Estepdfc93922013-06-26 02:33:02173 DequeMutRevIterator { idx: self.hi - 1u, nelts: self.nelts, used: 0, vec: self.elts }
Jed Estep4f7a7422013-06-25 19:08:47174 }
175}
176
177/// Deque iterator
178pub struct DequeIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02179 priv idx: uint,
180 priv nelts: uint,
181 priv used: uint,
182 priv vec: &'self [Option<T>]
Jed Estep4f7a7422013-06-25 19:08:47183}
184
185/// Deque reverse iterator
186pub struct DequeRevIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02187 priv idx: uint,
188 priv nelts: uint,
189 priv used: uint,
190 priv vec: &'self [Option<T>]
Jed Estep4f7a7422013-06-25 19:08:47191}
192/// Deque mutable iterator
193pub struct DequeMutIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02194 priv idx: uint,
195 priv nelts: uint,
196 priv used: uint,
197 priv vec: &'self mut [Option<T>]
198
Jed Estep4f7a7422013-06-25 19:08:47199}
200
201/// Deque mutable reverse iterator
202pub struct DequeMutRevIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02203 priv idx: uint,
204 priv nelts: uint,
205 priv used: uint,
206 priv vec: &'self mut [Option<T>]
Jed Estep4f7a7422013-06-25 19:08:47207}
208
209/// Iterator visiting elements of the deque from front to back
210impl<'self, T> Iterator<&'self T> for DequeIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02211 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 }
Jed Estep4f7a7422013-06-25 19:08:47223}
224
225/// Iterator visiting elements of the deque mutably from front to back
226impl<'self, T> Iterator<&'self mut T> for DequeMutIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02227 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 }
Jed Estep4f7a7422013-06-25 19:08:47239}
240
241/// Iterator visiting elements of the deque from back to front
242impl<'self, T> Iterator<&'self T> for DequeRevIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02243 #[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 }
Jed Estep4f7a7422013-06-25 19:08:47257}
258
259/// Iterator visiting elements of the deque mutably from back to front
260impl<'self, T> Iterator<&'self mut T> for DequeMutRevIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02261 #[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 }
Daniel Micayb47e1e92013-02-16 22:55:55274}
275
276/// Grow is only called on full elts, so nelts is also len(elts), unlike
277/// elsewhere.
Daniel Micay5aa04632013-02-17 02:34:09278fn grow<T>(nelts: uint, lo: uint, elts: &mut [Option<T>]) -> ~[Option<T>] {
Corey Richardsoncc57ca02013-05-19 02:02:45279 assert_eq!(nelts, elts.len());
Daniel Micayb47e1e92013-02-16 22:55:55280 let mut rv = ~[];
281
Daniel Micay6956e812013-02-17 19:08:04282 do rv.grow_fn(nelts + 1) |i| {
Alex Crichton998fece2013-05-06 04:42:54283 replace(&mut elts[(lo + i) % nelts], None)
Daniel Micayb47e1e92013-02-16 22:55:55284 }
285
286 rv
287}
288
Patrick Walton8b56a832013-03-25 20:21:04289fn get<'r, T>(elts: &'r [Option<T>], i: uint) -> &'r T {
Daniel Micay5929f152013-02-17 00:03:27290 match elts[i] { Some(ref t) => t, _ => fail!() }
Roy Frostig9c818892010-07-21 01:03:09291}
Brian Anderson6e27b272012-01-18 03:05:07292
293#[cfg(test)]
294mod tests {
Daniel Micayb47e1e92013-02-16 22:55:55295 use super::*;
Alex Crichton2df07dd2013-02-25 19:11:21296 use core::cmp::Eq;
Brian Andersonccc4c1a2013-05-07 21:54:42297 use core::kinds::Copy;
Tim Chevalier77de84b2013-05-27 18:47:38298 use core::vec::capacity;
Patrick Waltonfa5ee932012-12-28 02:24:18299
Brian Anderson6e27b272012-01-18 03:05:07300 #[test]
301 fn test_simple() {
Daniel Micayb47e1e92013-02-16 22:55:55302 let mut d = Deque::new();
Corey Richardsoncc57ca02013-05-19 02:02:45303 assert_eq!(d.len(), 0u);
Brian Anderson6e27b272012-01-18 03:05:07304 d.add_front(17);
305 d.add_front(42);
306 d.add_back(137);
Corey Richardsoncc57ca02013-05-19 02:02:45307 assert_eq!(d.len(), 3u);
Brian Anderson6e27b272012-01-18 03:05:07308 d.add_back(137);
Corey Richardsoncc57ca02013-05-19 02:02:45309 assert_eq!(d.len(), 4u);
Brian Anderson82f19032013-03-08 20:39:42310 debug!(d.peek_front());
Corey Richardsoncc57ca02013-05-19 02:02:45311 assert_eq!(*d.peek_front(), 42);
Brian Anderson82f19032013-03-08 20:39:42312 debug!(d.peek_back());
Corey Richardsoncc57ca02013-05-19 02:02:45313 assert_eq!(*d.peek_back(), 137);
Niko Matsakisdc072802012-03-22 15:39:41314 let mut i: int = d.pop_front();
Brian Anderson82f19032013-03-08 20:39:42315 debug!(i);
Corey Richardsoncc57ca02013-05-19 02:02:45316 assert_eq!(i, 42);
Brian Anderson6e27b272012-01-18 03:05:07317 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42318 debug!(i);
Corey Richardsoncc57ca02013-05-19 02:02:45319 assert_eq!(i, 137);
Brian Anderson6e27b272012-01-18 03:05:07320 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42321 debug!(i);
Corey Richardsoncc57ca02013-05-19 02:02:45322 assert_eq!(i, 137);
Brian Anderson6e27b272012-01-18 03:05:07323 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42324 debug!(i);
Corey Richardsoncc57ca02013-05-19 02:02:45325 assert_eq!(i, 17);
326 assert_eq!(d.len(), 0u);
Brian Anderson6e27b272012-01-18 03:05:07327 d.add_back(3);
Corey Richardsoncc57ca02013-05-19 02:02:45328 assert_eq!(d.len(), 1u);
Brian Anderson6e27b272012-01-18 03:05:07329 d.add_front(2);
Corey Richardsoncc57ca02013-05-19 02:02:45330 assert_eq!(d.len(), 2u);
Brian Anderson6e27b272012-01-18 03:05:07331 d.add_back(4);
Corey Richardsoncc57ca02013-05-19 02:02:45332 assert_eq!(d.len(), 3u);
Brian Anderson6e27b272012-01-18 03:05:07333 d.add_front(1);
Corey Richardsoncc57ca02013-05-19 02:02:45334 assert_eq!(d.len(), 4u);
Brian Anderson82f19032013-03-08 20:39:42335 debug!(d.get(0));
336 debug!(d.get(1));
337 debug!(d.get(2));
338 debug!(d.get(3));
Corey Richardsoncc57ca02013-05-19 02:02:45339 assert_eq!(*d.get(0), 1);
340 assert_eq!(*d.get(1), 2);
341 assert_eq!(*d.get(2), 3);
342 assert_eq!(*d.get(3), 4);
Brian Anderson6e27b272012-01-18 03:05:07343 }
344
Kevin Cantuc43426e2012-09-13 05:09:55345 #[test]
346 fn test_boxes() {
347 let a: @int = @5;
348 let b: @int = @72;
349 let c: @int = @64;
350 let d: @int = @175;
351
Daniel Micayb47e1e92013-02-16 22:55:55352 let mut deq = Deque::new();
Corey Richardsoncc57ca02013-05-19 02:02:45353 assert_eq!(deq.len(), 0);
Brian Anderson6e27b272012-01-18 03:05:07354 deq.add_front(a);
355 deq.add_front(b);
356 deq.add_back(c);
Corey Richardsoncc57ca02013-05-19 02:02:45357 assert_eq!(deq.len(), 3);
Brian Anderson6e27b272012-01-18 03:05:07358 deq.add_back(d);
Corey Richardsoncc57ca02013-05-19 02:02:45359 assert_eq!(deq.len(), 4);
360 assert_eq!(*deq.peek_front(), b);
361 assert_eq!(*deq.peek_back(), d);
362 assert_eq!(deq.pop_front(), b);
363 assert_eq!(deq.pop_back(), d);
364 assert_eq!(deq.pop_back(), c);
365 assert_eq!(deq.pop_back(), a);
366 assert_eq!(deq.len(), 0);
Brian Anderson6e27b272012-01-18 03:05:07367 deq.add_back(c);
Corey Richardsoncc57ca02013-05-19 02:02:45368 assert_eq!(deq.len(), 1);
Brian Anderson6e27b272012-01-18 03:05:07369 deq.add_front(b);
Corey Richardsoncc57ca02013-05-19 02:02:45370 assert_eq!(deq.len(), 2);
Brian Anderson6e27b272012-01-18 03:05:07371 deq.add_back(d);
Corey Richardsoncc57ca02013-05-19 02:02:45372 assert_eq!(deq.len(), 3);
Brian Anderson6e27b272012-01-18 03:05:07373 deq.add_front(a);
Corey Richardsoncc57ca02013-05-19 02:02:45374 assert_eq!(deq.len(), 4);
375 assert_eq!(*deq.get(0), a);
376 assert_eq!(*deq.get(1), b);
377 assert_eq!(*deq.get(2), c);
378 assert_eq!(*deq.get(3), d);
Daniel Micay373c0722013-02-17 00:10:10379 }
380
Felix S. Klock IIa636f512013-05-01 23:32:37381 #[cfg(test)]
Brian Andersonccc4c1a2013-05-07 21:54:42382 fn test_parameterized<T:Copy + Eq>(a: T, b: T, c: T, d: T) {
Daniel Micay373c0722013-02-17 00:10:10383 let mut deq = Deque::new();
Corey Richardsoncc57ca02013-05-19 02:02:45384 assert_eq!(deq.len(), 0);
Niko Matsakiseb48c292013-06-16 00:26:59385 deq.add_front(copy a);
386 deq.add_front(copy b);
387 deq.add_back(copy c);
Corey Richardsoncc57ca02013-05-19 02:02:45388 assert_eq!(deq.len(), 3);
Niko Matsakiseb48c292013-06-16 00:26:59389 deq.add_back(copy d);
Corey Richardsoncc57ca02013-05-19 02:02:45390 assert_eq!(deq.len(), 4);
Niko Matsakiseb48c292013-06-16 00:26:59391 assert_eq!(copy *deq.peek_front(), copy b);
392 assert_eq!(copy *deq.peek_back(), copy d);
393 assert_eq!(deq.pop_front(), copy b);
394 assert_eq!(deq.pop_back(), copy d);
395 assert_eq!(deq.pop_back(), copy c);
396 assert_eq!(deq.pop_back(), copy a);
Corey Richardsoncc57ca02013-05-19 02:02:45397 assert_eq!(deq.len(), 0);
Niko Matsakiseb48c292013-06-16 00:26:59398 deq.add_back(copy c);
Corey Richardsoncc57ca02013-05-19 02:02:45399 assert_eq!(deq.len(), 1);
Niko Matsakiseb48c292013-06-16 00:26:59400 deq.add_front(copy b);
Corey Richardsoncc57ca02013-05-19 02:02:45401 assert_eq!(deq.len(), 2);
Niko Matsakiseb48c292013-06-16 00:26:59402 deq.add_back(copy d);
Corey Richardsoncc57ca02013-05-19 02:02:45403 assert_eq!(deq.len(), 3);
Niko Matsakiseb48c292013-06-16 00:26:59404 deq.add_front(copy a);
Corey Richardsoncc57ca02013-05-19 02:02:45405 assert_eq!(deq.len(), 4);
Niko Matsakiseb48c292013-06-16 00:26:59406 assert_eq!(copy *deq.get(0), copy a);
407 assert_eq!(copy *deq.get(1), copy b);
408 assert_eq!(copy *deq.get(2), copy c);
409 assert_eq!(copy *deq.get(3), copy d);
Brian Anderson6e27b272012-01-18 03:05:07410 }
411
Andrew Paseltiner4055fe82013-03-20 15:36:16412 #[deriving(Eq)]
Ben Striegela605fd02012-08-11 14:08:42413 enum Taggy { One(int), Two(int, int), Three(int, int, int), }
Brian Anderson6e27b272012-01-18 03:05:07414
Andrew Paseltiner4055fe82013-03-20 15:36:16415 #[deriving(Eq)]
Ben Striegela605fd02012-08-11 14:08:42416 enum Taggypar<T> {
417 Onepar(int), Twopar(int, int), Threepar(int, int, int),
Brian Anderson6e27b272012-01-18 03:05:07418 }
419
Andrew Paseltiner4055fe82013-03-20 15:36:16420 #[deriving(Eq)]
Erick Tryzelaare84576b2013-01-22 16:44:24421 struct RecCy {
422 x: int,
423 y: int,
Patrick Waltoneb4d39e2013-01-26 00:57:39424 t: Taggy
Patrick Walton9117dcb2012-09-20 01:00:26425 }
Kevin Cantuc43426e2012-09-13 05:09:55426
427 #[test]
428 fn test_param_int() {
429 test_parameterized::<int>(5, 72, 64, 175);
430 }
431
432 #[test]
433 fn test_param_at_int() {
434 test_parameterized::<@int>(@5, @72, @64, @175);
435 }
436
437 #[test]
438 fn test_param_taggy() {
439 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3),
440 Two(17, 42));
441 }
442
443 #[test]
444 fn test_param_taggypar() {
445 test_parameterized::<Taggypar<int>>(Onepar::<int>(1),
Ben Striegela605fd02012-08-11 14:08:42446 Twopar::<int>(1, 2),
447 Threepar::<int>(1, 2, 3),
448 Twopar::<int>(17, 42));
Kevin Cantuc43426e2012-09-13 05:09:55449 }
Brian Anderson6e27b272012-01-18 03:05:07450
Kevin Cantuc43426e2012-09-13 05:09:55451 #[test]
452 fn test_param_reccy() {
Erick Tryzelaare84576b2013-01-22 16:44:24453 let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
454 let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
455 let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
456 let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
Kevin Cantuc43426e2012-09-13 05:09:55457 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
Brian Anderson6e27b272012-01-18 03:05:07458 }
Erick Tryzelaar909d8f02013-03-30 01:02:44459
460 #[test]
461 fn test_eachi() {
462 let mut deq = Deque::new();
463 deq.add_back(1);
464 deq.add_back(2);
465 deq.add_back(3);
466
467 for deq.eachi |i, e| {
468 assert_eq!(*e, i + 1);
469 }
470
471 deq.pop_front();
472
473 for deq.eachi |i, e| {
474 assert_eq!(*e, i + 2);
475 }
476
477 }
Tim Chevalier77de84b2013-05-27 18:47:38478
479 #[test]
480 fn test_reserve() {
481 let mut d = Deque::new();
482 d.add_back(0u64);
483 d.reserve(50);
484 assert_eq!(capacity(&mut d.elts), 50);
485 let mut d = Deque::new();
486 d.add_back(0u32);
487 d.reserve(50);
488 assert_eq!(capacity(&mut d.elts), 50);
489 }
490
491 #[test]
492 fn test_reserve_at_least() {
493 let mut d = Deque::new();
494 d.add_back(0u64);
495 d.reserve_at_least(50);
496 assert_eq!(capacity(&mut d.elts), 64);
497 let mut d = Deque::new();
498 d.add_back(0u32);
499 d.reserve_at_least(50);
500 assert_eq!(capacity(&mut d.elts), 64);
501 }
502
Jed Estep096fb792013-06-26 14:04:44503 #[test]
504 fn test_iter() {
505 let mut d = Deque::new();
506 for std::int::range(0,5) |i| {
507 d.add_back(i);
508 }
509 assert_eq!(d.iter().collect::<~[&int]>(),
510 ~[&0,&1,&2,&3,&4]);
511
512 for std::int::range(6,9) |i| {
513 d.add_front(i);
514 }
515 assert_eq!(d.iter().collect::<~[&int]>(),
516 ~[&8,&7,&6,&0,&1,&2,&3,&4]);
517 }
518
519 #[test]
520 fn test_rev_iter() {
521 let mut d = Deque::new();
522 for std::int::range(0,5) |i| {
523 d.add_back(i);
524 }
525 assert_eq!(d.rev_iter().collect::<~[&int]>(),
526 ~[&4,&3,&2,&1,&0]);
527
528 for std::int::range(6,9) |i| {
529 d.add_front(i);
530 }
531 assert_eq!(d.rev_iter().collect::<~[&int]>(),
532 ~[&4,&3,&2,&1,&0,&6,&7,&8]);
533 }
Michael Sullivanc854d6e2012-07-03 17:52:32534}