1 #ifndef DS_STACK_H 2 #define DS_STACK_H 3 4 #include "../common.h" 5 #include "ds_vector.h" 6 7 #define DS_STACK_SIZE(s) ((s)->vector->size) 8 #define DS_STACK_CAPACITY(s) ((s)->vector->capacity) 9 #define DS_STACK_IS_EMPTY(s) (DS_STACK_SIZE(s) == 0) 10 11 #define DS_STACK_FOREACH(stack, value) \ 12 do { \ 13 zval _tmp; \ 14 \ 15 ds_vector_t *_v = stack->vector; \ 16 zval *_end = _v->buffer; \ 17 zval *_pos = _end + _v->size - 1; \ 18 \ 19 for (; _pos >= _end; --_pos, --_v->size) { \ 20 ZVAL_COPY(&_tmp, _pos); \ 21 zval_ptr_dtor(_pos); \ 22 value = &_tmp; 23 24 #define DS_STACK_FOREACH_END() \ 25 } \ 26 zval_ptr_dtor(&_tmp); \ 27 } while (0) \ 28 29 typedef struct _ds_stack_t { 30 ds_vector_t *vector; 31 } ds_stack_t; 32 33 ds_stack_t *ds_stack(); 34 ds_stack_t *ds_stack_ex(ds_vector_t *vector); 35 ds_stack_t *ds_stack_clone(ds_stack_t *stack); 36 37 void ds_stack_push(ds_stack_t *stack, zval *value); 38 void ds_stack_push_va(ds_stack_t *stack, VA_PARAMS); 39 void ds_stack_allocate(ds_stack_t *stack, zend_long capacity); 40 void ds_stack_clear(ds_stack_t *stack); 41 void ds_stack_pop(ds_stack_t *stack, zval *return_value); 42 void ds_stack_pop_throw(ds_stack_t *stack, zval *return_value); 43 zval *ds_stack_peek(ds_stack_t *stack); 44 zval *ds_stack_peek_throw(ds_stack_t *stack); 45 void ds_stack_push_all(ds_stack_t *stack, zval *value); 46 void ds_stack_to_array(ds_stack_t *stack, zval *return_value); 47 void ds_stack_free(ds_stack_t *stack); 48 49 #endif 50