| /* | |
| * Copyright 2020 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style | |
| * license that can be found in the LICENSE file or at | |
| * https://developers.google.com/open-source/licenses/bsd | |
| */ | |
| #ifndef ITER_H | |
| #define ITER_H | |
| #include "system.h" | |
| #include "block.h" | |
| #include "record.h" | |
| #include "reftable-iterator.h" | |
| /* | |
| * The virtual function table for implementing generic reftable iterators. | |
| */ | |
| struct reftable_iterator_vtable { | |
| int (*seek)(void *iter_arg, struct reftable_record *want); | |
| int (*next)(void *iter_arg, struct reftable_record *rec); | |
| void (*close)(void *iter_arg); | |
| }; | |
| /* | |
| * Position the iterator at the wanted record such that a call to | |
| * `iterator_next()` would return that record, if it exists. | |
| */ | |
| int iterator_seek(struct reftable_iterator *it, struct reftable_record *want); | |
| /* | |
| * Yield the next record and advance the iterator. Returns <0 on error, 0 when | |
| * a record was yielded, and >0 when the iterator hit an error. | |
| */ | |
| int iterator_next(struct reftable_iterator *it, struct reftable_record *rec); | |
| /* | |
| * Set up the iterator such that it behaves the same as an iterator with no | |
| * entries. | |
| */ | |
| void iterator_set_empty(struct reftable_iterator *it); | |
| /* iterator that produces only ref records that point to `oid` */ | |
| struct filtering_ref_iterator { | |
| struct reftable_buf oid; | |
| struct reftable_iterator it; | |
| }; | |
| #define FILTERING_REF_ITERATOR_INIT \ | |
| { \ | |
| .oid = REFTABLE_BUF_INIT \ | |
| } | |
| void iterator_from_filtering_ref_iterator(struct reftable_iterator *, | |
| struct filtering_ref_iterator *); | |
| /* iterator that produces only ref records that point to `oid`, | |
| * but using the object index. | |
| */ | |
| struct indexed_table_ref_iter { | |
| struct reftable_table *table; | |
| struct reftable_buf oid; | |
| /* mutable */ | |
| uint64_t *offsets; | |
| /* Points to the next offset to read. */ | |
| int offset_idx; | |
| int offset_len; | |
| struct reftable_block block; | |
| struct block_iter cur; | |
| int is_finished; | |
| }; | |
| #define INDEXED_TABLE_REF_ITER_INIT { \ | |
| .cur = BLOCK_ITER_INIT, \ | |
| .oid = REFTABLE_BUF_INIT, \ | |
| } | |
| void iterator_from_indexed_table_ref_iter(struct reftable_iterator *it, | |
| struct indexed_table_ref_iter *itr); | |
| /* Takes ownership of `offsets` */ | |
| int indexed_table_ref_iter_new(struct indexed_table_ref_iter **dest, | |
| struct reftable_table *t, uint8_t *oid, | |
| int oid_len, uint64_t *offsets, int offset_len); | |
| #endif |