From d3a4102bc177e23d4a7a6dfb44bcad4e4c81eca1 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Mon, 4 Jul 2011 21:20:18 -0700 Subject: [PATCH] stdlib: Add an inefficient implementation of ivec::pop --- src/lib/ivec.rs | 12 +++++++++++- src/test/run-pass/lib-ivec.rs | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/lib/ivec.rs b/src/lib/ivec.rs index 0547c111d65..91912f7dc5a 100644 --- a/src/lib/ivec.rs +++ b/src/lib/ivec.rs @@ -104,7 +104,17 @@ fn slice_mut[T](&T[mutable?] v, uint start, uint end) -> T[mutable] { // Mutators -// TODO +// TODO: Write this, unsafely, in a way that's not O(n). +fn pop[T](&mutable T[mutable?] v) -> T { + auto ln = len(v); + assert (ln > 0u); + ln -= 1u; + auto e = v.(ln); + v = slice(v, 0u, ln); + ret e; +} + +// TODO: More. // Appending diff --git a/src/test/run-pass/lib-ivec.rs b/src/test/run-pass/lib-ivec.rs index 2d0955269fe..f1e5aa5b632 100644 --- a/src/test/run-pass/lib-ivec.rs +++ b/src/test/run-pass/lib-ivec.rs @@ -106,6 +106,26 @@ fn test_slice() { assert (v.(4) == 6); } +fn test_pop() { + // Test on-stack pop. + auto v = ~[ 1, 2, 3 ]; + auto e = ivec::pop(v); + assert (ivec::len(v) == 2u); + assert (v.(0) == 1); + assert (v.(1) == 2); + assert (e == 3); + + // Test on-heap pop. + v = ~[ 1, 2, 3, 4, 5 ]; + e = ivec::pop(v); + assert (ivec::len(v) == 4u); + assert (v.(0) == 1); + assert (v.(1) == 2); + assert (v.(2) == 3); + assert (v.(3) == 4); + assert (e == 5); +} + fn test_grow() { // Test on-stack grow(). auto v = ~[]; @@ -154,6 +174,9 @@ fn main() { test_last(); test_slice(); + // Mutators + test_pop(); + // Appending test_grow(); test_grow_fn();