diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-23 00:50:18 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-23 00:50:18 +0000 |
| commit | 8cb7089b2eb09d40d9497cea40d088d94676a8c6 (patch) | |
| tree | d4a2a33fe35807abc0cdeeb0be93edcbe75a4996 /std/map.zc | |
| parent | 3a4a72a38675893c3a1854d05c72b957a6bd9364 (diff) | |
More docs, check 'docs/std'.
Diffstat (limited to 'std/map.zc')
| -rw-r--r-- | std/map.zc | 67 |
1 files changed, 67 insertions, 0 deletions
@@ -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 + }; + } } |
