diff options
| author | Zuhaitz <zuhaitz.zechhub@gmail.com> | 2026-01-21 19:14:02 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-21 19:14:02 +0000 |
| commit | a552bd6b8175fe833e8a77dfb051bf3481df6851 (patch) | |
| tree | fa8262808bf4ecb589f24f87d2ba6d7f5b8a36b2 | |
| parent | 9e47e8e2d7c7c589c3c158cd5ef3069289709fa8 (diff) | |
| parent | a58dd232dc72f20971707c99dfa6266133f70a20 (diff) | |
Merge pull request #84 from davidscholberg/vec-append
added append function to vec
| -rw-r--r-- | docs/std/vec.md | 1 | ||||
| -rw-r--r-- | std/vec.zc | 21 | ||||
| -rw-r--r-- | tests/std/test_vec.zc | 15 |
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. | @@ -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"); |
