From 8cb7089b2eb09d40d9497cea40d088d94676a8c6 Mon Sep 17 00:00:00 2001 From: Zuhaitz Méndez Fernández de Aránguiz Date: Fri, 23 Jan 2026 00:50:18 +0000 Subject: More docs, check 'docs/std'. --- std/map.zc | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'std/map.zc') 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 { cap: usize; } +struct MapEntry { + key: char*; + val: V; +} + +struct MapIter { + keys: char**; + vals: V*; + occupied: bool*; + deleted: bool*; + cap: usize; + idx: usize; +} + +struct MapIterResult { + entry: MapEntry; + has_val: bool; +} + +impl MapIterResult { + fn is_none(self) -> bool { + return !self.has_val; + } + + fn unwrap(self) -> MapEntry { + if (!self.has_val) { + !"Panic: Map iterator unwrap on None"; + exit(1); + } + return self.entry; + } +} + +impl MapIter { + fn next(self) -> MapIterResult { + while self.idx < self.cap { + var i = self.idx; + self.idx = self.idx + 1; + + if (self.occupied[i] && !self.deleted[i]) { + var entry = MapEntry { + key: self.keys[i], + val: self.vals[i] + }; + return MapIterResult { + entry: entry, + has_val: true + }; + } + } + // Empty entry for None + var empty = MapEntry { key: 0, val: self.vals[0] }; // Should be 0-init if possible + return MapIterResult { entry: empty, has_val: false }; + } +} + impl Map { fn new() -> Map { return Map { keys: 0, vals: 0, occupied: 0, deleted: 0, len: 0, cap: 0 }; @@ -180,4 +236,15 @@ impl Map { fn val_at(self, idx: usize) -> V { return self.vals[idx]; } + + fn iterator(self) -> MapIter { + return MapIter { + keys: self.keys, + vals: self.vals, + occupied: self.occupied, + deleted: self.deleted, + cap: self.cap, + idx: 0 + }; + } } -- cgit v1.2.3