summaryrefslogtreecommitdiff
path: root/source/kit/array_ref.h
blob: 3a7244e5d66a9e1b3739b565d648fa8722d21d9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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