diff options
| author | Graydon Hoare <[email protected]> | 2010-10-22 11:46:04 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-10-22 11:46:04 -0700 |
| commit | 05c9d885dd8793b507fad9aaf7d89a113d1b2389 (patch) | |
| tree | 31fe0211fd0925ce81f1da8ad2abae972b061461 /src/lib | |
| parent | Add support for passing args to fns in rustc. (diff) | |
| download | rust-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.rs | 35 |
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) { |