From 3af5dcf34d705cc52c1ffe5b85c2a90b5104e4c9 Mon Sep 17 00:00:00 2001 From: Zuhaitz Méndez Fernández de Aránguiz Date: Mon, 19 Jan 2026 22:18:33 +0000 Subject: Improve 'std/cuda.zc' and 'std/vec.zc' + iteration... --- std/vec.zc | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 96 insertions(+), 13 deletions(-) (limited to 'std/vec.zc') diff --git a/std/vec.zc b/std/vec.zc index 1d9e6e1..be4dc05 100644 --- a/std/vec.zc +++ b/std/vec.zc @@ -14,6 +14,30 @@ struct VecIter { idx: usize; } +struct VecIterResult { + ptr: T*; +} + +impl VecIterResult { + fn is_none(self) -> bool { + return self.ptr == 0; + } + + fn unwrap(self) -> T* { + if (self.ptr == 0) { + !"Panic: unwrap called on null VecIterResult"; + exit(1); + } + return self.ptr; + } +} + +struct VecIterRef { + data: T*; + count: usize; + idx: usize; +} + impl VecIter { fn next(self) -> Option { if (self.idx < self.count) { @@ -23,6 +47,25 @@ impl VecIter { } return Option::None(); } + + fn iterator(self) -> VecIter { + return *self; + } +} + +impl VecIterRef { + fn next(self) -> VecIterResult { + if (self.idx < self.count) { + var item = &self.data[self.idx]; + self.idx = self.idx + 1; + return VecIterResult { ptr: item }; + } + return VecIterResult { ptr: 0 }; + } + + fn iterator(self) -> VecIterRef { + return *self; + } } impl Vec { @@ -30,6 +73,23 @@ impl Vec { return Vec { data: 0, len: 0, cap: 0 }; } + fn with_capacity(cap: usize) -> Vec { + if (cap == 0) { + return Vec { data: 0, len: 0, cap: 0 }; + } + return Vec { + data: (T*)malloc(cap * sizeof(T)), + len: 0, + cap: cap + }; + } + + fn grow(self) { + if (self.cap == 0) { self.cap = 8; } + else { self.cap = self.cap * 2; } + self.data = (T*)realloc(self.data, self.cap * sizeof(T)); + } + fn iterator(self) -> VecIter { return VecIter { data: self.data, @@ -37,16 +97,21 @@ impl Vec { idx: 0 }; } + + fn iter_ref(self) -> VecIterRef { + return VecIterRef { + data: self.data, + count: self.len, + idx: 0 + }; + } fn push(self, item: T) { if (self.len >= self.cap) { - if (self.cap == 0) { self.cap = 8; - } - else { self.cap = self.cap * 2; - } - self.data = realloc(self.data, self.cap * sizeof(T)); + self.grow(); } self.data[self.len] = item; + self.data[self.len] = item; self.len = self.len + 1; } @@ -56,11 +121,7 @@ impl Vec { exit(1); } if (self.len >= self.cap) { - if (self.cap == 0) { self.cap = 8; - } - else { self.cap = self.cap * 2; - } - self.data = realloc(self.data, self.cap * sizeof(T)); + self.grow(); } // Shift elements right if (idx < self.len) { @@ -79,6 +140,14 @@ impl Vec { return self.data[self.len]; } + fn pop_opt(self) -> Option { + if (self.len == 0) { + return Option::None(); + } + self.len = self.len - 1; + return Option::Some(self.data[self.len]); + } + fn remove(self, idx: usize) -> T { if (idx >= self.len) { !"Panic: Remove index out of bounds"; @@ -176,12 +245,26 @@ impl Vec { } fn clone(self) -> Vec { - var new_vec: Vec = Vec::new(); + if (self.len == 0) { + return Vec { data: 0, len: 0, cap: 0 }; + } + var new_data = (T*)malloc(self.len * sizeof(T)); var i: usize = 0; while i < self.len { - new_vec.push(self.data[i]); + new_data[i] = self.data[i]; i = i + 1; } - return new_vec; + return Vec { + data: new_data, + len: self.len, + cap: self.len // Set capacity to exact length + }; + // No local Vec variable means no Drop is called here. + } +} + +impl Drop for Vec { + fn drop(self) { + self.free(); } } -- cgit v1.2.3