summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/std/vec.md1
-rw-r--r--std/vec.zc21
-rw-r--r--tests/std/test_vec.zc15
3 files changed, 34 insertions, 3 deletions
diff --git a/docs/std/vec.md b/docs/std/vec.md
index bda8d5b..3ccdf7e 100644
--- a/docs/std/vec.md
+++ b/docs/std/vec.md
@@ -54,6 +54,7 @@ struct Vec<T> {
| **pop_opt** | `pop_opt(self) -> Option<T>` | Removes the last element and returns `Some(val)`. Returns `None` if empty. Safe usage. |
| **insert** | `insert(self, idx: usize, item: T)` | Inserts an element at `idx`. Shifts elements right. Panics if `idx > len`. |
| **remove** | `remove(self, idx: usize) -> T` | Removes and returns the element at `idx`. Shifts elements left. Panics if `idx >= len`. |
+| **append** | `append(self, other: Vec<T>)` | Appends the given vec to the back of self, growing the capacity of self as needed. |
| **clear** | `clear(self)` | Removes all values. Has no effect on allocated capacity. |
| **reverse** | `reverse(self)` | Reverses the order of elements in place. |
diff --git a/std/vec.zc b/std/vec.zc
index 2205cca..d310535 100644
--- a/std/vec.zc
+++ b/std/vec.zc
@@ -90,6 +90,19 @@ impl Vec<T> {
self.data = (T*)realloc(self.data, self.cap * sizeof(T));
}
+ fn grow_to_fit(self, new_len: usize) {
+ if self.cap >= new_len {
+ return;
+ }
+
+ if (self.cap == 0) { self.cap = 8; }
+ while self.cap < new_len {
+ self.cap = self.cap * 2;
+ }
+
+ self.data = (T*)realloc(self.data, self.cap * sizeof(T));
+ }
+
fn iterator(self) -> VecIter<T> {
return VecIter<T> {
data: self.data,
@@ -161,6 +174,14 @@ impl Vec<T> {
return item;
}
+ fn append(self, other: Vec<T>) {
+ var new_len = self.len + other.len;
+ self.grow_to_fit(new_len);
+
+ memcpy(self.data + self.len, other.data, other.len * sizeof(T));
+ self.len = new_len;
+ }
+
fn get(self, idx: usize) -> T {
if (idx >= self.len) {
!"Panic: Index out of bounds";
diff --git a/tests/std/test_vec.zc b/tests/std/test_vec.zc
index 4787e06..5e3dddf 100644
--- a/tests/std/test_vec.zc
+++ b/tests/std/test_vec.zc
@@ -72,7 +72,7 @@ test "Vec Capacity and Allocation" {
assert_eq(v2.cap, 16, "Growth strategy check (8->16)");
}
-test "Vec Modification (Insert, Remove, Clear)" {
+test "Vec Modification (Insert, Append, Remove, Clear)" {
print "Testing Vec modification...\n";
var v = Vec<int>::new();
v.push(1);
@@ -82,10 +82,19 @@ test "Vec Modification (Insert, Remove, Clear)" {
assert_eq(v.get(1), 2, "insert middle");
assert_eq(v.len, 3, "insert len");
- var val = v.remove(0); // [2, 3]
+ var v2 = Vec<int>::new();
+ v2.push(4);
+ v2.push(5);
+ v.append(v2);
+ assert_eq(v.len, 5, "append len");
+ for i in 0..5 {
+ assert_eq(v.get(i), i + 1, "append value");
+ }
+
+ var val = v.remove(0); // [2, 3, 4, 5]
assert_eq(val, 1, "remove return");
assert_eq(v.get(0), 2, "remove shift");
- assert_eq(v.len, 2, "remove len");
+ assert_eq(v.len, 4, "remove len");
v.clear();
assert_eq(v.len, 0, "clear len");