blob: cf7b188cb1d9291961c894539c6b52a0c422bf67 [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;
Jed Estep35314c92013-06-26 15:38:2917use core::cast::transmute;
Alex Crichton998fece2013-05-06 04:42:5418
Patrick Walton85c9fc62013-03-22 21:00:1519static initial_capacity: uint = 32u; // 2^5
Daniel Micayb47e1e92013-02-16 22:55:5520
Alex Crichton39568502013-05-29 03:11:4121#[allow(missing_doc)]
Daniel Micayb47e1e92013-02-16 22:55:5522pub struct Deque<T> {
23 priv nelts: uint,
24 priv lo: uint,
25 priv hi: uint,
26 priv elts: ~[Option<T>]
Marijn Haverbeke26610db2012-01-11 11:49:3327}
Roy Frostig9c818892010-07-21 01:03:0928
Daniel Micayb47e1e92013-02-16 22:55:5529impl<T> Container for Deque<T> {
Daniel Micayb3ee49c2013-03-15 17:41:0230 /// Return the number of elements in the deque
Alex Crichtonb29c3682013-06-24 03:44:1131 fn len(&self) -> uint { self.nelts }
Daniel Micayb3ee49c2013-03-15 17:41:0232
33 /// Return true if the deque contains no elements
Alex Crichtonb29c3682013-06-24 03:44:1134 fn is_empty(&self) -> bool { self.len() == 0 }
Daniel Micayb47e1e92013-02-16 22:55:5535}
Roy Frostig9c818892010-07-21 01:03:0936
Daniel Micayed7c9c42013-02-16 23:55:2537impl<T> Mutable for Deque<T> {
Daniel Micayb3ee49c2013-03-15 17:41:0238 /// Clear the deque, removing all values.
Daniel Micayed7c9c42013-02-16 23:55:2539 fn clear(&mut self) {
Daniel Micayd68be892013-06-13 01:56:1640 for self.elts.mut_iter().advance |x| { *x = None }
Daniel Micayed7c9c42013-02-16 23:55:2541 self.nelts = 0;
42 self.lo = 0;
43 self.hi = 0;
44 }
45}
46
Patrick Walton5fb25462013-05-31 22:17:2247impl<T> Deque<T> {
Niko Matsakis03396472013-04-10 20:14:0648 /// Create an empty Deque
Patrick Walton5fb25462013-05-31 22:17:2249 pub fn new() -> Deque<T> {
Niko Matsakis03396472013-04-10 20:14:0650 Deque{nelts: 0, lo: 0, hi: 0,
51 elts: vec::from_fn(initial_capacity, |_| None)}
52 }
53
54 /// Return a reference to the first element in the deque
55 ///
56 /// Fails if the deque is empty
Patrick Walton5fb25462013-05-31 22:17:2257 pub fn peek_front<'a>(&'a self) -> &'a T { get(self.elts, self.lo) }
Niko Matsakis03396472013-04-10 20:14:0658
59 /// Return a reference to the last element in the deque
60 ///
61 /// Fails if the deque is empty
Patrick Walton5fb25462013-05-31 22:17:2262 pub fn peek_back<'a>(&'a self) -> &'a T { get(self.elts, self.hi - 1u) }
Niko Matsakis03396472013-04-10 20:14:0663
64 /// Retrieve an element in the deque by index
65 ///
66 /// Fails if there is no element with the given index
Patrick Walton5fb25462013-05-31 22:17:2267 pub fn get<'a>(&'a self, i: int) -> &'a T {
Niko Matsakis03396472013-04-10 20:14:0668 let idx = (self.lo + (i as uint)) % self.elts.len();
69 get(self.elts, idx)
70 }
71
Erick Tryzelaar909d8f02013-03-30 01:02:4472 /// Iterate over the elements in the deque
Patrick Walton5fb25462013-05-31 22:17:2273 pub fn each(&self, f: &fn(&T) -> bool) -> bool {
Alex Crichton3ce9dba2013-05-02 22:33:2774 self.eachi(|_i, e| f(e))
75 }
Erick Tryzelaar909d8f02013-03-30 01:02:4476
77 /// Iterate over the elements in the deque by index
Patrick Walton5fb25462013-05-31 22:17:2278 pub fn eachi(&self, f: &fn(uint, &T) -> bool) -> bool {
Alex Crichton3ce9dba2013-05-02 22:33:2779 uint::range(0, self.nelts, |i| f(i, self.get(i as int)))
Erick Tryzelaar909d8f02013-03-30 01:02:4480 }
81
Daniel Micayb3ee49c2013-03-15 17:41:0282 /// Remove and return the first element in the deque
83 ///
84 /// Fails if the deque is empty
Patrick Walton5fb25462013-05-31 22:17:2285 pub fn pop_front(&mut self) -> T {
Alex Crichton7d317fe2013-04-12 05:10:1286 let result = self.elts[self.lo].swap_unwrap();
Daniel Micay61906612013-02-17 00:43:2987 self.lo = (self.lo + 1u) % self.elts.len();
88 self.nelts -= 1u;
89 result
90 }
91
Daniel Micayb3ee49c2013-03-15 17:41:0292 /// Remove and return the last element in the deque
93 ///
94 /// Fails if the deque is empty
Patrick Walton5fb25462013-05-31 22:17:2295 pub fn pop_back(&mut self) -> T {
Daniel Micay61906612013-02-17 00:43:2996 if self.hi == 0u {
97 self.hi = self.elts.len() - 1u;
98 } else { self.hi -= 1u; }
Alex Crichton7d317fe2013-04-12 05:10:1299 let result = self.elts[self.hi].swap_unwrap();
Daniel Micay61906612013-02-17 00:43:29100 self.elts[self.hi] = None;
101 self.nelts -= 1u;
102 result
103 }
Marijn Haverbeke26610db2012-01-11 11:49:33104
Daniel Micayb3ee49c2013-03-15 17:41:02105 /// Prepend an element to the deque
Patrick Walton5fb25462013-05-31 22:17:22106 pub fn add_front(&mut self, t: T) {
Daniel Micay373c0722013-02-17 00:10:10107 let oldlo = self.lo;
Daniel Micayb47e1e92013-02-16 22:55:55108 if self.lo == 0u {
109 self.lo = self.elts.len() - 1u;
110 } else { self.lo -= 1u; }
111 if self.lo == self.hi {
112 self.elts = grow(self.nelts, oldlo, self.elts);
113 self.lo = self.elts.len() - 1u;
114 self.hi = self.nelts;
115 }
116 self.elts[self.lo] = Some(t);
117 self.nelts += 1u;
Erick Tryzelaare84576b2013-01-22 16:44:24118 }
Marijn Haverbeke26610db2012-01-11 11:49:33119
Daniel Micayb3ee49c2013-03-15 17:41:02120 /// Append an element to the deque
Patrick Walton5fb25462013-05-31 22:17:22121 pub fn add_back(&mut self, t: T) {
Daniel Micayb47e1e92013-02-16 22:55:55122 if self.lo == self.hi && self.nelts != 0u {
123 self.elts = grow(self.nelts, self.lo, self.elts);
124 self.lo = 0u;
125 self.hi = self.nelts;
Graydon Hoare2880ecd2010-09-22 22:44:13126 }
Daniel Micayb47e1e92013-02-16 22:55:55127 self.elts[self.hi] = Some(t);
128 self.hi = (self.hi + 1u) % self.elts.len();
129 self.nelts += 1u;
Graydon Hoarece729932011-06-15 18:19:50130 }
Tim Chevalier77de84b2013-05-27 18:47:38131
132 /// Reserve capacity for exactly `n` elements in the given deque,
133 /// doing nothing if `self`'s capacity is already equal to or greater
134 /// than the requested capacity
135 ///
136 /// # Arguments
137 ///
138 /// * n - The number of elements to reserve space for
Patrick Walton5fb25462013-05-31 22:17:22139 pub fn reserve(&mut self, n: uint) {
Huon Wilson32d65592013-06-27 14:40:47140 self.elts.reserve(n);
Tim Chevalier77de84b2013-05-27 18:47:38141 }
142
143 /// Reserve capacity for at least `n` elements in the given deque,
144 /// over-allocating in case the caller needs to reserve additional
145 /// space.
146 ///
147 /// Do nothing if `self`'s capacity is already equal to or greater
148 /// than the requested capacity.
149 ///
150 /// # Arguments
151 ///
152 /// * n - The number of elements to reserve space for
Patrick Walton5fb25462013-05-31 22:17:22153 pub fn reserve_at_least(&mut self, n: uint) {
Huon Wilson32d65592013-06-27 14:40:47154 self.elts.reserve_at_least(n);
Tim Chevalier77de84b2013-05-27 18:47:38155 }
Jed Estep4f7a7422013-06-25 19:08:47156
157 /// Front-to-back iterator.
158 pub fn iter<'a>(&'a self) -> DequeIterator<'a, T> {
Jed Estepdfc93922013-06-26 02:33:02159 DequeIterator { idx: self.lo, nelts: self.nelts, used: 0, vec: self.elts }
Jed Estep4f7a7422013-06-25 19:08:47160 }
Corey Richardsonf8ae9b02013-06-26 22:14:35161
Jed Estep4f7a7422013-06-25 19:08:47162 /// Front-to-back iterator which returns mutable values.
163 pub fn mut_iter<'a>(&'a mut self) -> DequeMutIterator<'a, T> {
Jed Estepdfc93922013-06-26 02:33:02164 DequeMutIterator { idx: self.lo, nelts: self.nelts, used: 0, vec: self.elts }
Jed Estep4f7a7422013-06-25 19:08:47165 }
166
167 /// Back-to-front iterator.
168 pub fn rev_iter<'a>(&'a self) -> DequeRevIterator<'a, T> {
Jed Estepdfc93922013-06-26 02:33:02169 DequeRevIterator { idx: self.hi - 1u, nelts: self.nelts, used: 0, vec: self.elts }
Jed Estep4f7a7422013-06-25 19:08:47170 }
171
172 /// Back-to-front iterator which returns mutable values.
173 pub fn mut_rev_iter<'a>(&'a mut self) -> DequeMutRevIterator<'a, T> {
Jed Estepdfc93922013-06-26 02:33:02174 DequeMutRevIterator { idx: self.hi - 1u, nelts: self.nelts, used: 0, vec: self.elts }
Jed Estep4f7a7422013-06-25 19:08:47175 }
176}
177
Jed Estep35314c92013-06-26 15:38:29178macro_rules! iterator {
179 (impl $name:ident -> $elem:ty, $step:expr) => {
180 impl<'self, T> Iterator<$elem> for $name<'self, T> {
181 #[inline]
182 fn next(&mut self) -> Option<$elem> {
183 if self.used >= self.nelts {
184 return None;
185 }
Corey Richardsonf8ae9b02013-06-26 22:14:35186 let ret = unsafe {
Jed Estep35314c92013-06-26 15:38:29187 match self.vec[self.idx % self.vec.len()] {
188 Some(ref e) => Some(transmute(e)),
189 None => None
190 }
191 };
192 self.idx += $step;
193 self.used += 1;
194 ret
195 }
196 }
197 }
198}
199
Jed Estep4f7a7422013-06-25 19:08:47200/// Deque iterator
201pub struct DequeIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02202 priv idx: uint,
203 priv nelts: uint,
204 priv used: uint,
205 priv vec: &'self [Option<T>]
Jed Estep4f7a7422013-06-25 19:08:47206}
Jed Estep35314c92013-06-26 15:38:29207iterator!{impl DequeIterator -> &'self T, 1}
Jed Estep4f7a7422013-06-25 19:08:47208
209/// Deque reverse iterator
210pub struct DequeRevIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02211 priv idx: uint,
212 priv nelts: uint,
213 priv used: uint,
214 priv vec: &'self [Option<T>]
Jed Estep4f7a7422013-06-25 19:08:47215}
Jed Estep35314c92013-06-26 15:38:29216iterator!{impl DequeRevIterator -> &'self T, -1}
217
Jed Estep4f7a7422013-06-25 19:08:47218/// Deque mutable iterator
219pub struct DequeMutIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02220 priv idx: uint,
221 priv nelts: uint,
222 priv used: uint,
223 priv vec: &'self mut [Option<T>]
224
Jed Estep4f7a7422013-06-25 19:08:47225}
Jed Estep35314c92013-06-26 15:38:29226iterator!{impl DequeMutIterator -> &'self mut T, 1}
Jed Estep4f7a7422013-06-25 19:08:47227
228/// Deque mutable reverse iterator
229pub struct DequeMutRevIterator<'self, T> {
Jed Estepdfc93922013-06-26 02:33:02230 priv idx: uint,
231 priv nelts: uint,
232 priv used: uint,
233 priv vec: &'self mut [Option<T>]
Jed Estep4f7a7422013-06-25 19:08:47234}
Jed Estep35314c92013-06-26 15:38:29235iterator!{impl DequeMutRevIterator -> &'self mut T, -1}
Daniel Micayb47e1e92013-02-16 22:55:55236
237/// Grow is only called on full elts, so nelts is also len(elts), unlike
238/// elsewhere.
Daniel Micay5aa04632013-02-17 02:34:09239fn grow<T>(nelts: uint, lo: uint, elts: &mut [Option<T>]) -> ~[Option<T>] {
Corey Richardsoncc57ca02013-05-19 02:02:45240 assert_eq!(nelts, elts.len());
Daniel Micayb47e1e92013-02-16 22:55:55241 let mut rv = ~[];
242
Daniel Micay6956e812013-02-17 19:08:04243 do rv.grow_fn(nelts + 1) |i| {
Alex Crichton998fece2013-05-06 04:42:54244 replace(&mut elts[(lo + i) % nelts], None)
Daniel Micayb47e1e92013-02-16 22:55:55245 }
246
247 rv
248}
249
Patrick Walton8b56a832013-03-25 20:21:04250fn get<'r, T>(elts: &'r [Option<T>], i: uint) -> &'r T {
Daniel Micay5929f152013-02-17 00:03:27251 match elts[i] { Some(ref t) => t, _ => fail!() }
Roy Frostig9c818892010-07-21 01:03:09252}
Brian Anderson6e27b272012-01-18 03:05:07253
254#[cfg(test)]
255mod tests {
Daniel Micayb47e1e92013-02-16 22:55:55256 use super::*;
Alex Crichton2df07dd2013-02-25 19:11:21257 use core::cmp::Eq;
Brian Andersonccc4c1a2013-05-07 21:54:42258 use core::kinds::Copy;
Corey Richardsonab428b62013-06-27 00:02:34259 use core;
Patrick Waltonfa5ee932012-12-28 02:24:18260
Brian Anderson6e27b272012-01-18 03:05:07261 #[test]
262 fn test_simple() {
Daniel Micayb47e1e92013-02-16 22:55:55263 let mut d = Deque::new();
Corey Richardsoncc57ca02013-05-19 02:02:45264 assert_eq!(d.len(), 0u);
Brian Anderson6e27b272012-01-18 03:05:07265 d.add_front(17);
266 d.add_front(42);
267 d.add_back(137);
Corey Richardsoncc57ca02013-05-19 02:02:45268 assert_eq!(d.len(), 3u);
Brian Anderson6e27b272012-01-18 03:05:07269 d.add_back(137);
Corey Richardsoncc57ca02013-05-19 02:02:45270 assert_eq!(d.len(), 4u);
Brian Anderson82f19032013-03-08 20:39:42271 debug!(d.peek_front());
Corey Richardsoncc57ca02013-05-19 02:02:45272 assert_eq!(*d.peek_front(), 42);
Brian Anderson82f19032013-03-08 20:39:42273 debug!(d.peek_back());
Corey Richardsoncc57ca02013-05-19 02:02:45274 assert_eq!(*d.peek_back(), 137);
Niko Matsakisdc072802012-03-22 15:39:41275 let mut i: int = d.pop_front();
Brian Anderson82f19032013-03-08 20:39:42276 debug!(i);
Corey Richardsoncc57ca02013-05-19 02:02:45277 assert_eq!(i, 42);
Brian Anderson6e27b272012-01-18 03:05:07278 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42279 debug!(i);
Corey Richardsoncc57ca02013-05-19 02:02:45280 assert_eq!(i, 137);
Brian Anderson6e27b272012-01-18 03:05:07281 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42282 debug!(i);
Corey Richardsoncc57ca02013-05-19 02:02:45283 assert_eq!(i, 137);
Brian Anderson6e27b272012-01-18 03:05:07284 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42285 debug!(i);
Corey Richardsoncc57ca02013-05-19 02:02:45286 assert_eq!(i, 17);
287 assert_eq!(d.len(), 0u);
Brian Anderson6e27b272012-01-18 03:05:07288 d.add_back(3);
Corey Richardsoncc57ca02013-05-19 02:02:45289 assert_eq!(d.len(), 1u);
Brian Anderson6e27b272012-01-18 03:05:07290 d.add_front(2);
Corey Richardsoncc57ca02013-05-19 02:02:45291 assert_eq!(d.len(), 2u);
Brian Anderson6e27b272012-01-18 03:05:07292 d.add_back(4);
Corey Richardsoncc57ca02013-05-19 02:02:45293 assert_eq!(d.len(), 3u);
Brian Anderson6e27b272012-01-18 03:05:07294 d.add_front(1);
Corey Richardsoncc57ca02013-05-19 02:02:45295 assert_eq!(d.len(), 4u);
Brian Anderson82f19032013-03-08 20:39:42296 debug!(d.get(0));
297 debug!(d.get(1));
298 debug!(d.get(2));
299 debug!(d.get(3));
Corey Richardsoncc57ca02013-05-19 02:02:45300 assert_eq!(*d.get(0), 1);
301 assert_eq!(*d.get(1), 2);
302 assert_eq!(*d.get(2), 3);
303 assert_eq!(*d.get(3), 4);
Brian Anderson6e27b272012-01-18 03:05:07304 }
305
Kevin Cantuc43426e2012-09-13 05:09:55306 #[test]
307 fn test_boxes() {
308 let a: @int = @5;
309 let b: @int = @72;
310 let c: @int = @64;
311 let d: @int = @175;
312
Daniel Micayb47e1e92013-02-16 22:55:55313 let mut deq = Deque::new();
Corey Richardsoncc57ca02013-05-19 02:02:45314 assert_eq!(deq.len(), 0);
Brian Anderson6e27b272012-01-18 03:05:07315 deq.add_front(a);
316 deq.add_front(b);
317 deq.add_back(c);
Corey Richardsoncc57ca02013-05-19 02:02:45318 assert_eq!(deq.len(), 3);
Brian Anderson6e27b272012-01-18 03:05:07319 deq.add_back(d);
Corey Richardsoncc57ca02013-05-19 02:02:45320 assert_eq!(deq.len(), 4);
321 assert_eq!(*deq.peek_front(), b);
322 assert_eq!(*deq.peek_back(), d);
323 assert_eq!(deq.pop_front(), b);
324 assert_eq!(deq.pop_back(), d);
325 assert_eq!(deq.pop_back(), c);
326 assert_eq!(deq.pop_back(), a);
327 assert_eq!(deq.len(), 0);
Brian Anderson6e27b272012-01-18 03:05:07328 deq.add_back(c);
Corey Richardsoncc57ca02013-05-19 02:02:45329 assert_eq!(deq.len(), 1);
Brian Anderson6e27b272012-01-18 03:05:07330 deq.add_front(b);
Corey Richardsoncc57ca02013-05-19 02:02:45331 assert_eq!(deq.len(), 2);
Brian Anderson6e27b272012-01-18 03:05:07332 deq.add_back(d);
Corey Richardsoncc57ca02013-05-19 02:02:45333 assert_eq!(deq.len(), 3);
Brian Anderson6e27b272012-01-18 03:05:07334 deq.add_front(a);
Corey Richardsoncc57ca02013-05-19 02:02:45335 assert_eq!(deq.len(), 4);
336 assert_eq!(*deq.get(0), a);
337 assert_eq!(*deq.get(1), b);
338 assert_eq!(*deq.get(2), c);
339 assert_eq!(*deq.get(3), d);
Daniel Micay373c0722013-02-17 00:10:10340 }
341
Felix S. Klock IIa636f512013-05-01 23:32:37342 #[cfg(test)]
Brian Andersonccc4c1a2013-05-07 21:54:42343 fn test_parameterized<T:Copy + Eq>(a: T, b: T, c: T, d: T) {
Daniel Micay373c0722013-02-17 00:10:10344 let mut deq = Deque::new();
Corey Richardsoncc57ca02013-05-19 02:02:45345 assert_eq!(deq.len(), 0);
Niko Matsakiseb48c292013-06-16 00:26:59346 deq.add_front(copy a);
347 deq.add_front(copy b);
348 deq.add_back(copy c);
Corey Richardsoncc57ca02013-05-19 02:02:45349 assert_eq!(deq.len(), 3);
Niko Matsakiseb48c292013-06-16 00:26:59350 deq.add_back(copy d);
Corey Richardsoncc57ca02013-05-19 02:02:45351 assert_eq!(deq.len(), 4);
Niko Matsakiseb48c292013-06-16 00:26:59352 assert_eq!(copy *deq.peek_front(), copy b);
353 assert_eq!(copy *deq.peek_back(), copy d);
354 assert_eq!(deq.pop_front(), copy b);
355 assert_eq!(deq.pop_back(), copy d);
356 assert_eq!(deq.pop_back(), copy c);
357 assert_eq!(deq.pop_back(), copy a);
Corey Richardsoncc57ca02013-05-19 02:02:45358 assert_eq!(deq.len(), 0);
Niko Matsakiseb48c292013-06-16 00:26:59359 deq.add_back(copy c);
Corey Richardsoncc57ca02013-05-19 02:02:45360 assert_eq!(deq.len(), 1);
Niko Matsakiseb48c292013-06-16 00:26:59361 deq.add_front(copy b);
Corey Richardsoncc57ca02013-05-19 02:02:45362 assert_eq!(deq.len(), 2);
Niko Matsakiseb48c292013-06-16 00:26:59363 deq.add_back(copy d);
Corey Richardsoncc57ca02013-05-19 02:02:45364 assert_eq!(deq.len(), 3);
Niko Matsakiseb48c292013-06-16 00:26:59365 deq.add_front(copy a);
Corey Richardsoncc57ca02013-05-19 02:02:45366 assert_eq!(deq.len(), 4);
Niko Matsakiseb48c292013-06-16 00:26:59367 assert_eq!(copy *deq.get(0), copy a);
368 assert_eq!(copy *deq.get(1), copy b);
369 assert_eq!(copy *deq.get(2), copy c);
370 assert_eq!(copy *deq.get(3), copy d);
Brian Anderson6e27b272012-01-18 03:05:07371 }
372
Andrew Paseltiner4055fe82013-03-20 15:36:16373 #[deriving(Eq)]
Ben Striegela605fd02012-08-11 14:08:42374 enum Taggy { One(int), Two(int, int), Three(int, int, int), }
Brian Anderson6e27b272012-01-18 03:05:07375
Andrew Paseltiner4055fe82013-03-20 15:36:16376 #[deriving(Eq)]
Ben Striegela605fd02012-08-11 14:08:42377 enum Taggypar<T> {
378 Onepar(int), Twopar(int, int), Threepar(int, int, int),
Brian Anderson6e27b272012-01-18 03:05:07379 }
380
Andrew Paseltiner4055fe82013-03-20 15:36:16381 #[deriving(Eq)]
Erick Tryzelaare84576b2013-01-22 16:44:24382 struct RecCy {
383 x: int,
384 y: int,
Patrick Waltoneb4d39e2013-01-26 00:57:39385 t: Taggy
Patrick Walton9117dcb2012-09-20 01:00:26386 }
Kevin Cantuc43426e2012-09-13 05:09:55387
388 #[test]
389 fn test_param_int() {
390 test_parameterized::<int>(5, 72, 64, 175);
391 }
392
393 #[test]
394 fn test_param_at_int() {
395 test_parameterized::<@int>(@5, @72, @64, @175);
396 }
397
398 #[test]
399 fn test_param_taggy() {
Corey Richardsonf8ae9b02013-06-26 22:14:35400 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3), Two(17, 42));
Kevin Cantuc43426e2012-09-13 05:09:55401 }
402
403 #[test]
404 fn test_param_taggypar() {
405 test_parameterized::<Taggypar<int>>(Onepar::<int>(1),
Ben Striegela605fd02012-08-11 14:08:42406 Twopar::<int>(1, 2),
407 Threepar::<int>(1, 2, 3),
408 Twopar::<int>(17, 42));
Kevin Cantuc43426e2012-09-13 05:09:55409 }
Brian Anderson6e27b272012-01-18 03:05:07410
Kevin Cantuc43426e2012-09-13 05:09:55411 #[test]
412 fn test_param_reccy() {
Erick Tryzelaare84576b2013-01-22 16:44:24413 let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
414 let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
415 let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
416 let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
Kevin Cantuc43426e2012-09-13 05:09:55417 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
Brian Anderson6e27b272012-01-18 03:05:07418 }
Erick Tryzelaar909d8f02013-03-30 01:02:44419
420 #[test]
421 fn test_eachi() {
422 let mut deq = Deque::new();
423 deq.add_back(1);
424 deq.add_back(2);
425 deq.add_back(3);
426
427 for deq.eachi |i, e| {
428 assert_eq!(*e, i + 1);
429 }
430
431 deq.pop_front();
432
433 for deq.eachi |i, e| {
434 assert_eq!(*e, i + 2);
435 }
436
437 }
Tim Chevalier77de84b2013-05-27 18:47:38438
439 #[test]
440 fn test_reserve() {
441 let mut d = Deque::new();
442 d.add_back(0u64);
443 d.reserve(50);
Huon Wilson32d65592013-06-27 14:40:47444 assert_eq!(d.elts.capacity(), 50);
Tim Chevalier77de84b2013-05-27 18:47:38445 let mut d = Deque::new();
446 d.add_back(0u32);
447 d.reserve(50);
Huon Wilson32d65592013-06-27 14:40:47448 assert_eq!(d.elts.capacity(), 50);
Tim Chevalier77de84b2013-05-27 18:47:38449 }
450
451 #[test]
452 fn test_reserve_at_least() {
453 let mut d = Deque::new();
454 d.add_back(0u64);
455 d.reserve_at_least(50);
Huon Wilson32d65592013-06-27 14:40:47456 assert_eq!(d.elts.capacity(), 64);
Tim Chevalier77de84b2013-05-27 18:47:38457 let mut d = Deque::new();
458 d.add_back(0u32);
459 d.reserve_at_least(50);
Huon Wilson32d65592013-06-27 14:40:47460 assert_eq!(d.elts.capacity(), 64);
Tim Chevalier77de84b2013-05-27 18:47:38461 }
462
Jed Estep096fb792013-06-26 14:04:44463 #[test]
464 fn test_iter() {
465 let mut d = Deque::new();
Corey Richardsonab428b62013-06-27 00:02:34466 for core::int::range(0,5) |i| {
Jed Estep096fb792013-06-26 14:04:44467 d.add_back(i);
468 }
Corey Richardsonf8ae9b02013-06-26 22:14:35469 assert_eq!(d.iter().collect::<~[&int]>(), ~[&0,&1,&2,&3,&4]);
470
Corey Richardsonab428b62013-06-27 00:02:34471 for core::int::range(6,9) |i| {
Jed Estep096fb792013-06-26 14:04:44472 d.add_front(i);
473 }
Corey Richardsonf8ae9b02013-06-26 22:14:35474 assert_eq!(d.iter().collect::<~[&int]>(), ~[&8,&7,&6,&0,&1,&2,&3,&4]);
Jed Estep096fb792013-06-26 14:04:44475 }
476
477 #[test]
478 fn test_rev_iter() {
479 let mut d = Deque::new();
Corey Richardsonab428b62013-06-27 00:02:34480 for core::int::range(0,5) |i| {
Jed Estep096fb792013-06-26 14:04:44481 d.add_back(i);
482 }
Corey Richardsonf8ae9b02013-06-26 22:14:35483 assert_eq!(d.rev_iter().collect::<~[&int]>(), ~[&4,&3,&2,&1,&0]);
484
Corey Richardsonab428b62013-06-27 00:02:34485 for core::int::range(6,9) |i| {
Jed Estep096fb792013-06-26 14:04:44486 d.add_front(i);
487 }
Corey Richardsonf8ae9b02013-06-26 22:14:35488 assert_eq!(d.rev_iter().collect::<~[&int]>(), ~[&4,&3,&2,&1,&0,&6,&7,&8]);
Jed Estep096fb792013-06-26 14:04:44489 }
Michael Sullivanc854d6e2012-07-03 17:52:32490}