Skip to content

Commit d3a4102

Browse files
committed
stdlib: Add an inefficient implementation of ivec::pop
1 parent 5d2c189 commit d3a4102

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

src/lib/ivec.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,17 @@ fn slice_mut[T](&T[mutable?] v, uint start, uint end) -> T[mutable] {
104104

105105
// Mutators
106106

107-
// TODO
107+
// TODO: Write this, unsafely, in a way that's not O(n).
108+
fn pop[T](&mutable T[mutable?] v) -> T {
109+
auto ln = len(v);
110+
assert (ln > 0u);
111+
ln -= 1u;
112+
auto e = v.(ln);
113+
v = slice(v, 0u, ln);
114+
ret e;
115+
}
116+
117+
// TODO: More.
108118

109119

110120
// Appending

src/test/run-pass/lib-ivec.rs

+23
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,26 @@ fn test_slice() {
106106
assert (v.(4) == 6);
107107
}
108108

109+
fn test_pop() {
110+
// Test on-stack pop.
111+
auto v = ~[ 1, 2, 3 ];
112+
auto e = ivec::pop(v);
113+
assert (ivec::len(v) == 2u);
114+
assert (v.(0) == 1);
115+
assert (v.(1) == 2);
116+
assert (e == 3);
117+
118+
// Test on-heap pop.
119+
v = ~[ 1, 2, 3, 4, 5 ];
120+
e = ivec::pop(v);
121+
assert (ivec::len(v) == 4u);
122+
assert (v.(0) == 1);
123+
assert (v.(1) == 2);
124+
assert (v.(2) == 3);
125+
assert (v.(3) == 4);
126+
assert (e == 5);
127+
}
128+
109129
fn test_grow() {
110130
// Test on-stack grow().
111131
auto v = ~[];
@@ -154,6 +174,9 @@ fn main() {
154174
test_last();
155175
test_slice();
156176

177+
// Mutators
178+
test_pop();
179+
157180
// Appending
158181
test_grow();
159182
test_grow_fn();

0 commit comments

Comments
 (0)