Skip to content

Commit 1e1dd77

Browse files
author
blake2-ppc
committed
---
yaml --- r: 142446 b: refs/heads/try2 c: 40ce0b7 h: refs/heads/master v: v3
1 parent 4addda7 commit 1e1dd77

File tree

2 files changed

+21
-18
lines changed

2 files changed

+21
-18
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 81933edf92afda59ea41ec3692ab43759285b731
8+
refs/heads/try2: 40ce0b7d76fe39c58e4bdf119af33c4d24950077
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libextra/deque.rs

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
//! A double-ended queue implemented as a circular buffer
1212
1313
use std::uint;
14-
use std::util::replace;
1514
use std::vec;
1615
use std::cast::transmute;
1716

@@ -103,28 +102,28 @@ impl<T> Deque<T> {
103102

104103
/// Prepend an element to the deque
105104
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+
}
107109
if self.lo == 0u {
108110
self.lo = self.elts.len() - 1u;
109111
} 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-
}
115112
self.elts[self.lo] = Some(t);
116113
self.nelts += 1u;
117114
}
118115

119116
/// Append an element to the deque
120117
pub fn add_back(&mut self, t: T) {
121118
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;
125121
}
126122
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+
}
128127
self.nelts += 1u;
129128
}
130129

@@ -235,15 +234,19 @@ iterator!{impl DequeMutRevIterator -> &'self mut T, -1}
235234

236235
/// Grow is only called on full elts, so nelts is also len(elts), unlike
237236
/// 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>]) {
239238
assert_eq!(nelts, elts.len());
240-
let mut rv = ~[];
239+
let newlen = elts.capacity() * 2;
240+
elts.reserve(newlen);
241241

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);
244249
}
245-
246-
rv
247250
}
248251

249252
fn get<'r, T>(elts: &'r [Option<T>], i: uint) -> &'r T {

0 commit comments

Comments
 (0)