Skip to content

Commit 373c072

Browse files
committed
deque: avoid Copy in peek_{front,back}
1 parent 5929f15 commit 373c072

File tree

1 file changed

+50
-52
lines changed

1 file changed

+50
-52
lines changed

src/libstd/deque.rs

+50-52
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,14 @@ impl<T> Deque<T> {
4242
Deque{nelts: 0, lo: 0, hi: 0,
4343
elts: vec::from_fn(initial_capacity, |_| None)}
4444
}
45+
46+
fn peek_front(&self) -> &self/T { get(self.elts, self.lo) }
47+
fn peek_back(&self) -> &self/T { get(self.elts, self.hi - 1u) }
4548
}
4649

4750
impl<T: Copy> Deque<T> {
4851
fn add_front(&mut self, t: T) {
49-
let oldlo: uint = self.lo;
52+
let oldlo = self.lo;
5053
if self.lo == 0u {
5154
self.lo = self.elts.len() - 1u;
5255
} else { self.lo -= 1u; }
@@ -88,10 +91,6 @@ impl<T: Copy> Deque<T> {
8891
t
8992
}
9093

91-
fn peek_front(&self) -> T { *get(self.elts, self.lo) }
92-
93-
fn peek_back(&self) -> T { *get(self.elts, self.hi - 1u) }
94-
9594
fn get(&self, i: int) -> T {
9695
let idx = (self.lo + (i as uint)) % self.elts.len();
9796
*get(self.elts, idx)
@@ -122,52 +121,51 @@ fn get<T>(elts: &r/[Option<T>], i: uint) -> &r/T {
122121

123122
#[cfg(test)]
124123
mod tests {
125-
use core::prelude::*;
126124
use super::*;
127125

128126
#[test]
129127
fn test_simple() {
130128
let mut d = Deque::new();
131-
assert (d.len() == 0u);
129+
assert d.len() == 0u;
132130
d.add_front(17);
133131
d.add_front(42);
134132
d.add_back(137);
135-
assert (d.len() == 3u);
133+
assert d.len() == 3u;
136134
d.add_back(137);
137-
assert (d.len() == 4u);
135+
assert d.len() == 4u;
138136
log(debug, d.peek_front());
139-
assert (d.peek_front() == 42);
137+
assert *d.peek_front() == 42;
140138
log(debug, d.peek_back());
141-
assert (d.peek_back() == 137);
139+
assert *d.peek_back() == 137;
142140
let mut i: int = d.pop_front();
143141
log(debug, i);
144-
assert (i == 42);
142+
assert i == 42;
145143
i = d.pop_back();
146144
log(debug, i);
147-
assert (i == 137);
145+
assert i == 137;
148146
i = d.pop_back();
149147
log(debug, i);
150-
assert (i == 137);
148+
assert i == 137;
151149
i = d.pop_back();
152150
log(debug, i);
153-
assert (i == 17);
154-
assert (d.len() == 0u);
151+
assert i == 17;
152+
assert d.len() == 0u;
155153
d.add_back(3);
156-
assert (d.len() == 1u);
154+
assert d.len() == 1u;
157155
d.add_front(2);
158-
assert (d.len() == 2u);
156+
assert d.len() == 2u;
159157
d.add_back(4);
160-
assert (d.len() == 3u);
158+
assert d.len() == 3u;
161159
d.add_front(1);
162-
assert (d.len() == 4u);
160+
assert d.len() == 4u;
163161
log(debug, d.get(0));
164162
log(debug, d.get(1));
165163
log(debug, d.get(2));
166164
log(debug, d.get(3));
167-
assert (d.get(0) == 1);
168-
assert (d.get(1) == 2);
169-
assert (d.get(2) == 3);
170-
assert (d.get(3) == 4);
165+
assert d.get(0) == 1;
166+
assert d.get(1) == 2;
167+
assert d.get(2) == 3;
168+
assert d.get(3) == 4;
171169
}
172170

173171
#[test]
@@ -178,58 +176,58 @@ mod tests {
178176
let d: @int = @175;
179177

180178
let mut deq = Deque::new();
181-
assert (deq.len() == 0u);
179+
assert deq.len() == 0;
182180
deq.add_front(a);
183181
deq.add_front(b);
184182
deq.add_back(c);
185-
assert (deq.len() == 3u);
183+
assert deq.len() == 3;
186184
deq.add_back(d);
187-
assert (deq.len() == 4u);
188-
assert (deq.peek_front() == b);
189-
assert (deq.peek_back() == d);
190-
assert (deq.pop_front() == b);
191-
assert (deq.pop_back() == d);
192-
assert (deq.pop_back() == c);
193-
assert (deq.pop_back() == a);
194-
assert (deq.len() == 0u);
185+
assert deq.len() == 4;
186+
assert *deq.peek_front() == b;
187+
assert *deq.peek_back() == d;
188+
assert deq.pop_front() == b;
189+
assert deq.pop_back() == d;
190+
assert deq.pop_back() == c;
191+
assert deq.pop_back() == a;
192+
assert deq.len() == 0;
195193
deq.add_back(c);
196-
assert (deq.len() == 1u);
194+
assert deq.len() == 1;
197195
deq.add_front(b);
198-
assert (deq.len() == 2u);
196+
assert deq.len() == 2;
199197
deq.add_back(d);
200-
assert (deq.len() == 3u);
198+
assert deq.len() == 3;
201199
deq.add_front(a);
202-
assert (deq.len() == 4u);
203-
assert (deq.get(0) == a);
204-
assert (deq.get(1) == b);
205-
assert (deq.get(2) == c);
206-
assert (deq.get(3) == d);
200+
assert deq.len() == 4;
201+
assert deq.get(0) == a;
202+
assert deq.get(1) == b;
203+
assert deq.get(2) == c;
204+
assert deq.get(3) == d;
207205
}
208206

209207
fn test_parameterized<T: Copy Eq Durable>(a: T, b: T, c: T, d: T) {
210208
let mut deq = Deque::new();
211-
assert (deq.len() == 0u);
209+
assert deq.len() == 0;
212210
deq.add_front(a);
213211
deq.add_front(b);
214212
deq.add_back(c);
215-
assert (deq.len() == 3u);
213+
assert deq.len() == 3;
216214
deq.add_back(d);
217-
assert (deq.len() == 4u);
218-
assert deq.peek_front() == b;
219-
assert deq.peek_back() == d;
215+
assert deq.len() == 4;
216+
assert *deq.peek_front() == b;
217+
assert *deq.peek_back() == d;
220218
assert deq.pop_front() == b;
221219
assert deq.pop_back() == d;
222220
assert deq.pop_back() == c;
223221
assert deq.pop_back() == a;
224-
assert (deq.len() == 0u);
222+
assert deq.len() == 0;
225223
deq.add_back(c);
226-
assert (deq.len() == 1u);
224+
assert deq.len() == 1;
227225
deq.add_front(b);
228-
assert (deq.len() == 2u);
226+
assert deq.len() == 2;
229227
deq.add_back(d);
230-
assert (deq.len() == 3u);
228+
assert deq.len() == 3;
231229
deq.add_front(a);
232-
assert (deq.len() == 4u);
230+
assert deq.len() == 4;
233231
assert deq.get(0) == a;
234232
assert deq.get(1) == b;
235233
assert deq.get(2) == c;

0 commit comments

Comments
 (0)