Skip to content

Commit 6190661

Browse files
committed
deque: avoid Copy in pop_{front,back}
1 parent 373c072 commit 6190661

File tree

1 file changed

+17
-18
lines changed

1 file changed

+17
-18
lines changed

src/libstd/deque.rs

+17-18
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@ impl<T> Deque<T> {
4545

4646
fn peek_front(&self) -> &self/T { get(self.elts, self.lo) }
4747
fn peek_back(&self) -> &self/T { get(self.elts, self.hi - 1u) }
48+
49+
fn pop_front(&mut self) -> T {
50+
let mut result = self.elts[self.lo].swap_unwrap();
51+
self.lo = (self.lo + 1u) % self.elts.len();
52+
self.nelts -= 1u;
53+
result
54+
}
55+
56+
fn pop_back(&mut self) -> T {
57+
if self.hi == 0u {
58+
self.hi = self.elts.len() - 1u;
59+
} else { self.hi -= 1u; }
60+
let mut result = self.elts[self.hi].swap_unwrap();
61+
self.elts[self.hi] = None;
62+
self.nelts -= 1u;
63+
result
64+
}
4865
}
4966

5067
impl<T: Copy> Deque<T> {
@@ -73,24 +90,6 @@ impl<T: Copy> Deque<T> {
7390
self.nelts += 1u;
7491
}
7592

76-
fn pop_front(&mut self) -> T {
77-
let t = { *get(self.elts, self.lo) };
78-
self.elts[self.lo] = None;
79-
self.lo = (self.lo + 1u) % self.elts.len();
80-
self.nelts -= 1u;
81-
t
82-
}
83-
84-
fn pop_back(&mut self) -> T {
85-
if self.hi == 0u {
86-
self.hi = self.elts.len() - 1u;
87-
} else { self.hi -= 1u; }
88-
let t = { *get(self.elts, self.hi) };
89-
self.elts[self.hi] = None;
90-
self.nelts -= 1u;
91-
t
92-
}
93-
9493
fn get(&self, i: int) -> T {
9594
let idx = (self.lo + (i as uint)) % self.elts.len();
9695
*get(self.elts, idx)

0 commit comments

Comments
 (0)