| | 131 | |
| | 132 | typedef struct { |
| | 133 | zend_uint size; |
| | 134 | zend_uint cnt; |
| | 135 | void *data; |
| | 136 | } xc_vector_t; |
| | 137 | |
| | 138 | #define xc_vector_init(type, vector) do { \ |
| | 139 | (vector)->cnt = 0; \ |
| | 140 | (vector)->size = 0; \ |
| | 141 | (vector)->data = NULL; \ |
| | 142 | } while (0) |
| | 143 | |
| | 144 | #define xc_vector_add(type, vector, value) do { \ |
| | 145 | if ((vector)->cnt == (vector)->size) { \ |
| | 146 | if ((vector)->size) { \ |
| | 147 | (vector)->size <<= 1; \ |
| | 148 | (vector)->data = erealloc((vector)->data, sizeof(type) * (vector)->size); \ |
| | 149 | } \ |
| | 150 | else { \ |
| | 151 | (vector)->size = 8; \ |
| | 152 | (vector)->data = emalloc(sizeof(type) * (vector)->size); \ |
| | 153 | } \ |
| | 154 | } \ |
| | 155 | ((type *) (vector)->data)[(vector)->cnt++] = value; \ |
| | 156 | } while (0) |
| | 157 | |
| | 158 | static inline void *xc_vector_detach_impl(xc_vector_t *vector) |
| | 159 | { |
| | 160 | void *data = vector->data; |
| | 161 | vector->data = NULL; |
| | 162 | vector->size = 0; |
| | 163 | vector->cnt = 0; |
| | 164 | return data; |
| | 165 | } |
| | 166 | |
| | 167 | #define xc_vector_detach(type, vector) ((type *) xc_vector_detach_impl(vector)) |
| | 168 | |
| | 169 | static inline void xc_vector_free_impl(xc_vector_t *vector TSRMLS_DC) |
| | 170 | { |
| | 171 | if (vector->data) { |
| | 172 | efree(vector->data); |
| | 173 | } |
| | 174 | vector->size = 0; |
| | 175 | vector->cnt = 0; |
| | 176 | } |
| | 177 | |
| | 178 | #define xc_vector_free(type, vector) xc_vector_free_impl(vector TSRMLS_CC) |
| | 179 | |