提交 05c9d885 编写于 作者: G Graydon Hoare

Change vec slice to use uint, add push/pop/shift/unshift.

上级 3f80e79e
......@@ -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) {
......
use std;
fn test_init_elt() {
let vec[uint] v = std._vec.init_elt[uint](5 as uint, 3 as uint);
check (std._vec.len[uint](v) == (3 as uint));
check (v.(0) == (5 as uint));
check (v.(1) == (5 as uint));
check (v.(2) == (5 as uint));
let vec[uint] v = std._vec.init_elt[uint](5u, 3u);
check (std._vec.len[uint](v) == 3u);
check (v.(0) == 5u);
check (v.(1) == 5u);
check (v.(2) == 5u);
}
fn id(uint x) -> uint {
......@@ -13,19 +13,19 @@ fn id(uint x) -> uint {
}
fn test_init_fn() {
let fn(uint)->uint op = id;
let vec[uint] v = std._vec.init_fn[uint](op, (5 as uint));
check (std._vec.len[uint](v) == (5 as uint));
check (v.(0) == (0 as uint));
check (v.(1) == (1 as uint));
check (v.(2) == (2 as uint));
check (v.(3) == (3 as uint));
check (v.(4) == (4 as uint));
let vec[uint] v = std._vec.init_fn[uint](op, 5u);
check (std._vec.len[uint](v) == 5u);
check (v.(0) == 0u);
check (v.(1) == 1u);
check (v.(2) == 2u);
check (v.(3) == 3u);
check (v.(4) == 4u);
}
fn test_slice() {
let vec[int] v = vec(1,2,3,4,5);
auto v2 = std._vec.slice[int](v, 2, 4);
check (std._vec.len[int](v2) == (2 as uint));
auto v2 = std._vec.slice[int](v, 2u, 4u);
check (std._vec.len[int](v2) == 2u);
check (v2.(0) == 3);
check (v2.(1) == 4);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册