Lindenii Project Forge
Login

hare-ds

Data structures for Hare
Commit info
ID
240dd1b76931e87f7ea66b20b8ca1a4245a628da
Author
Runxi Yu <me@runxiyu.org>
Author date
Fri, 19 Sep 2025 14:40:45 +0800
Committer
Runxi Yu <me@runxiyu.org>
Committer date
Fri, 19 Sep 2025 14:42:53 +0800
Actions
Adjust testing parameters
use ds::map;
use errors;

@test fn test() void = {
	const ts: [3]size = [2z, 3z, 8z];
	const ts: [_]size = [2z, 3z, 8z];
	for (let i = 0z; i < len(ts); i += 1) {
		let m: *map = match (new(ts[i])) {
		case let p: *map => yield p;
		case errors::invalid => abort("btree: invalid t");
		case nomem => abort("btree: nomem");
		};
		defer finish(m);
		map::stress_test(m, 20000);
	};
};
use crypto::random;
use ds::map;
use ds::map::slice_basic;
use ds::map::slice_sorted;
use ds::map::btree;
use ds::map::rbtree;
use ds::map::swiss_siphash;
use errors;

fn mk_slice_basic() (*map::map | nomem) = {
	match (slice_basic::new()) {
	case let p: *slice_basic::map => return (p: *map::map);
	case nomem => return nomem;
	};
};

@test fn test() void = {
	const buckets: [_]size = [128z, 256z];
	const buckets: [_]size = [64z, 128z];
	const makers: [_]*fn() (*map::map | nomem) = [&mk_slice_basic];

	for (let bi = 0z; bi < len(buckets); bi += 1) {
		for (let mi = 0z; mi < len(makers); mi += 1) {
			let m: *map = match (new(makers[mi], buckets[bi])) {
			case let p: *map => yield p;
			case errors::invalid => abort("fnv: invalid");
			case nomem => abort("fnv: nomem");
			};
			defer finish(m);
			map::stress_test(m, 20000);
		};
	};
};
use crypto::random;
use ds::map;
use ds::map::slice_basic;
use ds::map::slice_sorted;
use ds::map::btree;
use ds::map::rbtree;
use ds::map::swiss_siphash;
use errors;

fn mk_slice_basic() (*map::map | nomem) = {
	match (slice_basic::new()) {
	case let p: *slice_basic::map => return (p: *map::map);
	case nomem => return nomem;
	};
};

@test fn test() void = {
	const buckets: [_]size = [128z, 256z];
	const buckets: [_]size = [64z, 128z];
	const makers: [_]*fn() (*map::map | nomem) = [&mk_slice_basic];

	let key1: [16]u8 = [0...];
	let key2: [16]u8 = [0...];
	random::buffer(&key1);
	random::buffer(&key2);
	const keys: [2]*[16]u8 = [&key1, &key2];

	for (let bi = 0z; bi < len(buckets); bi += 1) {
		for (let ki = 0z; ki < len(keys); ki += 1) {
			for (let mi = 0z; mi < len(makers); mi += 1) {
				let m: *map = match (new(makers[mi], buckets[bi], *keys[ki])) {
				case let p: *map => yield p;
				case errors::invalid => abort("siphash: invalid");
				case nomem => abort("siphash: nomem");
				};
				defer finish(m);
				map::stress_test(m, 20000);
			};
		};
	};
};
use ds::map;

@test fn test_2000() void = {
@test fn test() void = {
	let m: *map = match (new()) {
	case let p: *map => yield p;
	case nomem => abort("slice_basic: nomem");
	};
	defer finish(m);
	map::stress_test(m, 2000);
	map::stress_test(m, 8000);
};
use ds::map;

@test fn test_2000() void = {
@test fn test() void = {
	let m: *map = match (new()) {
	case let p: *map => yield p;
	case nomem => abort("slice_sorted: nomem");
	};
	defer finish(m);
	map::stress_test(m, 2000);
	map::stress_test(m, 8000);
};
use ds::map;
use errors;

fn testhash(_params: nullable *opaque, key: []u8) size = {
	let val: u64 = 0;
	let limit = if (len(key) < 8z) len(key) else 8z;
	for (let i = 0z; i < limit; i += 1) {
		val |= (key[i]: u64) << (8u64 * (i: u64));
	};
	return (val: size);
};

@test fn invalid() void = {
	match (new(0, &testhash, null)) {
	case errors::invalid => void;
	case *map => abort("swiss: accepted n_groups=0");
	case nomem => abort("swiss: nomem for n_groups=0");
	};
};

@test fn test() void = {
	const groups: [3]size = [1z, 17z, 128z];
	const groups: [_]size = [64z, 128z];

	for (let gi = 0z; gi < len(groups); gi += 1) {
		let m = match (new(groups[gi], &testhash, null)) {
		case let p: *map => yield p;
		case errors::invalid => abort("swiss: invalid parameters");
		case nomem => abort("swiss: nomem");
		};
		defer finish(m);
		map::stress_test(m, 20000);
	};
};
use ds::map;
use errors;

@test fn test() void = {
	const groups: [2]size = [1z, 32z];
	const groups: [_]size = [64z, 128z];

	for (let gi = 0z; gi < len(groups); gi += 1) {
		let m: *map = match (new(groups[gi])) {
		case let p: *map => yield p;
		case errors::invalid => abort("swiss_fnv: invalid groups");
		case nomem => abort("swiss_fnv: nomem");
		};
		defer finish(m);
		map::stress_test(m, 200000);
		map::stress_test(m, 20000);
	};
};
use crypto::random;
use ds::map;
use errors;

@test fn test() void = {
	let key1: [16]u8 = [0...];
	let key2: [16]u8 = [0...];
	random::buffer(&key1);
	random::buffer(&key2);

	const groups: [2]size = [1z, 32z];
	const groups: [_]size = [64z, 128z];
	const keys: [2]*[16]u8 = [&key1, &key2];

	for (let gi = 0z; gi < len(groups); gi += 1) {
		for (let ki = 0z; ki < len(keys); ki += 1) {
			let m: *map = match (new(groups[gi], *keys[ki])) {
			case let p: *map => yield p;
			case errors::invalid => abort("swiss_siphash: invalid groups");
			case nomem => abort("swiss_siphash: nomem");
			};
			defer finish(m);
			map::stress_test(m, 20000);
		};
	};
};