diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-19 12:53:47 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-19 12:53:47 +0000 |
| commit | 639c6ac65a1bd44b2ba0725fe7016a4920bf0950 (patch) | |
| tree | 47703f960633d3d4580022583134c28b96d5f36e /std | |
| parent | 526b7748cafcb5a00f8e30df88661f6059d79843 (diff) | |
Iterables and iterators :D
Diffstat (limited to 'std')
| -rw-r--r-- | std/iter.zc | 9 | ||||
| -rw-r--r-- | std/json.zc | 4 | ||||
| -rw-r--r-- | std/mem.zc | 4 | ||||
| -rw-r--r-- | std/vec.zc | 26 |
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(); @@ -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*; } @@ -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) { |
