diff options
Diffstat (limited to 'kit/array_ref.h')
-rw-r--r-- | kit/array_ref.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/kit/array_ref.h b/kit/array_ref.h new file mode 100644 index 0000000..3a7244e --- /dev/null +++ b/kit/array_ref.h @@ -0,0 +1,57 @@ +#ifndef KIT_ARRAY_REF_H +#define KIT_ARRAY_REF_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef i8 (*kit_ar_compare_fn)(void *left, void *right); + +i8 kit_ar_equal_bytes(i64 left_element_size, i64 left_size, + void *left_data, i64 right_element_size, + i64 right_size, void *right_data); + +i8 kit_ar_compare(i64 left_element_size, i64 left_size, + void *left_data, i64 right_element_size, + i64 right_size, void *right_data, + kit_ar_compare_fn compare); + +#define KIT_AR(type_) \ + struct { \ + i64 size; \ + type_ *values; \ + } + +#define KIT_AR_WRAP(name_, element_type_, array_) \ + struct { \ + i64 size; \ + element_type_ *values; \ + } name_ = { .size = (sizeof(array_) / sizeof((array_)[0])), \ + .values = (array_) } + +#define KIT_AR_EQUAL(left_, right_) \ + kit_ar_equal_bytes(sizeof((left_).values[0]), (left_).size, \ + (left_).values, sizeof((right_).values[0]), \ + (right_).size, (right_).values) + +#define KIT_AR_COMPARE(left_, right_, compare_) \ + kit_ar_compare(sizeof((left_).values[0]), (left_).size, \ + (left_).values, sizeof((right_).values[0]), \ + (right_).size, (right_).values, \ + (kit_ar_compare_fn) (compare_)) + +#ifdef __cplusplus +} +#endif + +#define ar_compare_fn kit_ar_compare_fn +#define ar_equal_bytes kit_ar_equal_bytes +#define ar_compare kit_ar_compare +#define AR KIT_AR +#define AR_WRAP KIT_AR_WRAP +#define AR_EQUAL KIT_AR_EQUAL +#define AR_COMPARE KIT_AR_COMPARE + +#endif |