Skip to content

Commit f2406c8

Browse files
pks-tgitster
authored andcommitted
reftable/generic: move generic iterator code into iterator interface
Move functions relating to the reftable iterator from "generic.c" into "iter.c". This prepares for the removal of the former subsystem. While at it, remove some unneeded braces to conform to our coding style. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent b34ce7e commit f2406c8

File tree

4 files changed

+133
-116
lines changed

4 files changed

+133
-116
lines changed

reftable/generic.c

Lines changed: 1 addition & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ license that can be found in the LICENSE file or at
99
#include "constants.h"
1010
#include "record.h"
1111
#include "generic.h"
12+
#include "iter.h"
1213
#include "reftable-iterator.h"
1314
#include "reftable-generic.h"
1415

@@ -32,37 +33,6 @@ void reftable_table_init_log_iter(struct reftable_table *tab,
3233
table_init_iter(tab, it, BLOCK_TYPE_LOG);
3334
}
3435

35-
int reftable_iterator_seek_ref(struct reftable_iterator *it,
36-
const char *name)
37-
{
38-
struct reftable_record want = {
39-
.type = BLOCK_TYPE_REF,
40-
.u.ref = {
41-
.refname = (char *)name,
42-
},
43-
};
44-
return it->ops->seek(it->iter_arg, &want);
45-
}
46-
47-
int reftable_iterator_seek_log_at(struct reftable_iterator *it,
48-
const char *name, uint64_t update_index)
49-
{
50-
struct reftable_record want = {
51-
.type = BLOCK_TYPE_LOG,
52-
.u.log = {
53-
.refname = (char *)name,
54-
.update_index = update_index,
55-
},
56-
};
57-
return it->ops->seek(it->iter_arg, &want);
58-
}
59-
60-
int reftable_iterator_seek_log(struct reftable_iterator *it,
61-
const char *name)
62-
{
63-
return reftable_iterator_seek_log_at(it, name, ~((uint64_t) 0));
64-
}
65-
6636
int reftable_table_read_ref(struct reftable_table *tab, const char *name,
6737
struct reftable_ref_record *ref)
6838
{
@@ -152,78 +122,3 @@ uint32_t reftable_table_hash_id(struct reftable_table *tab)
152122
{
153123
return tab->ops->hash_id(tab->table_arg);
154124
}
155-
156-
void reftable_iterator_destroy(struct reftable_iterator *it)
157-
{
158-
if (!it->ops) {
159-
return;
160-
}
161-
it->ops->close(it->iter_arg);
162-
it->ops = NULL;
163-
FREE_AND_NULL(it->iter_arg);
164-
}
165-
166-
int reftable_iterator_next_ref(struct reftable_iterator *it,
167-
struct reftable_ref_record *ref)
168-
{
169-
struct reftable_record rec = {
170-
.type = BLOCK_TYPE_REF,
171-
.u = {
172-
.ref = *ref
173-
},
174-
};
175-
int err = iterator_next(it, &rec);
176-
*ref = rec.u.ref;
177-
return err;
178-
}
179-
180-
int reftable_iterator_next_log(struct reftable_iterator *it,
181-
struct reftable_log_record *log)
182-
{
183-
struct reftable_record rec = {
184-
.type = BLOCK_TYPE_LOG,
185-
.u = {
186-
.log = *log,
187-
},
188-
};
189-
int err = iterator_next(it, &rec);
190-
*log = rec.u.log;
191-
return err;
192-
}
193-
194-
int iterator_seek(struct reftable_iterator *it, struct reftable_record *want)
195-
{
196-
return it->ops->seek(it->iter_arg, want);
197-
}
198-
199-
int iterator_next(struct reftable_iterator *it, struct reftable_record *rec)
200-
{
201-
return it->ops->next(it->iter_arg, rec);
202-
}
203-
204-
static int empty_iterator_seek(void *arg, struct reftable_record *want)
205-
{
206-
return 0;
207-
}
208-
209-
static int empty_iterator_next(void *arg, struct reftable_record *rec)
210-
{
211-
return 1;
212-
}
213-
214-
static void empty_iterator_close(void *arg)
215-
{
216-
}
217-
218-
static struct reftable_iterator_vtable empty_vtable = {
219-
.seek = &empty_iterator_seek,
220-
.next = &empty_iterator_next,
221-
.close = &empty_iterator_close,
222-
};
223-
224-
void iterator_set_empty(struct reftable_iterator *it)
225-
{
226-
assert(!it->ops);
227-
it->iter_arg = NULL;
228-
it->ops = &empty_vtable;
229-
}

reftable/generic.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,4 @@ void table_init_iter(struct reftable_table *tab,
2424
struct reftable_iterator *it,
2525
uint8_t typ);
2626

27-
struct reftable_iterator_vtable {
28-
int (*seek)(void *iter_arg, struct reftable_record *want);
29-
int (*next)(void *iter_arg, struct reftable_record *rec);
30-
void (*close)(void *iter_arg);
31-
};
32-
33-
void iterator_set_empty(struct reftable_iterator *it);
34-
int iterator_seek(struct reftable_iterator *it, struct reftable_record *want);
35-
int iterator_next(struct reftable_iterator *it, struct reftable_record *rec);
36-
3727
#endif

reftable/iter.c

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,43 @@ license that can be found in the LICENSE file or at
1616
#include "reader.h"
1717
#include "reftable-error.h"
1818

19+
int iterator_seek(struct reftable_iterator *it, struct reftable_record *want)
20+
{
21+
return it->ops->seek(it->iter_arg, want);
22+
}
23+
24+
int iterator_next(struct reftable_iterator *it, struct reftable_record *rec)
25+
{
26+
return it->ops->next(it->iter_arg, rec);
27+
}
28+
29+
static int empty_iterator_seek(void *arg, struct reftable_record *want)
30+
{
31+
return 0;
32+
}
33+
34+
static int empty_iterator_next(void *arg, struct reftable_record *rec)
35+
{
36+
return 1;
37+
}
38+
39+
static void empty_iterator_close(void *arg)
40+
{
41+
}
42+
43+
static struct reftable_iterator_vtable empty_vtable = {
44+
.seek = &empty_iterator_seek,
45+
.next = &empty_iterator_next,
46+
.close = &empty_iterator_close,
47+
};
48+
49+
void iterator_set_empty(struct reftable_iterator *it)
50+
{
51+
assert(!it->ops);
52+
it->iter_arg = NULL;
53+
it->ops = &empty_vtable;
54+
}
55+
1956
static void filtering_ref_iterator_close(void *iter_arg)
2057
{
2158
struct filtering_ref_iterator *fri = iter_arg;
@@ -181,3 +218,71 @@ void iterator_from_indexed_table_ref_iter(struct reftable_iterator *it,
181218
it->iter_arg = itr;
182219
it->ops = &indexed_table_ref_iter_vtable;
183220
}
221+
222+
void reftable_iterator_destroy(struct reftable_iterator *it)
223+
{
224+
if (!it->ops)
225+
return;
226+
it->ops->close(it->iter_arg);
227+
it->ops = NULL;
228+
FREE_AND_NULL(it->iter_arg);
229+
}
230+
231+
int reftable_iterator_seek_ref(struct reftable_iterator *it,
232+
const char *name)
233+
{
234+
struct reftable_record want = {
235+
.type = BLOCK_TYPE_REF,
236+
.u.ref = {
237+
.refname = (char *)name,
238+
},
239+
};
240+
return it->ops->seek(it->iter_arg, &want);
241+
}
242+
243+
int reftable_iterator_next_ref(struct reftable_iterator *it,
244+
struct reftable_ref_record *ref)
245+
{
246+
struct reftable_record rec = {
247+
.type = BLOCK_TYPE_REF,
248+
.u = {
249+
.ref = *ref
250+
},
251+
};
252+
int err = iterator_next(it, &rec);
253+
*ref = rec.u.ref;
254+
return err;
255+
}
256+
257+
int reftable_iterator_seek_log_at(struct reftable_iterator *it,
258+
const char *name, uint64_t update_index)
259+
{
260+
struct reftable_record want = {
261+
.type = BLOCK_TYPE_LOG,
262+
.u.log = {
263+
.refname = (char *)name,
264+
.update_index = update_index,
265+
},
266+
};
267+
return it->ops->seek(it->iter_arg, &want);
268+
}
269+
270+
int reftable_iterator_seek_log(struct reftable_iterator *it,
271+
const char *name)
272+
{
273+
return reftable_iterator_seek_log_at(it, name, ~((uint64_t) 0));
274+
}
275+
276+
int reftable_iterator_next_log(struct reftable_iterator *it,
277+
struct reftable_log_record *log)
278+
{
279+
struct reftable_record rec = {
280+
.type = BLOCK_TYPE_LOG,
281+
.u = {
282+
.log = *log,
283+
},
284+
};
285+
int err = iterator_next(it, &rec);
286+
*log = rec.u.log;
287+
return err;
288+
}

reftable/iter.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,33 @@ license that can be found in the LICENSE file or at
1616
#include "reftable-iterator.h"
1717
#include "reftable-generic.h"
1818

19+
/*
20+
* The virtual function table for implementing generic reftable iterators.
21+
*/
22+
struct reftable_iterator_vtable {
23+
int (*seek)(void *iter_arg, struct reftable_record *want);
24+
int (*next)(void *iter_arg, struct reftable_record *rec);
25+
void (*close)(void *iter_arg);
26+
};
27+
28+
/*
29+
* Position the iterator at the wanted record such that a call to
30+
* `iterator_next()` would return that record, if it exists.
31+
*/
32+
int iterator_seek(struct reftable_iterator *it, struct reftable_record *want);
33+
34+
/*
35+
* Yield the next record and advance the iterator. Returns <0 on error, 0 when
36+
* a record was yielded, and >0 when the iterator hit an error.
37+
*/
38+
int iterator_next(struct reftable_iterator *it, struct reftable_record *rec);
39+
40+
/*
41+
* Set up the iterator such that it behaves the same as an iterator with no
42+
* entries.
43+
*/
44+
void iterator_set_empty(struct reftable_iterator *it);
45+
1946
/* iterator that produces only ref records that point to `oid` */
2047
struct filtering_ref_iterator {
2148
struct strbuf oid;

0 commit comments

Comments
 (0)