Lindenii Project Forge
Login

hare-ds

Data structures for Hare

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;
};