xref: /ext-ds/src/ds/ds_vector.h (revision 58cdc890)
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