bcachefs: add eytzinger0_for_each_prev

Add an eytzinger0_for_each_prev() macro for iterating through an
eytzinger array in reverse.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Andreas Gruenbacher 2025-01-27 17:26:05 +01:00 committed by Kent Overstreet
parent e8a0966ffa
commit dc5ceaaad8
2 changed files with 14 additions and 0 deletions

View File

@ -244,6 +244,11 @@ static inline unsigned inorder_to_eytzinger0(unsigned i, unsigned size)
(_i) != -1; \
(_i) = eytzinger0_next((_i), (_size)))
#define eytzinger0_for_each_prev(_i, _size) \
for (unsigned (_i) = eytzinger0_last((_size)); \
(_i) != -1; \
(_i) = eytzinger0_prev((_i), (_size)))
/* return greatest node <= @search, or -1 if not found */
static inline int eytzinger0_find_le(void *base, size_t nr, size_t size,
cmp_func_t cmp, const void *search)

View File

@ -769,6 +769,15 @@ void eytzinger0_test(void)
inorder++;
}
BUG_ON(inorder != size);
inorder = size - 1;
eytzinger0_for_each_prev(eytz, size) {
BUG_ON(eytz != eytzinger0_first(size) &&
eytzinger0_next(eytzinger0_prev(eytz, size), size) != eytz);
inorder--;
}
BUG_ON(inorder != -1);
}
}