deque: avoid Copy in pop_{front,back}
diff --git a/src/libstd/deque.rs b/src/libstd/deque.rs
index b548623..7f8732d 100644
--- a/src/libstd/deque.rs
+++ b/src/libstd/deque.rs
@@ -45,6 +45,23 @@
fn peek_front(&self) -> &self/T { get(self.elts, self.lo) }
fn peek_back(&self) -> &self/T { get(self.elts, self.hi - 1u) }
+
+ fn pop_front(&mut self) -> T {
+ let mut result = self.elts[self.lo].swap_unwrap();
+ self.lo = (self.lo + 1u) % self.elts.len();
+ self.nelts -= 1u;
+ result
+ }
+
+ fn pop_back(&mut self) -> T {
+ if self.hi == 0u {
+ self.hi = self.elts.len() - 1u;
+ } else { self.hi -= 1u; }
+ let mut result = self.elts[self.hi].swap_unwrap();
+ self.elts[self.hi] = None;
+ self.nelts -= 1u;
+ result
+ }
}
impl<T: Copy> Deque<T> {
@@ -73,24 +90,6 @@
self.nelts += 1u;
}
- fn pop_front(&mut self) -> T {
- let t = { *get(self.elts, self.lo) };
- self.elts[self.lo] = None;
- self.lo = (self.lo + 1u) % self.elts.len();
- self.nelts -= 1u;
- t
- }
-
- fn pop_back(&mut self) -> T {
- if self.hi == 0u {
- self.hi = self.elts.len() - 1u;
- } else { self.hi -= 1u; }
- let t = { *get(self.elts, self.hi) };
- self.elts[self.hi] = None;
- self.nelts -= 1u;
- t
- }
-
fn get(&self, i: int) -> T {
let idx = (self.lo + (i as uint)) % self.elts.len();
*get(self.elts, idx)