php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
array_obj.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
8
9
12{
13 return lexbor_calloc(1, sizeof(lexbor_array_obj_t));
14}
15
18 size_t size, size_t struct_size)
19{
20 if (array == NULL) {
22 }
23
24 if (size == 0 || struct_size == 0) {
26 }
27
28 array->length = 0;
29 array->size = size;
30 array->struct_size = struct_size;
31
32 array->list = lexbor_malloc(sizeof(uint8_t *)
33 * (array->size * struct_size));
34 if (array->list == NULL) {
36 }
37
38 return LXB_STATUS_OK;
39}
40
41void
43{
44 if (array != NULL) {
45 array->length = 0;
46 }
47}
48
51{
52 if (array == NULL)
53 return NULL;
54
55 if (array->list) {
56 array->length = 0;
57 array->size = 0;
58 array->list = lexbor_free(array->list);
59 }
60
61 if (self_destroy) {
62 return lexbor_free(array);
63 }
64
65 return array;
66}
67
68uint8_t *
70{
71 uint8_t *list;
72 size_t new_size;
73
74 if (array->length > (SIZE_MAX - up_to)) {
75 return NULL;
76 }
77
78 new_size = array->length + up_to;
79
80 list = lexbor_realloc(array->list, sizeof(uint8_t *)
81 * (new_size * array->struct_size));
82 if (list == NULL) {
83 return NULL;
84 }
85
86 array->list = list;
87 array->size = new_size;
88
89 return list;
90}
91
92void *
94{
95 void *entry;
96
97 if (array->length >= array->size)
98 {
99 if ((lexbor_array_obj_expand(array, 128) == NULL)) {
100 return NULL;
101 }
102 }
103
104 entry = array->list + (array->length * array->struct_size);
105 array->length++;
106
107 memset(entry, 0, array->struct_size);
108
109 return entry;
110}
111
112void *
114{
115 void *entry;
116
117 if (array->length >= array->size) {
118 if ((lexbor_array_obj_expand(array, 128) == NULL)) {
119 return NULL;
120 }
121 }
122
123 entry = array->list + (array->length * array->struct_size);
124 array->length++;
125
126 return entry;
127}
128
129void *
131{
132 void *entry;
133
134 if ((array->length + count) > array->size) {
135 if ((lexbor_array_obj_expand(array, count + 128) == NULL)) {
136 return NULL;
137 }
138 }
139
140 entry = array->list + (array->length * array->struct_size);
141 array->length += count;
142
143 return entry;
144}
145
146void *
148{
149 if (array->length == 0) {
150 return NULL;
151 }
152
153 array->length--;
154 return array->list + (array->length * array->struct_size);
155}
156
157void
159{
160 if (begin >= array->length || length == 0) {
161 return;
162 }
163
164 size_t end_len = begin + length;
165
166 if (end_len >= array->length) {
167 array->length = begin;
168 return;
169 }
170
171 memmove(&array->list[ begin * array->struct_size ],
172 &array->list[ end_len * array->struct_size ],
173 sizeof(uint8_t *)
174 * ((array->length - end_len) * array->struct_size));
175
176 array->length -= length;
177}
178
179/*
180 * No inline functions.
181 */
182void
187
188void *
190{
191 return lexbor_array_obj_get(array, idx);
192}
193
194size_t
199
200size_t
205
206size_t
211
212void *
void * lexbor_array_obj_get_noi(lexbor_array_obj_t *array, size_t idx)
Definition array_obj.c:189
size_t lexbor_array_obj_size_noi(lexbor_array_obj_t *array)
Definition array_obj.c:201
void * lexbor_array_obj_pop(lexbor_array_obj_t *array)
Definition array_obj.c:147
size_t lexbor_array_obj_length_noi(lexbor_array_obj_t *array)
Definition array_obj.c:195
void * lexbor_array_obj_push(lexbor_array_obj_t *array)
Definition array_obj.c:93
uint8_t * lexbor_array_obj_expand(lexbor_array_obj_t *array, size_t up_to)
Definition array_obj.c:69
void lexbor_array_obj_delete(lexbor_array_obj_t *array, size_t begin, size_t length)
Definition array_obj.c:158
void lexbor_array_obj_clean(lexbor_array_obj_t *array)
Definition array_obj.c:42
void * lexbor_array_obj_push_wo_cls(lexbor_array_obj_t *array)
Definition array_obj.c:113
void * lexbor_array_obj_last_noi(lexbor_array_obj_t *array)
Definition array_obj.c:213
lexbor_array_obj_t * lexbor_array_obj_create(void)
Definition array_obj.c:11
lxb_status_t lexbor_array_obj_init(lexbor_array_obj_t *array, size_t size, size_t struct_size)
Definition array_obj.c:17
size_t lexbor_array_obj_struct_size_noi(lexbor_array_obj_t *array)
Definition array_obj.c:207
void lexbor_array_obj_erase_noi(lexbor_array_obj_t *array)
Definition array_obj.c:183
void * lexbor_array_obj_push_n(lexbor_array_obj_t *array, size_t count)
Definition array_obj.c:130
lexbor_array_obj_t * lexbor_array_obj_destroy(lexbor_array_obj_t *array, bool self_destroy)
Definition array_obj.c:50
lxb_inline void lexbor_array_obj_erase(lexbor_array_obj_t *array)
Definition array_obj.h:64
lxb_inline size_t lexbor_array_obj_struct_size(lexbor_array_obj_t *array)
Definition array_obj.h:92
lxb_inline size_t lexbor_array_obj_length(lexbor_array_obj_t *array)
Definition array_obj.h:80
lxb_inline size_t lexbor_array_obj_size(lexbor_array_obj_t *array)
Definition array_obj.h:86
lxb_inline void * lexbor_array_obj_get(const lexbor_array_obj_t *array, size_t idx)
Definition array_obj.h:70
lxb_inline void * lexbor_array_obj_last(lexbor_array_obj_t *array)
Definition array_obj.h:98
count(Countable|array $value, int $mode=COUNT_NORMAL)
@ LXB_STATUS_ERROR_MEMORY_ALLOCATION
Definition base.h:51
@ LXB_STATUS_ERROR_OBJECT_IS_NULL
Definition base.h:52
@ LXB_STATUS_OK
Definition base.h:49
@ LXB_STATUS_ERROR_TOO_SMALL_SIZE
Definition base.h:56
int begin
Definition eaw_table.h:20
new_type size
Definition ffi.c:4365
memset(ptr, 0, type->size)
#define SIZE_MAX
Definition funcs.c:51
#define NULL
Definition gdcache.h:45
LXB_API void * lexbor_realloc(void *dst, size_t size)
Definition memory.c:21
LXB_API void * lexbor_free(void *dst)
Definition memory.c:33
LXB_API void * lexbor_malloc(size_t size)
Definition memory.c:15
LXB_API void * lexbor_calloc(size_t num, size_t size)
Definition memory.c:27
#define memmove(a, b, c)
unsigned int lxb_status_t
Definition types.h:28