aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-10-22 11:46:04 -0700
committerGraydon Hoare <[email protected]>2010-10-22 11:46:04 -0700
commit05c9d885dd8793b507fad9aaf7d89a113d1b2389 (patch)
tree31fe0211fd0925ce81f1da8ad2abae972b061461 /src/lib
parentAdd support for passing args to fns in rustc. (diff)
downloadrust-05c9d885dd8793b507fad9aaf7d89a113d1b2389.tar.xz
rust-05c9d885dd8793b507fad9aaf7d89a113d1b2389.zip
Change vec slice to use uint, add push/pop/shift/unshift.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/_vec.rs35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/lib/_vec.rs b/src/lib/_vec.rs
index 55020684..c67061c5 100644
--- a/src/lib/_vec.rs
+++ b/src/lib/_vec.rs
@@ -85,19 +85,42 @@ fn print_debug_info[T](vec[T] v) {
}
// Returns elements from [start..end) from v.
-fn slice[T](vec[T] v, int start, int end) -> vec[T] {
- check (0 <= start);
+fn slice[T](vec[T] v, uint start, uint end) -> vec[T] {
check (start <= end);
- check (end <= (len[T](v) as int));
- auto result = alloc[T]((end - start) as uint);
- let int i = start;
+ check (end <= len[T](v));
+ auto result = alloc[T](end - start);
+ let uint i = start;
while (i < end) {
result += vec(v.(i));
- i += 1;
+ i += 1u;
}
ret result;
}
+fn shift[T](vec[T] v) -> vec[T] {
+ check(len[T](v) > 0u);
+ ret slice[T](v, 1u, len[T](v));
+}
+
+fn pop[T](vec[T] v) -> vec[T] {
+ check(len[T](v) > 0u);
+ ret slice[T](v, 0u, len[T](v) - 1u);
+}
+
+fn push[T](vec[T] v, &T t) -> vec[T] {
+ v += t;
+ ret v;
+}
+
+fn unshift[T](vec[T] v, &T t) -> vec[T] {
+ auto res = alloc[T](len[T](v) + 1u);
+ res += t;
+ for (T t_ in v) {
+ res += t_;
+ }
+ ret res;
+}
+
fn grow[T](&mutable vec[T] v, int n, &T initval) {
let int i = n;
while (i > 0) {