Add reverse and reversed to std::ivec
Modify tests to use the ivec version
This commit is contained in:
parent
97dc75da16
commit
4dec0f6d96
2 changed files with 33 additions and 7 deletions
|
@ -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 {
|
mod unsafe {
|
||||||
type ivec_repr =
|
type ivec_repr =
|
||||||
{mutable fill: uint,
|
{mutable fill: uint,
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
|
|
||||||
use std;
|
use std;
|
||||||
import std::vec;
|
import std::ivec;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let v: vec[mutable int] = [mutable 10, 20];
|
let v: [mutable int] = ~[mutable 10, 20];
|
||||||
assert (v.(0) == 10);
|
assert (v.(0) == 10);
|
||||||
assert (v.(1) == 20);
|
assert (v.(1) == 20);
|
||||||
vec::reverse(v);
|
ivec::reverse(v);
|
||||||
assert (v.(0) == 20);
|
assert (v.(0) == 20);
|
||||||
assert (v.(1) == 10);
|
assert (v.(1) == 10);
|
||||||
let v2 = vec::reversed[int]([10, 20]);
|
let v2 = ivec::reversed[int](~[10, 20]);
|
||||||
assert (v2.(0) == 20);
|
assert (v2.(0) == 20);
|
||||||
assert (v2.(1) == 10);
|
assert (v2.(1) == 10);
|
||||||
v.(0) = 30;
|
v.(0) = 30;
|
||||||
assert (v2.(0) == 20);
|
assert (v2.(0) == 20);
|
||||||
// Make sure they work with 0-length vectors too.
|
// Make sure they work with 0-length vectors too.
|
||||||
|
|
||||||
let v4 = vec::reversed[int]([]);
|
let v4 = ivec::reversed[int](~[]);
|
||||||
let v3: vec[mutable int] = vec::empty_mut();
|
let v3: [mutable int] = ~[mutable];
|
||||||
vec::reverse[int](v3);
|
ivec::reverse[int](v3);
|
||||||
}
|
}
|
Loading…
Reference in a new issue