/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _BCACHEFS_KEYLIST_H
#define _BCACHEFS_KEYLIST_H

#include "keylist_types.h"

int bch2_keylist_realloc(struct keylist *, u64 *, size_t, size_t);
void bch2_keylist_pop_front(struct keylist *);

static inline void bch2_keylist_init(struct keylist *l, u64 *inline_keys)
{
	l->top_p = l->keys_p = inline_keys;
}

static inline void bch2_keylist_free(struct keylist *l, u64 *inline_keys)
{
	if (l->keys_p != inline_keys)
		kfree(l->keys_p);
}

static inline void bch2_keylist_push(struct keylist *l)
{
	l->top = bkey_next(l->top);
}

static inline void bch2_keylist_add(struct keylist *l, const struct bkey_i *k)
{
	bkey_copy(l->top, k);
	bch2_keylist_push(l);
}

static inline bool bch2_keylist_empty(struct keylist *l)
{
	return l->top == l->keys;
}

static inline size_t bch2_keylist_u64s(struct keylist *l)
{
	return l->top_p - l->keys_p;
}

static inline size_t bch2_keylist_bytes(struct keylist *l)
{
	return bch2_keylist_u64s(l) * sizeof(u64);
}

static inline struct bkey_i *bch2_keylist_front(struct keylist *l)
{
	return l->keys;
}

#define for_each_keylist_key(_keylist, _k)			\
	for (struct bkey_i *_k = (_keylist)->keys;		\
	     _k != (_keylist)->top;				\
	     _k = bkey_next(_k))

static inline u64 keylist_sectors(struct keylist *keys)
{
	u64 ret = 0;

	for_each_keylist_key(keys, k)
		ret += k->k.size;
	return ret;
}

#ifdef CONFIG_BCACHEFS_DEBUG
void bch2_verify_keylist_sorted(struct keylist *);
#else
static inline void bch2_verify_keylist_sorted(struct keylist *l) {}
#endif

#endif /* _BCACHEFS_KEYLIST_H */
