summaryrefslogtreecommitdiff
path: root/source/kit/array_ref.h
diff options
context:
space:
mode:
authorMitya Selivanov <0x7fffff@guattari.ru>2022-08-06 16:32:59 +0400
committerMitya Selivanov <0x7fffff@guattari.ru>2022-08-06 16:32:59 +0400
commitf2fb8311d373cfd498dfbebc539982b8ad174615 (patch)
tree21cbc87cc5fb9ca3e75582ff2920aa83213617e4 /source/kit/array_ref.h
parent1bf74ae58678cd91b95ccda6087be7ca0a452eee (diff)
downloadkit-f2fb8311d373cfd498dfbebc539982b8ad174615.zip
input buffer, dynamic array
Diffstat (limited to 'source/kit/array_ref.h')
-rw-r--r--source/kit/array_ref.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/source/kit/array_ref.h b/source/kit/array_ref.h
new file mode 100644
index 0000000..649af8b
--- /dev/null
+++ b/source/kit/array_ref.h
@@ -0,0 +1,61 @@
+#ifndef KIT_ARRAY_REF_H
+#define KIT_ARRAY_REF_H
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef int (*ar_compare_fn)(void const *left, void const *right);
+
+_Bool ar_equal_bytes(ptrdiff_t left_element_size, ptrdiff_t left_size,
+ void const *left_data,
+ ptrdiff_t right_element_size,
+ ptrdiff_t right_size, void const *right_data);
+
+int ar_compare(ptrdiff_t left_element_size, ptrdiff_t left_size,
+ void const *left_data, ptrdiff_t right_element_size,
+ ptrdiff_t right_size, void const *right_data,
+ ar_compare_fn compare);
+
+#define AR(name_, type_) \
+ struct { \
+ ptrdiff_t size; \
+ type_ *values; \
+ } name_
+
+#define AR_CONST(name_, type_) \
+ struct { \
+ ptrdiff_t size; \
+ type_ const *values; \
+ } name_
+
+#define AR_TYPE(name_, element_type_) \
+ struct name_ { \
+ ptrdiff_t size; \
+ element_type_ *values; \
+ }
+
+#define AR_TYPE_CONST(name_, element_type_) \
+ struct name_ { \
+ ptrdiff_t size; \
+ element_type_ const *values; \
+ }
+
+#define AR_EQUAL(left_, right_) \
+ ar_equal_bytes(sizeof((left_).values[0]), (left_).size, \
+ (left_).values, sizeof((right_).values[0]), \
+ (right_).size, (right_).values)
+
+#define AR_COMPARE(left_, right_, compare_) \
+ ar_compare(sizeof((left_).values[0]), (left_).size, \
+ (left_).values, sizeof((right_).values[0]), \
+ (right_).size, (right_).values, \
+ (ar_compare_fn) (compare_))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif