blob: 15131093acb062971a47d39b4cd665463a33942b [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 Micayb47e1e92013-02-16 22:55:5511use core::container::{Container, Mutable};
Patrick Walton2db3abd2013-01-09 03:37:2512use core::prelude::*;
Patrick Walton57c59992012-12-23 22:41:3713use core::vec;
Marijn Haverbeke26610db2012-01-11 11:49:3314
Daniel Micayb47e1e92013-02-16 22:55:5515const initial_capacity: uint = 32u; // 2^5
16
17pub struct Deque<T> {
18 priv nelts: uint,
19 priv lo: uint,
20 priv hi: uint,
21 priv elts: ~[Option<T>]
Marijn Haverbeke26610db2012-01-11 11:49:3322}
Roy Frostig9c818892010-07-21 01:03:0923
Daniel Micayb47e1e92013-02-16 22:55:5524impl<T> Container for Deque<T> {
Daniel Micayb3ee49c2013-03-15 17:41:0225 /// Return the number of elements in the deque
Daniel Micayb47e1e92013-02-16 22:55:5526 pure fn len(&self) -> uint { self.nelts }
Daniel Micayb3ee49c2013-03-15 17:41:0227
28 /// Return true if the deque contains no elements
Daniel Micayb47e1e92013-02-16 22:55:5529 pure fn is_empty(&self) -> bool { self.len() == 0 }
30}
Roy Frostig9c818892010-07-21 01:03:0931
Daniel Micayed7c9c42013-02-16 23:55:2532impl<T> Mutable for Deque<T> {
Daniel Micayb3ee49c2013-03-15 17:41:0233 /// Clear the deque, removing all values.
Daniel Micayed7c9c42013-02-16 23:55:2534 fn clear(&mut self) {
Daniel Micayb3ee49c2013-03-15 17:41:0235 for self.elts.each_mut |x| { *x = None }
Daniel Micayed7c9c42013-02-16 23:55:2536 self.nelts = 0;
37 self.lo = 0;
38 self.hi = 0;
39 }
40}
41
Patrick Walton107bf962013-02-27 01:47:4142pub impl<T> Deque<T> {
Daniel Micayb3ee49c2013-03-15 17:41:0243 /// Create an empty Deque
Daniel Micayb47e1e92013-02-16 22:55:5544 static pure fn new() -> Deque<T> {
45 Deque{nelts: 0, lo: 0, hi: 0,
46 elts: vec::from_fn(initial_capacity, |_| None)}
Roy Frostig9c818892010-07-21 01:03:0947 }
Daniel Micay373c0722013-02-17 00:10:1048
Daniel Micayb3ee49c2013-03-15 17:41:0249 /// Return a reference to the first element in the deque
50 ///
51 /// Fails if the deque is empty
Daniel Micay373c0722013-02-17 00:10:1052 fn peek_front(&self) -> &self/T { get(self.elts, self.lo) }
Daniel Micayb3ee49c2013-03-15 17:41:0253
54 /// Return a reference to the last element in the deque
55 ///
56 /// Fails if the deque is empty
Daniel Micay373c0722013-02-17 00:10:1057 fn peek_back(&self) -> &self/T { get(self.elts, self.hi - 1u) }
Daniel Micay61906612013-02-17 00:43:2958
Daniel Micayb3ee49c2013-03-15 17:41:0259 /// Retrieve an element in the deque by index
60 ///
61 /// Fails if there is no element with the given index
Daniel Micaya2573292013-02-17 01:50:1462 fn get(&self, i: int) -> &self/T {
63 let idx = (self.lo + (i as uint)) % self.elts.len();
64 get(self.elts, idx)
65 }
66
Daniel Micayb3ee49c2013-03-15 17:41:0267 /// Remove and return the first element in the deque
68 ///
69 /// Fails if the deque is empty
Daniel Micay61906612013-02-17 00:43:2970 fn pop_front(&mut self) -> T {
71 let mut result = self.elts[self.lo].swap_unwrap();
72 self.lo = (self.lo + 1u) % self.elts.len();
73 self.nelts -= 1u;
74 result
75 }
76
Daniel Micayb3ee49c2013-03-15 17:41:0277 /// Remove and return the last element in the deque
78 ///
79 /// Fails if the deque is empty
Daniel Micay61906612013-02-17 00:43:2980 fn pop_back(&mut self) -> T {
81 if self.hi == 0u {
82 self.hi = self.elts.len() - 1u;
83 } else { self.hi -= 1u; }
84 let mut result = self.elts[self.hi].swap_unwrap();
85 self.elts[self.hi] = None;
86 self.nelts -= 1u;
87 result
88 }
Marijn Haverbeke26610db2012-01-11 11:49:3389
Daniel Micayb3ee49c2013-03-15 17:41:0290 /// Prepend an element to the deque
Daniel Micayb47e1e92013-02-16 22:55:5591 fn add_front(&mut self, t: T) {
Daniel Micay373c0722013-02-17 00:10:1092 let oldlo = self.lo;
Daniel Micayb47e1e92013-02-16 22:55:5593 if self.lo == 0u {
94 self.lo = self.elts.len() - 1u;
95 } else { self.lo -= 1u; }
96 if self.lo == self.hi {
97 self.elts = grow(self.nelts, oldlo, self.elts);
98 self.lo = self.elts.len() - 1u;
99 self.hi = self.nelts;
100 }
101 self.elts[self.lo] = Some(t);
102 self.nelts += 1u;
Erick Tryzelaare84576b2013-01-22 16:44:24103 }
Marijn Haverbeke26610db2012-01-11 11:49:33104
Daniel Micayb3ee49c2013-03-15 17:41:02105 /// Append an element to the deque
Daniel Micayb47e1e92013-02-16 22:55:55106 fn add_back(&mut self, t: T) {
107 if self.lo == self.hi && self.nelts != 0u {
108 self.elts = grow(self.nelts, self.lo, self.elts);
109 self.lo = 0u;
110 self.hi = self.nelts;
Graydon Hoare2880ecd2010-09-22 22:44:13111 }
Daniel Micayb47e1e92013-02-16 22:55:55112 self.elts[self.hi] = Some(t);
113 self.hi = (self.hi + 1u) % self.elts.len();
114 self.nelts += 1u;
Graydon Hoarece729932011-06-15 18:19:50115 }
Daniel Micayb47e1e92013-02-16 22:55:55116}
117
118/// Grow is only called on full elts, so nelts is also len(elts), unlike
119/// elsewhere.
Daniel Micay5aa04632013-02-17 02:34:09120fn grow<T>(nelts: uint, lo: uint, elts: &mut [Option<T>]) -> ~[Option<T>] {
Patrick Waltond7e74b52013-03-06 21:58:02121 fail_unless!(nelts == elts.len());
Daniel Micayb47e1e92013-02-16 22:55:55122 let mut rv = ~[];
123
Daniel Micay6956e812013-02-17 19:08:04124 do rv.grow_fn(nelts + 1) |i| {
Daniel Micay5aa04632013-02-17 02:34:09125 let mut element = None;
126 element <-> elts[(lo + i) % nelts];
127 element
Daniel Micayb47e1e92013-02-16 22:55:55128 }
129
130 rv
131}
132
Daniel Micay5929f152013-02-17 00:03:27133fn get<T>(elts: &r/[Option<T>], i: uint) -> &r/T {
134 match elts[i] { Some(ref t) => t, _ => fail!() }
Roy Frostig9c818892010-07-21 01:03:09135}
Brian Anderson6e27b272012-01-18 03:05:07136
137#[cfg(test)]
138mod tests {
Daniel Micayb47e1e92013-02-16 22:55:55139 use super::*;
Alex Crichton2df07dd2013-02-25 19:11:21140 use core::cmp::Eq;
141 use core::kinds::{Durable, Copy};
Patrick Waltonfa5ee932012-12-28 02:24:18142
Brian Anderson6e27b272012-01-18 03:05:07143 #[test]
144 fn test_simple() {
Daniel Micayb47e1e92013-02-16 22:55:55145 let mut d = Deque::new();
Patrick Waltond7e74b52013-03-06 21:58:02146 fail_unless!(d.len() == 0u);
Brian Anderson6e27b272012-01-18 03:05:07147 d.add_front(17);
148 d.add_front(42);
149 d.add_back(137);
Patrick Waltond7e74b52013-03-06 21:58:02150 fail_unless!(d.len() == 3u);
Brian Anderson6e27b272012-01-18 03:05:07151 d.add_back(137);
Patrick Waltond7e74b52013-03-06 21:58:02152 fail_unless!(d.len() == 4u);
Brian Anderson82f19032013-03-08 20:39:42153 debug!(d.peek_front());
Patrick Waltond7e74b52013-03-06 21:58:02154 fail_unless!(*d.peek_front() == 42);
Brian Anderson82f19032013-03-08 20:39:42155 debug!(d.peek_back());
Patrick Waltond7e74b52013-03-06 21:58:02156 fail_unless!(*d.peek_back() == 137);
Niko Matsakisdc072802012-03-22 15:39:41157 let mut i: int = d.pop_front();
Brian Anderson82f19032013-03-08 20:39:42158 debug!(i);
Patrick Waltond7e74b52013-03-06 21:58:02159 fail_unless!(i == 42);
Brian Anderson6e27b272012-01-18 03:05:07160 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42161 debug!(i);
Patrick Waltond7e74b52013-03-06 21:58:02162 fail_unless!(i == 137);
Brian Anderson6e27b272012-01-18 03:05:07163 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42164 debug!(i);
Patrick Waltond7e74b52013-03-06 21:58:02165 fail_unless!(i == 137);
Brian Anderson6e27b272012-01-18 03:05:07166 i = d.pop_back();
Brian Anderson82f19032013-03-08 20:39:42167 debug!(i);
Patrick Waltond7e74b52013-03-06 21:58:02168 fail_unless!(i == 17);
169 fail_unless!(d.len() == 0u);
Brian Anderson6e27b272012-01-18 03:05:07170 d.add_back(3);
Patrick Waltond7e74b52013-03-06 21:58:02171 fail_unless!(d.len() == 1u);
Brian Anderson6e27b272012-01-18 03:05:07172 d.add_front(2);
Patrick Waltond7e74b52013-03-06 21:58:02173 fail_unless!(d.len() == 2u);
Brian Anderson6e27b272012-01-18 03:05:07174 d.add_back(4);
Patrick Waltond7e74b52013-03-06 21:58:02175 fail_unless!(d.len() == 3u);
Brian Anderson6e27b272012-01-18 03:05:07176 d.add_front(1);
Patrick Waltond7e74b52013-03-06 21:58:02177 fail_unless!(d.len() == 4u);
Brian Anderson82f19032013-03-08 20:39:42178 debug!(d.get(0));
179 debug!(d.get(1));
180 debug!(d.get(2));
181 debug!(d.get(3));
Patrick Waltond7e74b52013-03-06 21:58:02182 fail_unless!(*d.get(0) == 1);
183 fail_unless!(*d.get(1) == 2);
184 fail_unless!(*d.get(2) == 3);
185 fail_unless!(*d.get(3) == 4);
Brian Anderson6e27b272012-01-18 03:05:07186 }
187
Kevin Cantuc43426e2012-09-13 05:09:55188 #[test]
189 fn test_boxes() {
190 let a: @int = @5;
191 let b: @int = @72;
192 let c: @int = @64;
193 let d: @int = @175;
194
Daniel Micayb47e1e92013-02-16 22:55:55195 let mut deq = Deque::new();
Patrick Waltond7e74b52013-03-06 21:58:02196 fail_unless!(deq.len() == 0);
Brian Anderson6e27b272012-01-18 03:05:07197 deq.add_front(a);
198 deq.add_front(b);
199 deq.add_back(c);
Patrick Waltond7e74b52013-03-06 21:58:02200 fail_unless!(deq.len() == 3);
Brian Anderson6e27b272012-01-18 03:05:07201 deq.add_back(d);
Patrick Waltond7e74b52013-03-06 21:58:02202 fail_unless!(deq.len() == 4);
203 fail_unless!(*deq.peek_front() == b);
204 fail_unless!(*deq.peek_back() == d);
205 fail_unless!(deq.pop_front() == b);
206 fail_unless!(deq.pop_back() == d);
207 fail_unless!(deq.pop_back() == c);
208 fail_unless!(deq.pop_back() == a);
209 fail_unless!(deq.len() == 0);
Brian Anderson6e27b272012-01-18 03:05:07210 deq.add_back(c);
Patrick Waltond7e74b52013-03-06 21:58:02211 fail_unless!(deq.len() == 1);
Brian Anderson6e27b272012-01-18 03:05:07212 deq.add_front(b);
Patrick Waltond7e74b52013-03-06 21:58:02213 fail_unless!(deq.len() == 2);
Brian Anderson6e27b272012-01-18 03:05:07214 deq.add_back(d);
Patrick Waltond7e74b52013-03-06 21:58:02215 fail_unless!(deq.len() == 3);
Brian Anderson6e27b272012-01-18 03:05:07216 deq.add_front(a);
Patrick Waltond7e74b52013-03-06 21:58:02217 fail_unless!(deq.len() == 4);
218 fail_unless!(*deq.get(0) == a);
219 fail_unless!(*deq.get(1) == b);
220 fail_unless!(*deq.get(2) == c);
221 fail_unless!(*deq.get(3) == d);
Daniel Micay373c0722013-02-17 00:10:10222 }
223
Patrick Waltonbf2a2252013-02-21 01:07:17224 fn test_parameterized<T:Copy + Eq + Durable>(a: T, b: T, c: T, d: T) {
Daniel Micay373c0722013-02-17 00:10:10225 let mut deq = Deque::new();
Patrick Waltond7e74b52013-03-06 21:58:02226 fail_unless!(deq.len() == 0);
Daniel Micay373c0722013-02-17 00:10:10227 deq.add_front(a);
228 deq.add_front(b);
229 deq.add_back(c);
Patrick Waltond7e74b52013-03-06 21:58:02230 fail_unless!(deq.len() == 3);
Daniel Micay373c0722013-02-17 00:10:10231 deq.add_back(d);
Patrick Waltond7e74b52013-03-06 21:58:02232 fail_unless!(deq.len() == 4);
233 fail_unless!(*deq.peek_front() == b);
234 fail_unless!(*deq.peek_back() == d);
235 fail_unless!(deq.pop_front() == b);
236 fail_unless!(deq.pop_back() == d);
237 fail_unless!(deq.pop_back() == c);
238 fail_unless!(deq.pop_back() == a);
239 fail_unless!(deq.len() == 0);
Daniel Micay373c0722013-02-17 00:10:10240 deq.add_back(c);
Patrick Waltond7e74b52013-03-06 21:58:02241 fail_unless!(deq.len() == 1);
Daniel Micay373c0722013-02-17 00:10:10242 deq.add_front(b);
Patrick Waltond7e74b52013-03-06 21:58:02243 fail_unless!(deq.len() == 2);
Daniel Micay373c0722013-02-17 00:10:10244 deq.add_back(d);
Patrick Waltond7e74b52013-03-06 21:58:02245 fail_unless!(deq.len() == 3);
Daniel Micay373c0722013-02-17 00:10:10246 deq.add_front(a);
Patrick Waltond7e74b52013-03-06 21:58:02247 fail_unless!(deq.len() == 4);
248 fail_unless!(*deq.get(0) == a);
249 fail_unless!(*deq.get(1) == b);
250 fail_unless!(*deq.get(2) == c);
251 fail_unless!(*deq.get(3) == d);
Brian Anderson6e27b272012-01-18 03:05:07252 }
253
Patrick Waltoneb4d39e2013-01-26 00:57:39254 #[deriving_eq]
Ben Striegela605fd02012-08-11 14:08:42255 enum Taggy { One(int), Two(int, int), Three(int, int, int), }
Brian Anderson6e27b272012-01-18 03:05:07256
Patrick Waltoneb4d39e2013-01-26 00:57:39257 #[deriving_eq]
Ben Striegela605fd02012-08-11 14:08:42258 enum Taggypar<T> {
259 Onepar(int), Twopar(int, int), Threepar(int, int, int),
Brian Anderson6e27b272012-01-18 03:05:07260 }
261
Patrick Waltoneb4d39e2013-01-26 00:57:39262 #[deriving_eq]
Erick Tryzelaare84576b2013-01-22 16:44:24263 struct RecCy {
264 x: int,
265 y: int,
Patrick Waltoneb4d39e2013-01-26 00:57:39266 t: Taggy
Patrick Walton9117dcb2012-09-20 01:00:26267 }
Kevin Cantuc43426e2012-09-13 05:09:55268
269 #[test]
270 fn test_param_int() {
271 test_parameterized::<int>(5, 72, 64, 175);
272 }
273
274 #[test]
275 fn test_param_at_int() {
276 test_parameterized::<@int>(@5, @72, @64, @175);
277 }
278
279 #[test]
280 fn test_param_taggy() {
281 test_parameterized::<Taggy>(One(1), Two(1, 2), Three(1, 2, 3),
282 Two(17, 42));
283 }
284
285 #[test]
286 fn test_param_taggypar() {
287 test_parameterized::<Taggypar<int>>(Onepar::<int>(1),
Ben Striegela605fd02012-08-11 14:08:42288 Twopar::<int>(1, 2),
289 Threepar::<int>(1, 2, 3),
290 Twopar::<int>(17, 42));
Kevin Cantuc43426e2012-09-13 05:09:55291 }
Brian Anderson6e27b272012-01-18 03:05:07292
Kevin Cantuc43426e2012-09-13 05:09:55293 #[test]
294 fn test_param_reccy() {
Erick Tryzelaare84576b2013-01-22 16:44:24295 let reccy1 = RecCy { x: 1, y: 2, t: One(1) };
296 let reccy2 = RecCy { x: 345, y: 2, t: Two(1, 2) };
297 let reccy3 = RecCy { x: 1, y: 777, t: Three(1, 2, 3) };
298 let reccy4 = RecCy { x: 19, y: 252, t: Two(17, 42) };
Kevin Cantuc43426e2012-09-13 05:09:55299 test_parameterized::<RecCy>(reccy1, reccy2, reccy3, reccy4);
Brian Anderson6e27b272012-01-18 03:05:07300 }
Michael Sullivanc854d6e2012-07-03 17:52:32301}