1 #ifndef DS_SET_H 2 #define DS_SET_H 3 4 #include "../common.h" 5 #include "ds_htable.h" 6 7 #define DS_SET_SIZE(s) ((s)->table->size) 8 #define DS_SET_CAPACITY(s) ((s)->table->capacity) 9 #define DS_SET_IS_EMPTY(s) (DS_SET_SIZE(s) == 0) 10 11 #define DS_SET_FOREACH(set, value) DS_HTABLE_FOREACH_KEY(set->table, value) 12 #define DS_SET_FOREACH_END() DS_HTABLE_FOREACH_END() 13 14 typedef struct _ds_set_t { 15 ds_htable_t *table; 16 } ds_set_t; 17 18 ds_set_t *ds_set(); 19 ds_set_t *ds_set_ex(ds_htable_t *table); 20 ds_set_t *ds_set_clone(ds_set_t *set); 21 22 void ds_set_free(ds_set_t *set); 23 void ds_set_clear(ds_set_t *set); 24 void ds_set_allocate(ds_set_t *set, zend_long capacity); 25 26 void ds_set_add(ds_set_t *set, zval *value); 27 void ds_set_add_va(ds_set_t *set, VA_PARAMS); 28 bool ds_set_contains_va(ds_set_t *set, VA_PARAMS); 29 bool ds_set_contains(ds_set_t *set, zval *value); 30 void ds_set_remove_va(ds_set_t *set, VA_PARAMS); 31 32 void ds_set_to_array(ds_set_t *set, zval *arr); 33 void ds_set_add_all(ds_set_t *set, zval *value); 34 35 zval *ds_set_get(ds_set_t *set, zend_long index); 36 zval *ds_set_get_first(ds_set_t *set); 37 zval *ds_set_get_last(ds_set_t *set); 38 39 ds_set_t *ds_set_slice(ds_set_t *set, zend_long index, zend_long length); 40 41 void ds_set_sort_callback(ds_set_t *set); 42 void ds_set_sort(ds_set_t *set); 43 44 ds_set_t *ds_set_sorted_callback(ds_set_t *set); 45 ds_set_t *ds_set_sorted(ds_set_t *set); 46 47 void ds_set_join (ds_set_t *set, const char *glue, const size_t len, zval *return_value); 48 void ds_set_reduce(ds_set_t *set, FCI_PARAMS, zval *initial, zval *return_value); 49 50 ds_set_t *ds_set_map(ds_set_t *set, FCI_PARAMS); 51 ds_set_t *ds_set_filter_callback(ds_set_t *set, FCI_PARAMS); 52 ds_set_t *ds_set_filter(ds_set_t *set); 53 54 void ds_set_reverse (ds_set_t *set); 55 ds_set_t *ds_set_reversed(ds_set_t *set); 56 57 ds_set_t *ds_set_diff(ds_set_t *set, ds_set_t *other); 58 ds_set_t *ds_set_intersect(ds_set_t *set, ds_set_t *other); 59 ds_set_t *ds_set_xor(ds_set_t *set, ds_set_t *other); 60 ds_set_t *ds_set_union(ds_set_t *set, ds_set_t *other); 61 ds_set_t *ds_set_merge(ds_set_t *set, zval *values); 62 63 void ds_set_assign_diff(ds_set_t *set, ds_set_t *other); 64 void ds_set_assign_intersect(ds_set_t *set, ds_set_t *other); 65 void ds_set_assign_xor(ds_set_t *set, ds_set_t *other); 66 void ds_set_assign_union(ds_set_t *set, ds_set_t *other); 67 68 void ds_set_sum(ds_set_t *set, zval *return_value); 69 70 #endif 71