diff --git a/src/lib/ivec.rs b/src/lib/ivec.rs index 0343c98676a..1b21a199e89 100644 --- a/src/lib/ivec.rs +++ b/src/lib/ivec.rs @@ -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, diff --git a/src/test/run-pass/vec-reverse.rs b/src/test/run-pass/vec-reverse.rs index 64d75b6b878..4e5992a2cc5 100644 --- a/src/test/run-pass/vec-reverse.rs +++ b/src/test/run-pass/vec-reverse.rs @@ -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); } \ No newline at end of file