diff options
Diffstat (limited to 'Zend/zend_hash.h')
-rw-r--r-- | Zend/zend_hash.h | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 11dc92d3c3..c770539dd1 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -533,6 +533,85 @@ static inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, HashPositio #define zend_hash_get_current_data_ptr(ht) \ zend_hash_get_current_data_ptr_ex(ht, &(ht)->nInternalPointer) +#define ZEND_HASH_FOREACH(_ht, indirect) do { \ + uint _idx; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + Bucket *_p = (_ht)->arData + _idx; \ + zval *_z = &_p->val; \ + if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ + _z = Z_INDIRECT_P(_z); \ + } \ + if (Z_TYPE_P(_z) == IS_UNDEF) continue; + +#define ZEND_HASH_REVERSE_FOREACH(_ht, indirect) do { \ + uint _idx; \ + for (_idx = (_ht)->nNumUsed; _idx > 0; _idx--) { \ + Bucket *_p = (_ht)->arData + _idx - 1; \ + zval *_z = &_p->val; \ + if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ + _z = Z_INDIRECT_P(_z); \ + } \ + if (Z_TYPE_P(_z) == IS_UNDEF) continue; + +#define ZEND_HASH_FOREACH_END() \ + } \ + } while (0) + +#define ZEND_HASH_FOREACH_VAL(ht, _val) \ + ZEND_HASH_FOREACH(ht, 0); \ + _val = _z; + +#define ZEND_HASH_FOREACH_VAL_IND(ht, _val) \ + ZEND_HASH_FOREACH(ht, 1); \ + _val = _z; + +#define ZEND_HASH_FOREACH_PTR(ht, _ptr) \ + ZEND_HASH_FOREACH(ht, 0); \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \ + ZEND_HASH_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; + +#define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val) \ + ZEND_HASH_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \ + ZEND_HASH_FOREACH(ht, 1); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \ + ZEND_HASH_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_REVERSE_FOREACH_VAL(ht, _val) \ + ZEND_HASH_REVERSE_FOREACH(ht, 0); \ + _val = _z; + +#define ZEND_HASH_REVERSE_FOREACH_VAL_IND(ht, _val) \ + ZEND_HASH_REVERSE_FOREACH(ht, 1); \ + _val = _z; + +#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \ + ZEND_HASH_REVERSE_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \ + ZEND_HASH_REVERSE_FOREACH(ht, 1); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + #endif /* ZEND_HASH_H */ /* |