|
11 | 11 | //! A double-ended queue implemented as a circular buffer
|
12 | 12 |
|
13 | 13 | use std::uint;
|
14 |
| -use std::util::replace; |
15 | 14 | use std::vec;
|
16 | 15 | use std::cast::transmute;
|
17 | 16 |
|
@@ -103,28 +102,28 @@ impl<T> Deque<T> {
|
103 | 102 |
|
104 | 103 | /// Prepend an element to the deque
|
105 | 104 | pub fn add_front(&mut self, t: T) {
|
106 |
| - let oldlo = self.lo; |
| 105 | + if self.nelts == self.elts.len() { |
| 106 | + grow(self.nelts, self.lo, &mut self.elts); |
| 107 | + self.hi = self.lo + self.nelts; |
| 108 | + } |
107 | 109 | if self.lo == 0u {
|
108 | 110 | self.lo = self.elts.len() - 1u;
|
109 | 111 | } else { self.lo -= 1u; }
|
110 |
| - if self.nelts == self.elts.len() { |
111 |
| - self.elts = grow(self.nelts, oldlo, self.elts); |
112 |
| - self.lo = self.elts.len() - 1u; |
113 |
| - self.hi = self.nelts; |
114 |
| - } |
115 | 112 | self.elts[self.lo] = Some(t);
|
116 | 113 | self.nelts += 1u;
|
117 | 114 | }
|
118 | 115 |
|
119 | 116 | /// Append an element to the deque
|
120 | 117 | pub fn add_back(&mut self, t: T) {
|
121 | 118 | if self.lo == self.hi && self.nelts != 0u {
|
122 |
| - self.elts = grow(self.nelts, self.lo, self.elts); |
123 |
| - self.lo = 0u; |
124 |
| - self.hi = self.nelts; |
| 119 | + grow(self.nelts, self.lo, &mut self.elts); |
| 120 | + self.hi = self.lo + self.nelts; |
125 | 121 | }
|
126 | 122 | self.elts[self.hi] = Some(t);
|
127 |
| - self.hi = (self.hi + 1u) % self.elts.len(); |
| 123 | + self.hi += 1; |
| 124 | + if self.hi == self.elts.len() { |
| 125 | + self.hi = 0; |
| 126 | + } |
128 | 127 | self.nelts += 1u;
|
129 | 128 | }
|
130 | 129 |
|
@@ -235,15 +234,19 @@ iterator!{impl DequeMutRevIterator -> &'self mut T, -1}
|
235 | 234 |
|
236 | 235 | /// Grow is only called on full elts, so nelts is also len(elts), unlike
|
237 | 236 | /// elsewhere.
|
238 |
| -fn grow<T>(nelts: uint, lo: uint, elts: &mut [Option<T>]) -> ~[Option<T>] { |
| 237 | +fn grow<T>(nelts: uint, lo: uint, elts: &mut ~[Option<T>]) { |
239 | 238 | assert_eq!(nelts, elts.len());
|
240 |
| - let mut rv = ~[]; |
| 239 | + let newlen = elts.capacity() * 2; |
| 240 | + elts.reserve(newlen); |
241 | 241 |
|
242 |
| - do rv.grow_fn(nelts + 1) |i| { |
243 |
| - replace(&mut elts[(lo + i) % nelts], None) |
| 242 | + /* fill with None */ |
| 243 | + for uint::range(elts.len(), elts.capacity()) |_| { |
| 244 | + elts.push(None); |
| 245 | + } |
| 246 | + /* move the former wraparound to the new half */ |
| 247 | + for uint::range(0, lo) |i| { |
| 248 | + elts.swap(i, nelts + i); |
244 | 249 | }
|
245 |
| - |
246 |
| - rv |
247 | 250 | }
|
248 | 251 |
|
249 | 252 | fn get<'r, T>(elts: &'r [Option<T>], i: uint) -> &'r T {
|
|
0 commit comments