Skip to content

Commit 4dec0f6

Browse files
committed
Add reverse and reversed to std::ivec
Modify tests to use the ivec version
1 parent 97dc75d commit 4dec0f6

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

src/lib/ivec.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,32 @@ fn zip[@T, @U](v: &[T], u: &[U]) -> [{_0: T, _1: U}] {
303303
}
304304
}
305305

306+
// Swaps two elements in a vector
307+
fn swap[@T](v: &[mutable T], a: uint, b: uint) {
308+
let t: T = v.(a);
309+
v.(a) = v.(b);
310+
v.(b) = t;
311+
}
312+
313+
// In place vector reversal
314+
fn reverse[@T](v: &[mutable T]) {
315+
let i: uint = 0u;
316+
let ln = len[T](v);
317+
while i < ln / 2u { swap(v, i, ln - i - 1u); i += 1u; }
318+
}
319+
320+
321+
// Functional vector reversal. Returns a reversed copy of v.
322+
fn reversed[@T](v: &[T]) -> [T] {
323+
let rs: [T] = ~[];
324+
let i = len[T](v);
325+
if i == 0u { ret rs; } else { i -= 1u; }
326+
while i != 0u { rs += ~[v.(i)]; i -= 1u; }
327+
rs += ~[v.(0)];
328+
ret rs;
329+
}
330+
331+
306332
mod unsafe {
307333
type ivec_repr =
308334
{mutable fill: uint,

src/test/run-pass/vec-reverse.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11

22
use std;
3-
import std::vec;
3+
import std::ivec;
44

55
fn main() {
6-
let v: vec[mutable int] = [mutable 10, 20];
6+
let v: [mutable int] = ~[mutable 10, 20];
77
assert (v.(0) == 10);
88
assert (v.(1) == 20);
9-
vec::reverse(v);
9+
ivec::reverse(v);
1010
assert (v.(0) == 20);
1111
assert (v.(1) == 10);
12-
let v2 = vec::reversed[int]([10, 20]);
12+
let v2 = ivec::reversed[int](~[10, 20]);
1313
assert (v2.(0) == 20);
1414
assert (v2.(1) == 10);
1515
v.(0) = 30;
1616
assert (v2.(0) == 20);
1717
// Make sure they work with 0-length vectors too.
1818

19-
let v4 = vec::reversed[int]([]);
20-
let v3: vec[mutable int] = vec::empty_mut();
21-
vec::reverse[int](v3);
19+
let v4 = ivec::reversed[int](~[]);
20+
let v3: [mutable int] = ~[mutable];
21+
ivec::reverse[int](v3);
2222
}

0 commit comments

Comments
 (0)