Skip to content

Commit b062bbd

Browse files
committed
stdlib: Switch lib::deque over to interior vectors
1 parent f2d847e commit b062bbd

File tree

1 file changed

+28
-24
lines changed

1 file changed

+28
-24
lines changed

src/lib/deque.rs

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,25 @@ fn create[T]() -> t[T] {
2525
* elsewhere.
2626
*/
2727

28-
fn grow[T](uint nelts, uint lo, vec[mutable cell[T]] elts) ->
29-
vec[mutable cell[T]] {
30-
assert (nelts == vec::len(elts));
31-
// FIXME: Making the vector argument an alias is a workaround for
32-
// issue #375
28+
fn grow[T](uint nelts, uint lo, &(cell[T])[mutable] elts)
29+
-> (cell[T])[mutable] {
30+
assert (nelts == ivec::len(elts));
31+
auto rv = ~[mutable];
3332

34-
fn fill[T](uint i, uint nelts, uint lo, &vec[mutable cell[T]] old) ->
35-
cell[T] {
36-
ret if (i < nelts) {
37-
old.((lo + i) % nelts)
38-
} else { option::none };
33+
auto i = 0u;
34+
auto nalloc = uint::next_power_of_two(nelts + 1u);
35+
while (i < nalloc) {
36+
if (i < nelts) {
37+
rv += ~[mutable elts.((lo + i) % nelts)];
38+
} else {
39+
rv += ~[mutable option::none];
40+
}
41+
i += 1u;
3942
}
40-
let uint nalloc = uint::next_power_of_two(nelts + 1u);
41-
let vec::init_op[cell[T]] copy_op = bind fill[T](_, nelts, lo, elts);
42-
ret vec::init_fn_mut[cell[T]](copy_op, nalloc);
43+
44+
ret rv;
4345
}
44-
fn get[T](vec[mutable cell[T]] elts, uint i) -> T {
46+
fn get[T](&(cell[T])[mutable] elts, uint i) -> T {
4547
ret alt (elts.(i)) {
4648
case (option::some(?t)) { t }
4749
case (_) { fail }
@@ -50,16 +52,16 @@ fn create[T]() -> t[T] {
5052
obj deque[T](mutable uint nelts,
5153
mutable uint lo,
5254
mutable uint hi,
53-
mutable vec[mutable cell[T]] elts) {
55+
mutable (cell[T])[mutable] elts) {
5456
fn size() -> uint { ret nelts; }
5557
fn add_front(&T t) {
5658
let uint oldlo = lo;
5759
if (lo == 0u) {
58-
lo = vec::len[cell[T]](elts) - 1u;
60+
lo = ivec::len[cell[T]](elts) - 1u;
5961
} else { lo -= 1u; }
6062
if (lo == hi) {
6163
elts = grow[T](nelts, oldlo, elts);
62-
lo = vec::len[cell[T]](elts) - 1u;
64+
lo = ivec::len[cell[T]](elts) - 1u;
6365
hi = nelts;
6466
}
6567
elts.(lo) = option::some[T](t);
@@ -72,7 +74,7 @@ fn create[T]() -> t[T] {
7274
hi = nelts;
7375
}
7476
elts.(hi) = option::some[T](t);
75-
hi = (hi + 1u) % vec::len[cell[T]](elts);
77+
hi = (hi + 1u) % ivec::len[cell[T]](elts);
7678
nelts += 1u;
7779
}
7880

@@ -83,14 +85,16 @@ fn create[T]() -> t[T] {
8385
fn pop_front() -> T {
8486
let T t = get[T](elts, lo);
8587
elts.(lo) = option::none[T];
86-
lo = (lo + 1u) % vec::len[cell[T]](elts);
88+
lo = (lo + 1u) % ivec::len[cell[T]](elts);
8789
nelts -= 1u;
8890
ret t;
8991
}
9092
fn pop_back() -> T {
9193
if (hi == 0u) {
92-
hi = vec::len[cell[T]](elts) - 1u;
93-
} else { hi -= 1u; }
94+
hi = ivec::len[cell[T]](elts) - 1u;
95+
} else {
96+
hi -= 1u;
97+
}
9498
let T t = get[T](elts, hi);
9599
elts.(hi) = option::none[T];
96100
nelts -= 1u;
@@ -99,12 +103,12 @@ fn create[T]() -> t[T] {
99103
fn peek_front() -> T { ret get[T](elts, lo); }
100104
fn peek_back() -> T { ret get[T](elts, hi - 1u); }
101105
fn get(int i) -> T {
102-
let uint idx = (lo + (i as uint)) % vec::len[cell[T]](elts);
106+
let uint idx = (lo + (i as uint)) % ivec::len[cell[T]](elts);
103107
ret get[T](elts, idx);
104108
}
105109
}
106-
let vec[mutable cell[T]] v =
107-
vec::init_elt_mut(option::none, initial_capacity);
110+
let (cell[T])[mutable] v =
111+
ivec::init_elt_mut(option::none, initial_capacity);
108112
ret deque[T](0u, 0u, 0u, v);
109113
}
110114
// Local Variables:

0 commit comments

Comments
 (0)