summaryrefslogtreecommitdiff
path: root/std/map.zc
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-23 00:50:18 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-23 00:50:18 +0000
commit8cb7089b2eb09d40d9497cea40d088d94676a8c6 (patch)
treed4a2a33fe35807abc0cdeeb0be93edcbe75a4996 /std/map.zc
parent3a4a72a38675893c3a1854d05c72b957a6bd9364 (diff)
More docs, check 'docs/std'.
Diffstat (limited to 'std/map.zc')
-rw-r--r--std/map.zc67
1 files changed, 67 insertions, 0 deletions
diff --git a/std/map.zc b/std/map.zc
index a7bae69..ca4766f 100644
--- a/std/map.zc
+++ b/std/map.zc
@@ -23,6 +23,62 @@ struct Map<V> {
cap: usize;
}
+struct MapEntry<V> {
+ key: char*;
+ val: V;
+}
+
+struct MapIter<V> {
+ keys: char**;
+ vals: V*;
+ occupied: bool*;
+ deleted: bool*;
+ cap: usize;
+ idx: usize;
+}
+
+struct MapIterResult<V> {
+ entry: MapEntry<V>;
+ has_val: bool;
+}
+
+impl MapIterResult<V> {
+ fn is_none(self) -> bool {
+ return !self.has_val;
+ }
+
+ fn unwrap(self) -> MapEntry<V> {
+ if (!self.has_val) {
+ !"Panic: Map iterator unwrap on None";
+ exit(1);
+ }
+ return self.entry;
+ }
+}
+
+impl MapIter<V> {
+ fn next(self) -> MapIterResult<V> {
+ while self.idx < self.cap {
+ var i = self.idx;
+ self.idx = self.idx + 1;
+
+ if (self.occupied[i] && !self.deleted[i]) {
+ var entry = MapEntry<V> {
+ key: self.keys[i],
+ val: self.vals[i]
+ };
+ return MapIterResult<V> {
+ entry: entry,
+ has_val: true
+ };
+ }
+ }
+ // Empty entry for None
+ var empty = MapEntry<V> { key: 0, val: self.vals[0] }; // Should be 0-init if possible
+ return MapIterResult<V> { entry: empty, has_val: false };
+ }
+}
+
impl Map<V> {
fn new() -> Map<V> {
return Map<V> { keys: 0, vals: 0, occupied: 0, deleted: 0, len: 0, cap: 0 };
@@ -180,4 +236,15 @@ impl Map<V> {
fn val_at(self, idx: usize) -> V {
return self.vals[idx];
}
+
+ fn iterator(self) -> MapIter<V> {
+ return MapIter<V> {
+ keys: self.keys,
+ vals: self.vals,
+ occupied: self.occupied,
+ deleted: self.deleted,
+ cap: self.cap,
+ idx: 0
+ };
+ }
}