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