Skip to content

Commit b47e1e9

Browse files
committed
modernize std::deque
* use a proper exported data type with private fields * implement core::container::Container * use the current constructor convention * use explicit self * get rid of DVec and the mutable fields Closes #2343
1 parent 8d8c25b commit b47e1e9

File tree

3 files changed

+116
-141
lines changed

3 files changed

+116
-141
lines changed

src/libstd/deque.rs

Lines changed: 109 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -8,145 +8,122 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
//! A deque. Untested as of yet. Likely buggy
12-
#[forbid(non_camel_case_types)];
13-
11+
use core::container::{Container, Mutable};
1412
use core::cmp::Eq;
15-
use core::dvec::DVec;
16-
use core::dvec;
1713
use core::prelude::*;
1814
use core::uint;
1915
use core::vec;
2016

21-
pub trait Deque<T> {
22-
fn size() -> uint;
23-
fn add_front(v: T);
24-
fn add_back(v: T);
25-
fn pop_front() -> T;
26-
fn pop_back() -> T;
27-
fn peek_front() -> T;
28-
fn peek_back() -> T;
29-
fn get(int) -> T;
17+
const initial_capacity: uint = 32u; // 2^5
18+
19+
pub struct Deque<T> {
20+
priv nelts: uint,
21+
priv lo: uint,
22+
priv hi: uint,
23+
priv elts: ~[Option<T>]
3024
}
3125

32-
// FIXME (#2343) eventually, a proper datatype plus an exported impl would
33-
// be preferrable.
34-
pub fn create<T: Copy>() -> Deque<T> {
35-
type Cell<T> = Option<T>;
26+
impl<T> Container for Deque<T> {
27+
pure fn len(&self) -> uint { self.nelts }
28+
pure fn is_empty(&self) -> bool { self.len() == 0 }
29+
}
3630

37-
let initial_capacity: uint = 32u; // 2^5
38-
/**
39-
* Grow is only called on full elts, so nelts is also len(elts), unlike
40-
* elsewhere.
41-
*/
42-
fn grow<T: Copy>(nelts: uint, lo: uint, elts: ~[Cell<T>])
43-
-> ~[Cell<T>] {
44-
let mut elts = elts;
45-
assert (nelts == vec::len(elts));
46-
let mut rv = ~[];
31+
impl<T: Copy> Deque<T> {
32+
static pure fn new() -> Deque<T> {
33+
Deque{nelts: 0, lo: 0, hi: 0,
34+
elts: vec::from_fn(initial_capacity, |_| None)}
35+
}
4736

48-
let mut i = 0u;
49-
let nalloc = uint::next_power_of_two(nelts + 1u);
50-
while i < nalloc {
51-
if i < nelts {
52-
rv.push(elts[(lo + i) % nelts]);
53-
} else { rv.push(None); }
54-
i += 1u;
37+
fn add_front(&mut self, t: T) {
38+
let oldlo: uint = self.lo;
39+
if self.lo == 0u {
40+
self.lo = self.elts.len() - 1u;
41+
} else { self.lo -= 1u; }
42+
if self.lo == self.hi {
43+
self.elts = grow(self.nelts, oldlo, self.elts);
44+
self.lo = self.elts.len() - 1u;
45+
self.hi = self.nelts;
5546
}
47+
self.elts[self.lo] = Some(t);
48+
self.nelts += 1u;
49+
}
5650

57-
rv
51+
fn add_back(&mut self, t: T) {
52+
if self.lo == self.hi && self.nelts != 0u {
53+
self.elts = grow(self.nelts, self.lo, self.elts);
54+
self.lo = 0u;
55+
self.hi = self.nelts;
56+
}
57+
self.elts[self.hi] = Some(t);
58+
self.hi = (self.hi + 1u) % self.elts.len();
59+
self.nelts += 1u;
5860
}
59-
fn get<T: Copy>(elts: &DVec<Cell<T>>, i: uint) -> T {
60-
match (*elts).get_elt(i) { Some(t) => t, _ => fail!() }
61+
62+
fn pop_front(&mut self) -> T {
63+
let t: T = get(self.elts, self.lo);
64+
self.elts[self.lo] = None;
65+
self.lo = (self.lo + 1u) % self.elts.len();
66+
self.nelts -= 1u;
67+
return t;
6168
}
6269

63-
struct Repr<T> {
64-
mut nelts: uint,
65-
mut lo: uint,
66-
mut hi: uint,
67-
elts: DVec<Cell<T>>,
70+
fn pop_back(&mut self) -> T {
71+
if self.hi == 0u {
72+
self.hi = self.elts.len() - 1u;
73+
} else { self.hi -= 1u; }
74+
let t: T = get(self.elts, self.hi);
75+
self.elts[self.hi] = None;
76+
self.nelts -= 1u;
77+
return t;
6878
}
6979

70-
impl<T: Copy> Deque<T> for Repr<T> {
71-
fn size() -> uint { return self.nelts; }
72-
fn add_front(t: T) {
73-
let oldlo: uint = self.lo;
74-
if self.lo == 0u {
75-
self.lo = self.elts.len() - 1u;
76-
} else { self.lo -= 1u; }
77-
if self.lo == self.hi {
78-
self.elts.swap(|v| grow(self.nelts, oldlo, v));
79-
self.lo = self.elts.len() - 1u;
80-
self.hi = self.nelts;
81-
}
82-
self.elts.set_elt(self.lo, Some(t));
83-
self.nelts += 1u;
84-
}
85-
fn add_back(t: T) {
86-
if self.lo == self.hi && self.nelts != 0u {
87-
self.elts.swap(|v| grow(self.nelts, self.lo, v));
88-
self.lo = 0u;
89-
self.hi = self.nelts;
90-
}
91-
self.elts.set_elt(self.hi, Some(t));
92-
self.hi = (self.hi + 1u) % self.elts.len();
93-
self.nelts += 1u;
94-
}
95-
/**
96-
* We actually release (turn to none()) the T we're popping so
97-
* that we don't keep anyone's refcount up unexpectedly.
98-
*/
99-
fn pop_front() -> T {
100-
let t: T = get(&self.elts, self.lo);
101-
self.elts.set_elt(self.lo, None);
102-
self.lo = (self.lo + 1u) % self.elts.len();
103-
self.nelts -= 1u;
104-
return t;
105-
}
106-
fn pop_back() -> T {
107-
if self.hi == 0u {
108-
self.hi = self.elts.len() - 1u;
109-
} else { self.hi -= 1u; }
110-
let t: T = get(&self.elts, self.hi);
111-
self.elts.set_elt(self.hi, None);
112-
self.nelts -= 1u;
113-
return t;
114-
}
115-
fn peek_front() -> T { return get(&self.elts, self.lo); }
116-
fn peek_back() -> T { return get(&self.elts, self.hi - 1u); }
117-
fn get(i: int) -> T {
118-
let idx = (self.lo + (i as uint)) % self.elts.len();
119-
return get(&self.elts, idx);
120-
}
80+
fn peek_front(&self) -> T { return get(self.elts, self.lo); }
81+
82+
fn peek_back(&self) -> T { return get(self.elts, self.hi - 1u); }
83+
84+
fn get(&self, i: int) -> T {
85+
let idx = (self.lo + (i as uint)) % self.elts.len();
86+
return get(self.elts, idx);
87+
}
88+
}
89+
90+
/// Grow is only called on full elts, so nelts is also len(elts), unlike
91+
/// elsewhere.
92+
fn grow<T: Copy>(nelts: uint, lo: uint, elts: &[Option<T>]) -> ~[Option<T>] {
93+
assert nelts == elts.len();
94+
let mut rv = ~[];
95+
96+
let mut i = 0u;
97+
let nalloc = uint::next_power_of_two(nelts + 1u);
98+
while i < nalloc {
99+
if i < nelts {
100+
rv.push(elts[(lo + i) % nelts]);
101+
} else { rv.push(None); }
102+
i += 1u;
121103
}
122104

123-
let repr: Repr<T> = Repr {
124-
nelts: 0u,
125-
lo: 0u,
126-
hi: 0u,
127-
elts: dvec::from_vec(vec::from_elem(initial_capacity, None)),
128-
};
105+
rv
106+
}
129107

130-
repr as Deque::<T>
108+
fn get<T: Copy>(elts: &[Option<T>], i: uint) -> T {
109+
match elts[i] { Some(t) => t, _ => fail!() }
131110
}
132111

133112
#[cfg(test)]
134113
mod tests {
135114
use core::prelude::*;
136-
137-
use deque::*;
138-
use deque;
115+
use super::*;
139116

140117
#[test]
141118
fn test_simple() {
142-
let d: deque::Deque<int> = deque::create::<int>();
143-
assert (d.size() == 0u);
119+
let mut d = Deque::new();
120+
assert (d.len() == 0u);
144121
d.add_front(17);
145122
d.add_front(42);
146123
d.add_back(137);
147-
assert (d.size() == 3u);
124+
assert (d.len() == 3u);
148125
d.add_back(137);
149-
assert (d.size() == 4u);
126+
assert (d.len() == 4u);
150127
log(debug, d.peek_front());
151128
assert (d.peek_front() == 42);
152129
log(debug, d.peek_back());
@@ -163,15 +140,15 @@ mod tests {
163140
i = d.pop_back();
164141
log(debug, i);
165142
assert (i == 17);
166-
assert (d.size() == 0u);
143+
assert (d.len() == 0u);
167144
d.add_back(3);
168-
assert (d.size() == 1u);
145+
assert (d.len() == 1u);
169146
d.add_front(2);
170-
assert (d.size() == 2u);
147+
assert (d.len() == 2u);
171148
d.add_back(4);
172-
assert (d.size() == 3u);
149+
assert (d.len() == 3u);
173150
d.add_front(1);
174-
assert (d.size() == 4u);
151+
assert (d.len() == 4u);
175152
log(debug, d.get(0));
176153
log(debug, d.get(1));
177154
log(debug, d.get(2));
@@ -189,59 +166,59 @@ mod tests {
189166
let c: @int = @64;
190167
let d: @int = @175;
191168

192-
let deq: deque::Deque<@int> = deque::create::<@int>();
193-
assert (deq.size() == 0u);
169+
let mut deq = Deque::new();
170+
assert (deq.len() == 0u);
194171
deq.add_front(a);
195172
deq.add_front(b);
196173
deq.add_back(c);
197-
assert (deq.size() == 3u);
174+
assert (deq.len() == 3u);
198175
deq.add_back(d);
199-
assert (deq.size() == 4u);
176+
assert (deq.len() == 4u);
200177
assert (deq.peek_front() == b);
201178
assert (deq.peek_back() == d);
202179
assert (deq.pop_front() == b);
203180
assert (deq.pop_back() == d);
204181
assert (deq.pop_back() == c);
205182
assert (deq.pop_back() == a);
206-
assert (deq.size() == 0u);
183+
assert (deq.len() == 0u);
207184
deq.add_back(c);
208-
assert (deq.size() == 1u);
185+
assert (deq.len() == 1u);
209186
deq.add_front(b);
210-
assert (deq.size() == 2u);
187+
assert (deq.len() == 2u);
211188
deq.add_back(d);
212-
assert (deq.size() == 3u);
189+
assert (deq.len() == 3u);
213190
deq.add_front(a);
214-
assert (deq.size() == 4u);
191+
assert (deq.len() == 4u);
215192
assert (deq.get(0) == a);
216193
assert (deq.get(1) == b);
217194
assert (deq.get(2) == c);
218195
assert (deq.get(3) == d);
219196
}
220197

221198
fn test_parameterized<T: Copy Eq Durable>(a: T, b: T, c: T, d: T) {
222-
let deq: deque::Deque<T> = deque::create::<T>();
223-
assert (deq.size() == 0u);
199+
let mut deq = Deque::new();
200+
assert (deq.len() == 0u);
224201
deq.add_front(a);
225202
deq.add_front(b);
226203
deq.add_back(c);
227-
assert (deq.size() == 3u);
204+
assert (deq.len() == 3u);
228205
deq.add_back(d);
229-
assert (deq.size() == 4u);
206+
assert (deq.len() == 4u);
230207
assert deq.peek_front() == b;
231208
assert deq.peek_back() == d;
232209
assert deq.pop_front() == b;
233210
assert deq.pop_back() == d;
234211
assert deq.pop_back() == c;
235212
assert deq.pop_back() == a;
236-
assert (deq.size() == 0u);
213+
assert (deq.len() == 0u);
237214
deq.add_back(c);
238-
assert (deq.size() == 1u);
215+
assert (deq.len() == 1u);
239216
deq.add_front(b);
240-
assert (deq.size() == 2u);
217+
assert (deq.len() == 2u);
241218
deq.add_back(d);
242-
assert (deq.size() == 3u);
219+
assert (deq.len() == 3u);
243220
deq.add_front(a);
244-
assert (deq.size() == 4u);
221+
assert (deq.len() == 4u);
245222
assert deq.get(0) == a;
246223
assert deq.get(1) == b;
247224
assert deq.get(2) == c;

src/test/bench/graph500-bfs.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use std::time;
2323
use std::oldmap;
2424
use std::oldmap::Map;
2525
use std::oldmap::HashMap;
26-
use std::deque;
2726
use std::deque::Deque;
2827
use std::par;
2928
use core::io::WriterUtil;
@@ -124,18 +123,18 @@ fn bfs(graph: graph, key: node_id) -> bfs_result {
124123
let mut marks : ~[node_id]
125124
= vec::from_elem(vec::len(graph), -1i64);
126125

127-
let Q = deque::create();
126+
let mut q = Deque::new();
128127

129-
Q.add_back(key);
128+
q.add_back(key);
130129
marks[key] = key;
131130

132-
while Q.size() > 0 {
133-
let t = Q.pop_front();
131+
while !q.is_empty() {
132+
let t = q.pop_front();
134133

135134
do graph[t].each() |k| {
136135
if marks[*k] == -1i64 {
137136
marks[*k] = t;
138-
Q.add_back(*k);
137+
q.add_back(*k);
139138
}
140139
true
141140
};

src/test/run-pass/issue-2383.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@
1111
// except according to those terms.
1212

1313
extern mod std;
14-
use std::deque;
1514
use std::deque::Deque;
1615

1716
pub fn main() {
18-
let Q = deque::create();
19-
Q.add_back(10);
17+
let mut q = Deque::new();
18+
q.add_back(10);
2019
}

0 commit comments

Comments
 (0)