Add reverse and reversed to std::ivec

Modify tests to use the ivec version
This commit is contained in:
Brian Anderson 2011-08-11 21:07:09 -07:00
parent 97dc75da16
commit 4dec0f6d96
2 changed files with 33 additions and 7 deletions

View file

@ -303,6 +303,32 @@ fn zip[@T, @U](v: &[T], u: &[U]) -> [{_0: T, _1: U}] {
}
}
// Swaps two elements in a vector
fn swap[@T](v: &[mutable T], a: uint, b: uint) {
let t: T = v.(a);
v.(a) = v.(b);
v.(b) = t;
}
// In place vector reversal
fn reverse[@T](v: &[mutable T]) {
let i: uint = 0u;
let ln = len[T](v);
while i < ln / 2u { swap(v, i, ln - i - 1u); i += 1u; }
}
// Functional vector reversal. Returns a reversed copy of v.
fn reversed[@T](v: &[T]) -> [T] {
let rs: [T] = ~[];
let i = len[T](v);
if i == 0u { ret rs; } else { i -= 1u; }
while i != 0u { rs += ~[v.(i)]; i -= 1u; }
rs += ~[v.(0)];
ret rs;
}
mod unsafe {
type ivec_repr =
{mutable fill: uint,

View file

@ -1,22 +1,22 @@
use std;
import std::vec;
import std::ivec;
fn main() {
let v: vec[mutable int] = [mutable 10, 20];
let v: [mutable int] = ~[mutable 10, 20];
assert (v.(0) == 10);
assert (v.(1) == 20);
vec::reverse(v);
ivec::reverse(v);
assert (v.(0) == 20);
assert (v.(1) == 10);
let v2 = vec::reversed[int]([10, 20]);
let v2 = ivec::reversed[int](~[10, 20]);
assert (v2.(0) == 20);
assert (v2.(1) == 10);
v.(0) = 30;
assert (v2.(0) == 20);
// Make sure they work with 0-length vectors too.
let v4 = vec::reversed[int]([]);
let v3: vec[mutable int] = vec::empty_mut();
vec::reverse[int](v3);
let v4 = ivec::reversed[int](~[]);
let v3: [mutable int] = ~[mutable];
ivec::reverse[int](v3);
}