aboutsummaryrefslogtreecommitdiff
path: root/lib/iter.c
blob: ff27a68263494ab3583da22971d56911f1976253 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// SPDX-License-Identifier: LGPL-3.0-or-later

#include "impl.h"

void hkvs_iter_open(hkvs *c, hkvs_table *t, hkvs_iter *it) {
	(void)c;

	it->priv1 = 0;
	it->priv2 = hkvs_slab_size(&t->slab);
}

void hkvs_iter_seek(hkvs *c, hkvs_table *t, hkvs_iter *it, hkvs_rid id) {
	(void)c;

	size_t n = hkvs_slab_size(&t->slab);
	it->priv1 = id.id >= n ? SIZE_MAX : (size_t)id.id;
	it->priv2 = n;
}

hkvs_rid hkvs_iter_next(hkvs *c, hkvs_table *t, hkvs_iter *it, const char **pkey) {
	(void)c;

	size_t id = it->priv1;
	size_t n = it->priv2;
	if(id >= n) return HKVS_INVALID_RID;
	while(true) {
		uint8_t mark = hkvs_slab_mark(&t->slab, id);
		if(mark != 0) {
			it->priv1 = id + 1;
			if(pkey) *pkey = hkvs_slab_at(&t->slab, id);
			return (hkvs_rid){id};
		}
		id++;
		if(id == n) {
			it->priv1 = SIZE_MAX;
			return HKVS_INVALID_RID;
		}
	}
}

void hkvs_iter_delete(hkvs *c, hkvs_table *t, hkvs_iter *it) {
	hkvs_record_delete(c, t, (hkvs_rid){it->priv1 - 1});
}