xref: /ext-ds/src/php/objects/php_map.c (revision 8595b29f)
1 #include "../handlers/php_map_handlers.h"
2 #include "../classes/php_map_ce.h"
3 
4 #include "php_map.h"
5 #include "php_pair.h"
6 
php_ds_map_create_object_ex(ds_map_t * map)7 zend_object *php_ds_map_create_object_ex(ds_map_t *map)
8 {
9 #if PHP_VERSION_ID < 70300
10     php_ds_map_t *obj = ecalloc(1, sizeof(php_ds_map_t) + zend_object_properties_size(php_ds_map_ce));
11 #else
12     php_ds_map_t *obj = zend_object_alloc(sizeof(php_ds_map_t), php_ds_map_ce);
13 #endif
14     zend_object_std_init(&obj->std, php_ds_map_ce);
15     obj->std.handlers = &php_map_handlers;
16     obj->map = map;
17     return &obj->std;
18 }
19 
php_ds_map_create_object(zend_class_entry * ce)20 zend_object *php_ds_map_create_object(zend_class_entry *ce)
21 {
22     return php_ds_map_create_object_ex(ds_map());
23 }
24 
php_ds_map_create_clone(ds_map_t * map)25 zend_object *php_ds_map_create_clone(ds_map_t *map)
26 {
27     return php_ds_map_create_object_ex(ds_map_clone(map));
28 }
29 
ds_map_pairs_to_php_hashtable(ds_map_t * map)30 HashTable *ds_map_pairs_to_php_hashtable(ds_map_t *map)
31 {
32     HashTable *array;
33 
34     zval *key;
35     zval *value;
36 
37     zval pair;
38 
39     ALLOC_HASHTABLE(array);
40     zend_hash_init(array, DS_MAP_SIZE(map), NULL, ZVAL_PTR_DTOR, 0);
41 
42     DS_HTABLE_FOREACH_KEY_VALUE(map->table, key, value) {
43         ZVAL_DS_PAIR(&pair, php_ds_pair_ex(key, value));
44         zend_hash_next_index_insert(array, &pair);
45     }
46     DS_HTABLE_FOREACH_END();
47 
48     return array;
49 }
50 
ds_map_pairs(ds_map_t * map)51 zval *ds_map_pairs(ds_map_t *map)
52 {
53     zval *buffer = ds_allocate_zval_buffer(DS_MAP_SIZE(map));
54     zval *target = buffer;
55 
56     zval *key;
57     zval *value;
58 
59     DS_HTABLE_FOREACH_KEY_VALUE(map->table, key, value) {
60         ZVAL_DS_PAIR(target++, php_ds_pair_ex(key, value));
61     }
62     DS_HTABLE_FOREACH_END();
63 
64     return buffer;
65 }
66 
php_ds_map_serialize(zval * object,unsigned char ** buffer,size_t * length,zend_serialize_data * data)67 int php_ds_map_serialize(zval *object, unsigned char **buffer, size_t *length, zend_serialize_data *data)
68 {
69     return ds_htable_serialize(Z_DS_MAP_P(object)->table, buffer, length, data);
70 }
71 
php_ds_map_unserialize(zval * object,zend_class_entry * ce,const unsigned char * buffer,size_t length,zend_unserialize_data * data)72 int php_ds_map_unserialize(zval *object, zend_class_entry *ce, const unsigned char *buffer, size_t length, zend_unserialize_data *data)
73 {
74     ds_map_t *map = ds_map();
75 
76     if (ds_htable_unserialize(map->table, buffer, length, data) == FAILURE) {
77         ds_map_free(map);
78         return FAILURE;
79     }
80 
81     ZVAL_DS_MAP(object, map);
82     return SUCCESS;
83 }
84