summaryrefslogtreecommitdiff
path: root/Zend/zend_hash.h
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-04-18 19:18:11 +0400
committerDmitry Stogov <dmitry@zend.com>2014-04-18 19:18:11 +0400
commit7652a977a88b825f66959e91a7c8c54b720a50bc (patch)
tree5285e86c91ccbf5d6cb708a13c443f5be6a806b6 /Zend/zend_hash.h
parentea2e1bb1eb7dd0ca1ce6d731190b2a6b2046a645 (diff)
downloadphp-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.h100
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 */
/*