Kohi Game Engine
stackarray.h
Go to the documentation of this file.
1 
21 #pragma once
22 
23 #include "defines.h"
24 
25 typedef struct stackarray_base {
28  void* p_data;
30 
31 typedef struct stackarray_iterator {
35  b8 (*end)(const struct stackarray_iterator* it);
36  void* (*value)(const struct stackarray_iterator* it);
37  void (*next)(struct stackarray_iterator* it);
38  void (*prev)(struct stackarray_iterator* it);
40 
47 
48 #define STACKARRAY_TYPE_NAMED(type, name, len) \
49  typedef struct stackarray_##name##_##len { \
50  stackarray_base base; \
51  type data[len]; \
52  stackarray_iterator (*begin)(stackarray_base * arr); \
53  stackarray_iterator (*rbegin)(stackarray_base * arr); \
54  } stackarray_##name##_##len; \
55  \
56  KINLINE stackarray_##name##_##len stackarray_##name##_##len##_create(void) { \
57  stackarray_##name##_##len arr; \
58  kzero_memory(&arr, sizeof(stackarray_##name##_##len)); \
59  arr.base.p_data = arr.data; \
60  arr.base.length = len; \
61  arr.base.stride = sizeof(type); \
62  arr.begin = stackarray_iterator_begin; \
63  arr.rbegin = stackarray_iterator_rbegin; \
64  return arr; \
65  } \
66  \
67  KINLINE void stackarray_##name##_##len##_destroy(stackarray_##name##_##len* arr) { \
68  kzero_memory(arr, sizeof(stackarray_##name##_##len)); \
69  arr->begin = 0; \
70  arr->rbegin = 0; \
71  }
72 
73 // Create an array type of the given type. For advanced types or pointers, use ARRAY_TYPE_NAMED directly.
74 #define STACKARRAY_TYPE(type, length) STACKARRAY_TYPE_NAMED(type, type, length)
75 
76 // EXAMPLES:
77 /*
78 // Creation of stackarray for standard/simple types:
79 STACKARRAY_TYPE(b8, 4);
80 STACKARRAY_TYPE(u8, 2);
81 STACKARRAY_TYPE(u16, 3);
82 STACKARRAY_TYPE(u32, 4);
83 STACKARRAY_TYPE(u64, 5);
84 STACKARRAY_TYPE(i8, 6);
85 STACKARRAY_TYPE(i16, 7);
86 STACKARRAY_TYPE(i32, 8);
87 STACKARRAY_TYPE(i64, 9);
88 STACKARRAY_TYPE(f32, 10);
89 STACKARRAY_TYPE(f64, 11);
90 */
91 
92 // Creation of stackarray "advanced" types, such as strings.
93 /* STACKARRAY_TYPE_NAMED(const char*, string, 4); */
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
_Bool b8
8-bit boolean type
Definition: defines.h:58
signed int i32
Signed 32-bit integer.
Definition: defines.h:39
KAPI void * stackarray_iterator_value(const stackarray_iterator *it)
KAPI stackarray_iterator stackarray_iterator_begin(stackarray_base *arr)
struct stackarray_base stackarray_base
KAPI b8 stackarray_iterator_end(const stackarray_iterator *it)
KAPI void stackarray_iterator_next(stackarray_iterator *it)
KAPI stackarray_iterator stackarray_iterator_rbegin(stackarray_base *arr)
KAPI void stackarray_iterator_prev(stackarray_iterator *it)
struct stackarray_iterator stackarray_iterator
Definition: stackarray.h:25
u32 length
Definition: stackarray.h:26
void * p_data
Definition: stackarray.h:28
u32 stride
Definition: stackarray.h:27
Definition: stackarray.h:31
void(* prev)(struct stackarray_iterator *it)
Definition: stackarray.h:38
void(* next)(struct stackarray_iterator *it)
Definition: stackarray.h:37
stackarray_base * arr
Definition: stackarray.h:32
i32 dir
Definition: stackarray.h:34
b8(* end)(const struct stackarray_iterator *it)
Definition: stackarray.h:35
i32 pos
Definition: stackarray.h:33