Hash api change

[email protected] (Marcus Boerger)
Newsgroups php.i18n
Message-ID <[email protected]>
Hello php-i18n,

  i think we should change the api a bit:

From:

typedef struct _key {
        zend_uchar type;
        union {
                char  s[1];   /* Must be last element */
                UChar u[1];   /* Must be last element */
        } arKey;
} HashKey;

typedef struct bucket {
        ulong h;                                                /* Used for numeric indexing */
        uint nKeyLength;
        void *pData;
        void *pDataPtr;
        struct bucket *pListNext;
        struct bucket *pListLast;
        struct bucket *pNext;
        struct bucket *pLast;
        HashKey key; /* Must be last element */
} Bucket;

To:

typedef struct _key {
        ulong h;     /* Used for numeric indexing */
        uint nKeyLength;
        zend_uchar type;
        zstr arKey;   /* Must be last element */
} HashKey;

typedef struct bucket {
        void *pData;
        void *pDataPtr;
        struct bucket *pListNext;
        struct bucket *pListLast;
        struct bucket *pNext;
        struct bucket *pLast;
        HashKey key; /* Must be last element */
} Bucket;

So now HashKey matches zend_hash_key just by pure reordering.

Also we should probably change the apply_with_arguments stuff to pass the
tsrm key. That is we'd change from:

typedef int (*apply_func_args_t)(void *pDest, int num_args, va_list args, zend_hash_key *hash_key);
ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int, ...);


To:

typedef int (*apply_func_args_t)(void *pDest TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key);
ZEND_API void zend_hash_apply_with_arguments(HashTable *ht TSRMLS_DC, apply_func_args_t apply_func, int, ...);

Further more our add_assoc functions currently only allow handling of native
string indexes. This should be changed to allow unicode indexes as well:

ZEND_API int add_assoc_long_ex(zval *arg, char *key, uint key_len, long n);

TO:

ZEND_API int add_assoc_long_ex(zval *arg, zend_uchar type, zst *key, uint key_len, long n);

Though maybe it is considerable to just add more functions i don't think
flooding the api is a good idea and prefer to only have one version that can
easily deal with both.

-- 
Best regards,
 Marcus                          mailto:[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.