Skip to content

Commit c54f3cb

Browse files
Eric Holkgraydon
authored andcommitted
---
yaml --- r: 2658 b: refs/heads/master c: 5d09e12 h: refs/heads/master v: v3
1 parent 5375962 commit c54f3cb

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 7f938f4945bcf6ba27f872b179a517e4d5c39a4f
2+
refs/heads/master: 5d09e12e15b8b37739cb2935ae3e8e13c693bd8f

trunk/src/lib/vec.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,45 @@ fn freeze[T](vec[mutable T] v) -> vec[T] {
322322
ret result;
323323
}
324324

325+
// Swaps two elements in a vector
326+
fn swap[T](&vec[T] v, uint a, uint b) {
327+
let T t = v.(a);
328+
v.(a) = v.(b);
329+
v.(b) = t;
330+
}
331+
332+
// In place vector reversal
333+
fn reverse[T](&vec[T] v) -> () {
334+
let uint i = 0u;
335+
auto ln = len[T](v);
336+
337+
while(i < ln / 2u) {
338+
swap(v, i, ln - i - 1u);
339+
i += 1u;
340+
}
341+
}
342+
343+
// Functional vector reversal. Returns a reversed copy of v.
344+
fn reversed[T](vec[T] v) -> vec[T] {
345+
let vec[T] res = [];
346+
347+
auto i = len[T](v);
348+
if (i == 0u) {
349+
ret res;
350+
}
351+
else {
352+
i -= 1u;
353+
}
354+
355+
while(i != 0u) {
356+
push[T](res, v.(i));
357+
i -= 1u;
358+
}
359+
push[T](res, v.(0));
360+
361+
ret res;
362+
}
363+
325364
// Local Variables:
326365
// mode: rust;
327366
// fill-column: 78;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use std;
2+
import std::vec;
3+
4+
fn main() {
5+
let vec[int] v = [10, 20];
6+
7+
assert v.(0) == 10;
8+
assert v.(1) == 20;
9+
10+
vec::reverse[int](v);
11+
12+
assert v.(0) == 20;
13+
assert v.(1) == 10;
14+
15+
auto v2 = vec::reversed[int](v);
16+
17+
assert v2.(0) == 10;
18+
assert v2.(1) == 20;
19+
20+
v.(0) = 30;
21+
22+
assert v2.(0) == 10;
23+
24+
// Make sure they work with 0-length vectors too.
25+
let vec[int] v3 = [];
26+
auto v4 = vec::reversed[int](v3);
27+
28+
vec::reverse[int](v3);
29+
}

0 commit comments

Comments
 (0)