summaryrefslogtreecommitdiff
path: root/Zend/zend_bitset.h
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-04-24 17:04:22 +0200
committerNikita Popov <nikic@php.net>2016-04-24 17:05:13 +0200
commitcafe78d12aa2db789f141dd41cf16268ddcab76f (patch)
tree35725db43f29169a433bc74d074d5be623173810 /Zend/zend_bitset.h
parent62240f2653697e336f6fb2ecfe8788acf5b903c3 (diff)
downloadphp-git-cafe78d12aa2db789f141dd41cf16268ddcab76f.tar.gz
Introduce ZEND_BITSET_FOREACH macros
Diffstat (limited to 'Zend/zend_bitset.h')
-rw-r--r--Zend/zend_bitset.h27
1 files changed, 27 insertions, 0 deletions
diff --git a/Zend/zend_bitset.h b/Zend/zend_bitset.h
index e3c2ec748d..fb19b54329 100644
--- a/Zend/zend_bitset.h
+++ b/Zend/zend_bitset.h
@@ -174,6 +174,33 @@ static inline int zend_bitset_last(zend_bitset set, uint32_t len)
return -1; /* empty set */
}
+#define ZEND_BITSET_FOREACH(set, len, bit) do { \
+ zend_bitset _set = (set); \
+ uint32_t _i, _len = (len); \
+ for (_i = 0; _i < len; _i++) { \
+ zend_ulong _x = _set[_i]; \
+ if (_x) { \
+ (bit) = ZEND_BITSET_ELM_SIZE * 8 * _i; \
+ for (; _x != 0; _x >>= Z_UL(1), (bit)++) { \
+ if (!(_x & Z_UL(1))) continue;
+
+#define ZEND_BITSET_REVERSE_FOREACH(set, len, bit) do { \
+ zend_bitset _set = (set); \
+ uint32_t _i = (len); \
+ zend_ulong _test = Z_UL(1) << (ZEND_BITSET_ELM_SIZE * 8 - 1); \
+ while (_i-- > 0) { \
+ zend_ulong _x = _set[_i]; \
+ if (_x) { \
+ (bit) = ZEND_BITSET_ELM_SIZE * 8 * (_i + 1) - 1; \
+ for (; _x != 0; _x <<= Z_UL(1), (bit)--) { \
+ if (!(_x & _test)) continue; \
+
+#define ZEND_BITSET_FOREACH_END() \
+ } \
+ } \
+ } \
+} while (0)
+
#endif /* _ZEND_BITSET_H_ */
/*