about summary refs log tree commit diff
path: root/src/lib/vec.rs
diff options
context:
space:
mode:
authorEric Holk <eholk@mozilla.com>2011-05-19 16:43:46 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-05-19 17:25:37 -0700
commit5d09e12e15b8b37739cb2935ae3e8e13c693bd8f (patch)
tree207a6fc129d8095db6e63e50fe0f62d1c2fdd85f /src/lib/vec.rs
parent7f938f4945bcf6ba27f872b179a517e4d5c39a4f (diff)
downloadrust-5d09e12e15b8b37739cb2935ae3e8e13c693bd8f.tar.gz
rust-5d09e12e15b8b37739cb2935ae3e8e13c693bd8f.zip
Added two version of reverse and a swap function to the standard library.
Diffstat (limited to 'src/lib/vec.rs')
-rw-r--r--src/lib/vec.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/lib/vec.rs b/src/lib/vec.rs
index ba604073856..f3f06a1dc85 100644
--- a/src/lib/vec.rs
+++ b/src/lib/vec.rs
@@ -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;