Lindenii Project Forge
Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.
/ds/map/swiss/iter.ha (raw)
// SPDX-License-Identifier: Apache-2.0 AND MPL-2.0
// SPDX-FileCopyrightText: 2024 The Cockroach Authors
// SPDX-FileCopyrightText: 2025 Runxi Yu
use ds::map;
export type iterator = struct {
vt: map::iterator,
m: *map,
gi: size,
si: size,
};
const _itvt: map::vtable_iterator = map::vtable_iterator {
nexter = &vt_next,
};
fn vt_next(it: *map::iterator) (([]u8, *opaque) | done) = next(it: *iterator);
export fn iter(m: *map) (*map::iterator | nomem) = {
let it = alloc(iterator {
vt = &_itvt,
m = m,
gi = 0,
si = 0,
})?;
return (it: *map::iterator);
};
export fn next(it: *iterator) (([]u8, *opaque) | done) = {
if (len(it.m.groups) == 0) return done;
for (it.gi <= it.m.group_mask) {
for (let g = &it.m.groups[it.gi]; it.si < GROUP_SIZE; it.si += 1) {
let c = g.ctrl[it.si];
if (!is_full_ctrl(c)) {
continue;
};
let k = g.keys[it.si];
let v = g.vals[it.si];
it.si += 1;
match (v) {
case null =>
abort("map: null internal state escaped");
case let p: *opaque =>
return (k, p);
};
};
it.gi += 1;
it.si = 0;
};
return done;
};