Kohi Game Engine
array.h
Go to the documentation of this file.
1 
20 #pragma once
21 
22 #include "defines.h"
23 
24 KAPI void _karray_init(u32 length, u32 stride, u32* out_length, u32* out_stride, void** block);
25 KAPI void _karray_free(u32* length, u32* stride, void** block);
26 
27 typedef struct array_base {
30  void* p_data;
32 
33 typedef struct array_iterator {
34  const array_base* arr;
37  b8 (*end)(const struct array_iterator* it);
38  void* (*value)(const struct array_iterator* it);
39  void (*next)(struct array_iterator* it);
40  void (*prev)(struct array_iterator* it);
42 
49 
50 #define ARRAY_TYPE_NAMED(type, name) \
51  struct array_##name; \
52  typedef struct array_##name { \
53  array_base base; \
54  type* data; \
55  array_iterator (*begin)(const array_base* arr); \
56  array_iterator (*rbegin)(const array_base* arr); \
57  } array_##name; \
58  \
59  KINLINE type* array_##name##_it_value(const array_iterator* it) { return &((array_##name*)it->arr)->data[it->pos]; } \
60  \
61  KINLINE array_##name array_##name##_create(u32 length) { \
62  array_##name arr; \
63  _karray_init(length, sizeof(type), &arr.base.length, &arr.base.stride, (void**)&arr.data); \
64  arr.base.p_data = (void*)arr.data; \
65  arr.begin = array_iterator_begin; \
66  arr.rbegin = array_iterator_rbegin; \
67  return arr; \
68  } \
69  \
70  KINLINE void array_##name##_destroy(array_##name* arr) { \
71  if (arr) { \
72  _karray_free(&arr->base.length, &arr->base.stride, (void**)&arr->data); \
73  arr->begin = 0; \
74  arr->rbegin = 0; \
75  } \
76  }
77 
81 #define ARRAY_TYPE(type) ARRAY_TYPE_NAMED(type, type)
82 
83 // Create array types for well-known types
84 
86 
91 
96 
99 
100 // Create array types for well-known "advanced" types, such as strings.
101 
102 ARRAY_TYPE_NAMED(const char*, string);
KAPI void * array_iterator_value(const array_iterator *it)
KAPI array_iterator array_iterator_begin(const array_base *arr)
KAPI void _karray_free(u32 *length, u32 *stride, void **block)
KAPI void array_iterator_prev(array_iterator *it)
KAPI b8 array_iterator_end(const array_iterator *it)
KAPI void _karray_init(u32 length, u32 stride, u32 *out_length, u32 *out_stride, void **block)
KAPI void array_iterator_next(array_iterator *it)
KAPI array_iterator array_iterator_rbegin(const array_base *arr)
#define ARRAY_TYPE(type)
Create an array type of the given type. For advanced types or pointers, use ARRAY_TYPE_NAMED directly...
Definition: array.h:81
struct array_base array_base
struct array_iterator array_iterator
#define ARRAY_TYPE_NAMED(type, name)
Definition: array.h:50
This file contains global type definitions which are used throughout the entire engine and applicatio...
#define KAPI
Import/export qualifier.
Definition: defines.h:205
unsigned int u32
Unsigned 32-bit integer.
Definition: defines.h:25
signed char i8
Signed 8-bit integer.
Definition: defines.h:33
_Bool b8
8-bit boolean type
Definition: defines.h:58
float f32
32-bit floating point number
Definition: defines.h:47
double f64
64-bit floating point number
Definition: defines.h:50
signed int i32
Signed 32-bit integer.
Definition: defines.h:39
unsigned short u16
Unsigned 16-bit integer.
Definition: defines.h:22
signed short i16
Signed 16-bit integer.
Definition: defines.h:36
unsigned long long u64
Unsigned 64-bit integer.
Definition: defines.h:28
signed long long i64
Signed 64-bit integer.
Definition: defines.h:42
unsigned char u8
Unsigned 8-bit integer.
Definition: defines.h:19
Definition: array.h:27
u32 length
Definition: array.h:28
void * p_data
Definition: array.h:30
u32 stride
Definition: array.h:29
Definition: array.h:33
const array_base * arr
Definition: array.h:34
void(* next)(struct array_iterator *it)
Definition: array.h:39
b8(* end)(const struct array_iterator *it)
Definition: array.h:37
i32 dir
Definition: array.h:36
void(* prev)(struct array_iterator *it)
Definition: array.h:40
i32 pos
Definition: array.h:35