| /* |
| 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 strbuf oid; |
| struct reftable_iterator it; |
| }; |
| #define FILTERING_REF_ITERATOR_INIT \ |
| { \ |
| .oid = STRBUF_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_reader *r; |
| struct strbuf oid; |
| |
| /* mutable */ |
| uint64_t *offsets; |
| |
| /* Points to the next offset to read. */ |
| int offset_idx; |
| int offset_len; |
| struct block_reader block_reader; |
| struct block_iter cur; |
| int is_finished; |
| }; |
| |
| #define INDEXED_TABLE_REF_ITER_INIT { \ |
| .cur = BLOCK_ITER_INIT, \ |
| .oid = STRBUF_INIT, \ |
| } |
| |
| void iterator_from_indexed_table_ref_iter(struct reftable_iterator *it, |
| struct indexed_table_ref_iter *itr); |
| |
| /* Takes ownership of `offsets` */ |
| int new_indexed_table_ref_iter(struct indexed_table_ref_iter **dest, |
| struct reftable_reader *r, uint8_t *oid, |
| int oid_len, uint64_t *offsets, int offset_len); |
| |
| #endif |