diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-04-18 19:18:11 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-04-18 19:18:11 +0400 |
commit | 7652a977a88b825f66959e91a7c8c54b720a50bc (patch) | |
tree | 5285e86c91ccbf5d6cb708a13c443f5be6a806b6 /Zend/zend_hash.h | |
parent | ea2e1bb1eb7dd0ca1ce6d731190b2a6b2046a645 (diff) | |
download | php-git-7652a977a88b825f66959e91a7c8c54b720a50bc.tar.gz |
Use ZEND_FETCH_FOREACH_* macros to iterate over HashTables instead of zend_hash_move_forward() and family.
Diffstat (limited to 'Zend/zend_hash.h')
-rw-r--r-- | Zend/zend_hash.h | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 11dc92d3c3..ba0b28bd7b 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -533,6 +533,106 @@ 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_VAL(_ht, _val) do { \ + uint _idx; \ + Bucket *_p; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + _p = (_ht)->arData + _idx; \ + if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ + _val = &_p->val; + +#define ZEND_HASH_FOREACH_VAL_IND(_ht, _val) do { \ + uint _idx; \ + Bucket *_p; \ + zval *_z; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + _p = (_ht)->arData + _idx; \ + _z = &_p->val; \ + if (Z_TYPE_P(_z) == IS_INDIRECT) { \ + _z = Z_INDIRECT_P(_z); \ + } \ + if (Z_TYPE_P(_z) == IS_UNDEF) continue; \ + _val = _z; + +#define ZEND_HASH_FOREACH_PTR(_ht, _ptr) do { \ + uint _idx; \ + Bucket *_p; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + _p = (_ht)->arData + _idx; \ + if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ + _ptr = Z_PTR(_p->val); + +#define ZEND_HASH_FOREACH_KEY(_ht, _h, _key) do { \ + uint _idx; \ + Bucket *_p; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + _p = (_ht)->arData + _idx; \ + if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ + _h = _p->h; \ + _key = _p->key; \ + +#define ZEND_HASH_FOREACH_KEY_VAL(_ht, _h, _key, _val) do { \ + uint _idx; \ + Bucket *_p; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + _p = (_ht)->arData + _idx; \ + if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ + _h = _p->h; \ + _key = _p->key; \ + _val = &_p->val; + +#define ZEND_HASH_FOREACH_KEY_VAL(_ht, _h, _key, _val) do { \ + uint _idx; \ + Bucket *_p; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + _p = (_ht)->arData + _idx; \ + if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ + _h = _p->h; \ + _key = _p->key; \ + _val = &_p->val; + +#define ZEND_HASH_FOREACH_KEY_VAL_IND(_ht, _h, _key, _val) do { \ + uint _idx; \ + Bucket *_p; \ + zval *_z; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + _p = (_ht)->arData + _idx; \ + _z = &_p->val; \ + if (Z_TYPE_P(_z) == IS_INDIRECT) { \ + _z = Z_INDIRECT_P(_z); \ + } \ + if (Z_TYPE_P(_z) == IS_UNDEF) continue; \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_FOREACH_KEY_PTR(_ht, _h, _key, _ptr) do { \ + uint _idx; \ + Bucket *_p; \ + for (_idx = 0; _idx < (_ht)->nNumUsed; _idx++) { \ + _p = (_ht)->arData + _idx; \ + if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ + _h = _p->h; \ + _key = _p->key; \ + _ptr = Z_PTR(_p->val); + + +#define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(_ht, _h, _key, _val) do { \ + uint _idx; \ + Bucket *_p; \ + for (_idx = (_ht)->nNumUsed; _idx > 0; _idx--) { \ + _p = (_ht)->arData + _idx - 1; \ + if (Z_TYPE(_p->val) == IS_UNDEF) continue; \ + _h = _p->h; \ + _key = _p->key; \ + _val = &_p->val; + +#define ZEND_HASH_FOREACH_END() \ + } \ + } while (0) + + + #endif /* ZEND_HASH_H */ /* |