diff options
Diffstat (limited to 'source/kit/array_ref.h')
-rw-r--r-- | source/kit/array_ref.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/source/kit/array_ref.h b/source/kit/array_ref.h new file mode 100644 index 0000000..3ca6918 --- /dev/null +++ b/source/kit/array_ref.h @@ -0,0 +1,60 @@ +#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 + +#ifndef KIT_DISABLE_SHORT_NAMES +# 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 + +#endif |