/*
 * 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
