1 #include "php_common_handlers.h"
2 #include "php_deque_handlers.h"
3
4 #include "../objects/php_queue.h"
5 #include "../../ds/ds_queue.h"
6
7 zend_object_handlers php_queue_handlers;
8
9
php_ds_queue_write_dimension(zend_object * obj,zval * offset,zval * value)10 static void php_ds_queue_write_dimension
11 #if PHP_VERSION_ID >= 80000
12 (zend_object *obj, zval *offset, zval *value) {
13 ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue;
14 #else
15 (zval *obj, zval *offset, zval *value) {
16 ds_queue_t *queue = Z_DS_QUEUE_P(obj);
17 #endif
18 if (offset == NULL) {
19 ds_queue_push_one(queue, value);
20 return;
21 }
22 ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED();
23 }
24
25 static void php_ds_queue_free_object(zend_object *object)
26 {
27 php_ds_queue_t *queue = php_ds_queue_fetch_object(object);
28 ds_queue_free(queue->queue);
29 zend_object_std_dtor(&queue->std);
30 }
31
32 static int php_ds_queue_count_elements
33 #if PHP_VERSION_ID >= 80000
34 (zend_object *obj, zend_long *count) {
35 ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue;
36 #else
37 (zval *obj, zend_long *count) {
38 ds_queue_t *queue = Z_DS_QUEUE_P(obj);
39 #endif
40 *count = QUEUE_SIZE(queue);
41 return SUCCESS;
42 }
43
44 static zend_object *php_ds_queue_clone_obj
45 #if PHP_VERSION_ID >= 80000
46 (zend_object *obj) {
47 ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue;
48 #else
49 (zval *obj) {
50 ds_queue_t *queue = Z_DS_QUEUE_P(obj);
51 #endif
52 return php_ds_queue_create_clone(queue);
53 }
54
55 static HashTable *php_ds_queue_get_debug_info
56 #if PHP_VERSION_ID >= 80000
57 (zend_object *obj, int *is_temp) {
58 ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue;
59 #else
60 (zval *obj, int *is_temp) {
61 ds_queue_t *queue = Z_DS_QUEUE_P(obj);
62 #endif
63 zval arr;
64 *is_temp = 1;
65 ds_queue_to_array(queue, &arr);
66 return Z_ARRVAL(arr);
67 }
68
69 static HashTable *php_ds_queue_get_gc
70 #if PHP_VERSION_ID >= 80000
71 (zend_object *obj, zval **gc_data, int *gc_count) {
72 ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue;
73 #else
74 (zval *obj, zval **gc_data, int *gc_count) {
75 ds_queue_t *queue = Z_DS_QUEUE_P(obj);
76 #endif
77 ds_deque_t *deque = queue->deque;
78
79 *gc_data = deque->buffer;
80 *gc_count = deque->head == 0 ? deque->size : deque->capacity;
81 return NULL;
82 }
83
84 void php_ds_register_queue_handlers()
85 {
86 memcpy(&php_queue_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
87
88 php_queue_handlers.offset = XtOffsetOf(php_ds_queue_t, std);
89
90 php_queue_handlers.dtor_obj = zend_objects_destroy_object;
91 php_queue_handlers.get_gc = php_ds_queue_get_gc;
92 php_queue_handlers.free_obj = php_ds_queue_free_object;
93 php_queue_handlers.clone_obj = php_ds_queue_clone_obj;
94 php_queue_handlers.cast_object = php_ds_default_cast_object;
95 php_queue_handlers.get_debug_info = php_ds_queue_get_debug_info;
96 php_queue_handlers.count_elements = php_ds_queue_count_elements;
97 php_queue_handlers.write_dimension = php_ds_queue_write_dimension;
98 php_queue_handlers.read_dimension = php_ds_read_dimension_by_key_not_supported;
99 php_queue_handlers.unset_dimension = php_ds_unset_dimension_by_key_not_supported;
100 php_queue_handlers.has_dimension = php_ds_has_dimension_by_key_not_supported;
101 }
102