xref: /php-src/ext/dom/lexbor/lexbor/core/array_obj.h (revision bffab33a)
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