1 #ifndef DS_VECTOR_H 2 #define DS_VECTOR_H 3 4 #include "../common.h" 5 6 typedef struct ds_vector { 7 zval *buffer; 8 zend_long capacity; // Buffer length 9 zend_long size; // Number of values in the buffer 10 } ds_vector_t; 11 12 #define DS_VECTOR_MIN_CAPACITY 8 // Does not have to be a power of 2 13 14 #define DS_VECTOR_SIZE(v) ((v)->size) 15 #define DS_VECTOR_IS_EMPTY(v) (DS_VECTOR_SIZE(v) == 0) 16 17 /** 18 * Foreach value 19 */ 20 #define DS_VECTOR_FOREACH(v, z) \ 21 do { \ 22 zval *x = v->buffer; \ 23 zval *y = x + v->size; \ 24 for (; x < y; ++x) { \ 25 z = x; 26 27 /** 28 * Foreach value from back to front 29 */ 30 #define DS_VECTOR_FOREACH_REVERSED(v, z) \ 31 do { \ 32 zval *y = v->buffer; \ 33 zval *x = y + v->size - 1; \ 34 for (; x >= y; --x) { \ 35 z = x; 36 37 /** 38 * Call this after DS_VECTOR_FOREACH* 39 */ 40 #define DS_VECTOR_FOREACH_END() \ 41 } \ 42 } while (0) 43 44 ds_vector_t *ds_vector_clone(ds_vector_t *src); 45 ds_vector_t *ds_vector(); 46 ds_vector_t *ds_vector_ex(zend_long capacity); 47 ds_vector_t *ds_vector_from_buffer(zval *buffer, zend_long capacity, zend_long size); 48 49 void ds_vector_allocate(ds_vector_t *vector, zend_long capacity); 50 51 void ds_vector_clear(ds_vector_t *vector); 52 void ds_vector_free(ds_vector_t *vector); 53 54 void ds_vector_set(ds_vector_t *vector, zend_long index, zval *value); 55 void ds_vector_pop(ds_vector_t *vector, zval *return_value); 56 void ds_vector_pop_throw(ds_vector_t *vector, zval *return_value); 57 void ds_vector_shift(ds_vector_t *vector, zval *return_value); 58 void ds_vector_shift_throw(ds_vector_t *vector, zval *return_value); 59 void ds_vector_find(ds_vector_t *vector, zval *value, zval *return_value); 60 void ds_vector_remove(ds_vector_t *vector, zend_long index, zval *return_value); 61 62 void ds_vector_insert(ds_vector_t *vector, zend_long index, zval *value); 63 void ds_vector_insert_va(ds_vector_t *vector, zend_long index, VA_PARAMS); 64 65 void ds_vector_unshift(ds_vector_t *vector, zval *value); 66 void ds_vector_unshift_va(ds_vector_t *vector, VA_PARAMS); 67 68 bool ds_vector_contains(ds_vector_t *vector, zval *value); 69 bool ds_vector_contains_va(ds_vector_t *vector, VA_PARAMS); 70 71 void ds_vector_push(ds_vector_t *vector, zval *value); 72 void ds_vector_push_va(ds_vector_t *vector, VA_PARAMS); 73 void ds_vector_push_all(ds_vector_t *vector, zval *values); 74 75 zval *ds_vector_get(ds_vector_t *vector, zend_long index); 76 zval *ds_vector_get_last(ds_vector_t *vector); 77 zval *ds_vector_get_first(ds_vector_t *vector); 78 zval *ds_vector_get_last_throw(ds_vector_t *vector); 79 zval *ds_vector_get_first_throw(ds_vector_t *vector); 80 81 ds_vector_t *ds_vector_map(ds_vector_t *vector, FCI_PARAMS); 82 ds_vector_t *ds_vector_slice(ds_vector_t *vector, zend_long index, zend_long length); 83 ds_vector_t *ds_vector_filter(ds_vector_t *vector); 84 ds_vector_t *ds_vector_filter_callback(ds_vector_t *vector, FCI_PARAMS); 85 ds_vector_t *ds_vector_merge(ds_vector_t *vector, zval *values); 86 ds_vector_t *ds_vector_reversed(ds_vector_t *vector); 87 88 void ds_vector_reduce(ds_vector_t *vector, zval *initial, zval *return_value, FCI_PARAMS); 89 void ds_vector_reverse(ds_vector_t *vector); 90 void ds_vector_rotate(ds_vector_t *vector, zend_long rotations); 91 void ds_vector_join(ds_vector_t *vector, char *str, size_t len, zval *return_value); 92 void ds_vector_apply(ds_vector_t *vector, FCI_PARAMS); 93 94 void ds_vector_sum(ds_vector_t *vector, zval *return_value); 95 96 void ds_vector_sort(ds_vector_t *vector); 97 void ds_vector_sort_callback(ds_vector_t *vector); 98 99 void ds_vector_to_array(ds_vector_t *vector, zval *return_value); 100 101 bool ds_vector_index_exists(ds_vector_t *vector, zend_long index); 102 bool ds_vector_isset(ds_vector_t *vector, zend_long index, int check_empty); 103 104 #endif 105