xref: /ext-ds/src/ds/ds_stack.h (revision 1db83fa0)
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