Added two version of reverse and a swap function to the standard library.
This commit is contained in:
parent
7f938f4945
commit
5d09e12e15
2 changed files with 68 additions and 0 deletions
|
|
@ -322,6 +322,45 @@ fn freeze[T](vec[mutable T] v) -> vec[T] {
|
|||
ret result;
|
||||
}
|
||||
|
||||
// Swaps two elements in a vector
|
||||
fn swap[T](&vec[T] v, uint a, uint b) {
|
||||
let T t = v.(a);
|
||||
v.(a) = v.(b);
|
||||
v.(b) = t;
|
||||
}
|
||||
|
||||
// In place vector reversal
|
||||
fn reverse[T](&vec[T] v) -> () {
|
||||
let uint i = 0u;
|
||||
auto 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](vec[T] v) -> vec[T] {
|
||||
let vec[T] res = [];
|
||||
|
||||
auto i = len[T](v);
|
||||
if (i == 0u) {
|
||||
ret res;
|
||||
}
|
||||
else {
|
||||
i -= 1u;
|
||||
}
|
||||
|
||||
while(i != 0u) {
|
||||
push[T](res, v.(i));
|
||||
i -= 1u;
|
||||
}
|
||||
push[T](res, v.(0));
|
||||
|
||||
ret res;
|
||||
}
|
||||
|
||||
// Local Variables:
|
||||
// mode: rust;
|
||||
// fill-column: 78;
|
||||
|
|
|
|||
29
src/test/run-pass/vec-reverse.rs
Normal file
29
src/test/run-pass/vec-reverse.rs
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
use std;
|
||||
import std::vec;
|
||||
|
||||
fn main() {
|
||||
let vec[int] v = [10, 20];
|
||||
|
||||
assert v.(0) == 10;
|
||||
assert v.(1) == 20;
|
||||
|
||||
vec::reverse[int](v);
|
||||
|
||||
assert v.(0) == 20;
|
||||
assert v.(1) == 10;
|
||||
|
||||
auto v2 = vec::reversed[int](v);
|
||||
|
||||
assert v2.(0) == 10;
|
||||
assert v2.(1) == 20;
|
||||
|
||||
v.(0) = 30;
|
||||
|
||||
assert v2.(0) == 10;
|
||||
|
||||
// Make sure they work with 0-length vectors too.
|
||||
let vec[int] v3 = [];
|
||||
auto v4 = vec::reversed[int](v3);
|
||||
|
||||
vec::reverse[int](v3);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue