#ifndef UCX_ITERATOR_H
#define UCX_ITERATOR_H
#include "common.h"
#ifdef __cplusplus
extern "C" {
#endif
struct cx_iterator_base_s {
bool (*valid)(
const void *);
bool (*valid_impl)(
const void *);
void *(*current)(
const void *);
void *(*current_impl)(
const void *);
void (*next)(
void *);
void (*next_impl)(
void *);
bool allow_remove;
bool remove;
};
typedef struct cx_iterator_base_s CxIteratorBase;
#define CX_ITERATOR_BASE struct cx_iterator_base_s base
struct cx_iterator_s {
CX_ITERATOR_BASE;
void *elem_handle;
void *src_handle;
size_t index;
size_t elem_size;
size_t elem_count;
};
typedef struct cx_iterator_s CxIterator;
#define cxIteratorValid(iter) (iter).base.valid(&(iter))
#define cxIteratorCurrent(iter) (iter).base.current(&iter)
#define cxIteratorNext(iter) (iter).base.next(&iter)
#define cxIteratorFlagRemoval(iter) ((iter).base.remove = (iter).base.allow_remove)
#define cxIteratorRef(iter) &((iter).base)
#define cx_foreach(type, elem, iter) \
for (type elem; cxIteratorValid(iter) && (elem = (type)cxIteratorCurrent(iter)) !=
NULL ; cxIteratorNext(iter))
cx_attr_nodiscard
CX_EXPORT CxIterator cxIterator(
const void *array,
size_t elem_size,
size_t elem_count, bool remove_keeps_order);
cx_attr_nodiscard
CX_EXPORT CxIterator cxIteratorPtr(
const void *array,
size_t elem_count,
bool remove_keeps_order);
#ifdef __cplusplus
}
#endif
#endif