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