summaryrefslogtreecommitdiff
path: root/kit/array_ref.h
diff options
context:
space:
mode:
Diffstat (limited to 'kit/array_ref.h')
-rw-r--r--kit/array_ref.h57
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