deque: avoid Copy in pop_{front,back}

This commit is contained in:
Daniel Micay 2013-02-16 19:43:29 -05:00
parent 373c072e83
commit 6190661018

View File

@ -45,6 +45,23 @@ impl<T> Deque<T> {
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 @@ impl<T: Copy> Deque<T> {
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)