diff options
author | Dmitry Stogov <dmitry@zend.com> | 2021-03-19 22:36:24 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2021-03-19 22:36:24 +0300 |
commit | 340013ad01aa6bda92c6c71080f315fc63c9841c (patch) | |
tree | becd88732b78b9f0d76cd5fe175b59d954e4d05b /Zend/zend_hash.h | |
parent | 64e589cab6fcc953f111d6da2a4c137f6f97d5f3 (diff) | |
download | php-git-340013ad01aa6bda92c6c71080f315fc63c9841c.tar.gz |
Add zend_hash_lookup() and zend_hash_index_lookup() functions.
Thet search for an element with given key/index and add an empty one (NULL), if no found.
Diffstat (limited to 'Zend/zend_hash.h')
-rw-r--r-- | Zend/zend_hash.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 64a9220573..25d48f6237 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -32,6 +32,7 @@ #define HASH_UPDATE_INDIRECT (1<<2) #define HASH_ADD_NEW (1<<3) #define HASH_ADD_NEXT (1<<4) +#define HASH_LOOKUP (1<<5) #define HASH_FLAG_CONSISTENCY ((1<<0) | (1<<1)) #define HASH_FLAG_PACKED (1<<2) @@ -206,6 +207,22 @@ static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_stri } while (0) +/* Find or add NULL, if doesn't exist */ +ZEND_API zval* ZEND_FASTCALL zend_hash_lookup(HashTable *ht, zend_string *key); +ZEND_API zval* ZEND_FASTCALL zend_hash_index_lookup(HashTable *ht, zend_ulong h); + +#define ZEND_HASH_INDEX_LOOKUP(_ht, _h, _ret) do { \ + if (EXPECTED(HT_FLAGS(_ht) & HASH_FLAG_PACKED)) { \ + if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) { \ + _ret = &_ht->arData[_h].val; \ + if (EXPECTED(Z_TYPE_P(_ret) != IS_UNDEF)) { \ + break; \ + } \ + } \ + } \ + _ret = zend_hash_index_lookup(_ht, _h); \ + } while (0) + /* Misc */ static zend_always_inline bool zend_hash_exists(const HashTable *ht, zend_string *key) { |