Add reverse and reversed to std::ivec
Modify tests to use the ivec version
This commit is contained in:
parent
97dc75da16
commit
4dec0f6d96
@ -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,
|
||||
|
@ -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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user