1 /*
2 * Copyright (C) 2018 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7 #ifndef LEXBOR_ARRAY_OBJ_H
8 #define LEXBOR_ARRAY_OBJ_H
9
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13
14 #include "lexbor/core/base.h"
15
16
17 typedef struct {
18 uint8_t *list;
19 size_t size;
20 size_t length;
21 size_t struct_size;
22 }
23 lexbor_array_obj_t;
24
25
26 LXB_API lexbor_array_obj_t *
27 lexbor_array_obj_create(void);
28
29 LXB_API lxb_status_t
30 lexbor_array_obj_init(lexbor_array_obj_t *array,
31 size_t size, size_t struct_size);
32
33 LXB_API void
34 lexbor_array_obj_clean(lexbor_array_obj_t *array);
35
36 LXB_API lexbor_array_obj_t *
37 lexbor_array_obj_destroy(lexbor_array_obj_t *array, bool self_destroy);
38
39
40 LXB_API uint8_t *
41 lexbor_array_obj_expand(lexbor_array_obj_t *array, size_t up_to);
42
43
44 LXB_API void *
45 lexbor_array_obj_push(lexbor_array_obj_t *array);
46
47 LXB_API void *
48 lexbor_array_obj_push_wo_cls(lexbor_array_obj_t *array);
49
50 LXB_API void *
51 lexbor_array_obj_push_n(lexbor_array_obj_t *array, size_t count);
52
53 LXB_API void *
54 lexbor_array_obj_pop(lexbor_array_obj_t *array);
55
56 LXB_API void
57 lexbor_array_obj_delete(lexbor_array_obj_t *array, size_t begin, size_t length);
58
59
60 /*
61 * Inline functions
62 */
63 lxb_inline void
lexbor_array_obj_erase(lexbor_array_obj_t * array)64 lexbor_array_obj_erase(lexbor_array_obj_t *array)
65 {
66 memset(array, 0, sizeof(lexbor_array_obj_t));
67 }
68
69 lxb_inline void *
lexbor_array_obj_get(const lexbor_array_obj_t * array,size_t idx)70 lexbor_array_obj_get(const lexbor_array_obj_t *array, size_t idx)
71 {
72 if (idx >= array->length) {
73 return NULL;
74 }
75
76 return array->list + (idx * array->struct_size);
77 }
78
79 lxb_inline size_t
lexbor_array_obj_length(lexbor_array_obj_t * array)80 lexbor_array_obj_length(lexbor_array_obj_t *array)
81 {
82 return array->length;
83 }
84
85 lxb_inline size_t
lexbor_array_obj_size(lexbor_array_obj_t * array)86 lexbor_array_obj_size(lexbor_array_obj_t *array)
87 {
88 return array->size;
89 }
90
91 lxb_inline size_t
lexbor_array_obj_struct_size(lexbor_array_obj_t * array)92 lexbor_array_obj_struct_size(lexbor_array_obj_t *array)
93 {
94 return array->struct_size;
95 }
96
97 lxb_inline void *
lexbor_array_obj_last(lexbor_array_obj_t * array)98 lexbor_array_obj_last(lexbor_array_obj_t *array)
99 {
100 if (array->length == 0) {
101 return NULL;
102 }
103
104 return array->list + ((array->length - 1) * array->struct_size);
105 }
106
107
108 /*
109 * No inline functions for ABI.
110 */
111 LXB_API void
112 lexbor_array_obj_erase_noi(lexbor_array_obj_t *array);
113
114 LXB_API void *
115 lexbor_array_obj_get_noi(lexbor_array_obj_t *array, size_t idx);
116
117 LXB_API size_t
118 lexbor_array_obj_length_noi(lexbor_array_obj_t *array);
119
120 LXB_API size_t
121 lexbor_array_obj_size_noi(lexbor_array_obj_t *array);
122
123 LXB_API size_t
124 lexbor_array_obj_struct_size_noi(lexbor_array_obj_t *array);
125
126 LXB_API void *
127 lexbor_array_obj_last_noi(lexbor_array_obj_t *array);
128
129
130 #ifdef __cplusplus
131 } /* extern "C" */
132 #endif
133
134 #endif /* LEXBOR_ARRAY_OBJ_H */
135