summaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-19 12:53:47 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-19 12:53:47 +0000
commit639c6ac65a1bd44b2ba0725fe7016a4920bf0950 (patch)
tree47703f960633d3d4580022583134c28b96d5f36e /std
parent526b7748cafcb5a00f8e30df88661f6059d79843 (diff)
Iterables and iterators :D
Diffstat (limited to 'std')
-rw-r--r--std/iter.zc9
-rw-r--r--std/json.zc4
-rw-r--r--std/mem.zc4
-rw-r--r--std/vec.zc26
4 files changed, 42 insertions, 1 deletions
diff --git a/std/iter.zc b/std/iter.zc
new file mode 100644
index 0000000..a4fdb59
--- /dev/null
+++ b/std/iter.zc
@@ -0,0 +1,9 @@
+import "./option.zc"
+
+trait Iterator<T> {
+ fn next(self) -> Option<T>;
+}
+
+trait Iterable<T> {
+ fn iterator(self) -> Iterator<T>;
+}
diff --git a/std/json.zc b/std/json.zc
index 64d64ab..cfef2c3 100644
--- a/std/json.zc
+++ b/std/json.zc
@@ -25,8 +25,10 @@ struct JsonValue {
object_val: Map<JsonValue*>*;
}
+
+alias JsonValuePtr = JsonValue*;
+
raw {
- typedef struct JsonValue* JsonValuePtr;
Vec_JsonValuePtr Vec_JsonValuePtr__new();
void Vec_JsonValuePtr__push(Vec_JsonValuePtr* self, JsonValue* item);
Map_JsonValuePtr Map_JsonValuePtr__new();
diff --git a/std/mem.zc b/std/mem.zc
index 45bc208..5f4de36 100644
--- a/std/mem.zc
+++ b/std/mem.zc
@@ -11,6 +11,10 @@ fn alloc_n<T>(n: usize) -> T* {
return (T*)malloc(sizeof(T) * n);
}
+trait Drop {
+ fn drop(self);
+}
+
struct Box<T> {
ptr: T*;
}
diff --git a/std/vec.zc b/std/vec.zc
index a25b37b..1d9e6e1 100644
--- a/std/vec.zc
+++ b/std/vec.zc
@@ -1,5 +1,6 @@
import "./core.zc"
+import "./iter.zc"
struct Vec<T> {
data: T*;
@@ -7,10 +8,35 @@ struct Vec<T> {
cap: usize;
}
+struct VecIter<T> {
+ data: T*;
+ count: usize;
+ idx: usize;
+}
+
+impl VecIter<T> {
+ fn next(self) -> Option<T> {
+ if (self.idx < self.count) {
+ var item = self.data[self.idx];
+ self.idx = self.idx + 1;
+ return Option<T>::Some(item);
+ }
+ return Option<T>::None();
+ }
+}
+
impl Vec<T> {
fn new() -> Vec<T> {
return Vec<T> { data: 0, len: 0, cap: 0 };
}
+
+ fn iterator(self) -> VecIter<T> {
+ return VecIter<T> {
+ data: self.data,
+ count: self.len,
+ idx: 0
+ };
+ }
fn push(self, item: T) {
if (self.len >= self.cap) {