Annotation of embedaddon/php/Zend/zend_ts_hash.h, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | Zend Engine |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 2.00 of the Zend license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.zend.com/license/2_00.txt. |
! 11: | If you did not receive a copy of the Zend license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@zend.com so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Authors: Harald Radi <harald.radi@nme.at> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id: zend_ts_hash.h 321634 2012-01-01 13:15:04Z felipe $ */
! 20:
! 21: #ifndef ZEND_TS_HASH_H
! 22: #define ZEND_TS_HASH_H
! 23:
! 24: #include "zend.h"
! 25:
! 26: typedef struct _zend_ts_hashtable {
! 27: HashTable hash;
! 28: zend_uint reader;
! 29: #ifdef ZTS
! 30: MUTEX_T mx_reader;
! 31: MUTEX_T mx_writer;
! 32: #endif
! 33: } TsHashTable;
! 34:
! 35: BEGIN_EXTERN_C()
! 36:
! 37: #define TS_HASH(table) (&(table->hash))
! 38:
! 39: /* startup/shutdown */
! 40: ZEND_API int _zend_ts_hash_init(TsHashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC);
! 41: ZEND_API int _zend_ts_hash_init_ex(TsHashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent, zend_bool bApplyProtection ZEND_FILE_LINE_DC);
! 42: ZEND_API void zend_ts_hash_destroy(TsHashTable *ht);
! 43: ZEND_API void zend_ts_hash_clean(TsHashTable *ht);
! 44:
! 45: #define zend_ts_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) \
! 46: _zend_ts_hash_init(ht, nSize, pHashFunction, pDestructor, persistent ZEND_FILE_LINE_CC)
! 47: #define zend_ts_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection) \
! 48: _zend_ts_hash_init_ex(ht, nSize, pHashFunction, pDestructor, persistent, bApplyProtection ZEND_FILE_LINE_CC)
! 49:
! 50:
! 51: /* additions/updates/changes */
! 52: ZEND_API int _zend_ts_hash_add_or_update(TsHashTable *ht, char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC);
! 53: #define zend_ts_hash_update(ht, arKey, nKeyLength, pData, nDataSize, pDest) \
! 54: _zend_ts_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDest, HASH_UPDATE ZEND_FILE_LINE_CC)
! 55: #define zend_ts_hash_add(ht, arKey, nKeyLength, pData, nDataSize, pDest) \
! 56: _zend_ts_hash_add_or_update(ht, arKey, nKeyLength, pData, nDataSize, pDest, HASH_ADD ZEND_FILE_LINE_CC)
! 57:
! 58: ZEND_API int _zend_ts_hash_quick_add_or_update(TsHashTable *ht, char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC);
! 59: #define zend_ts_hash_quick_update(ht, arKey, nKeyLength, h, pData, nDataSize, pDest) \
! 60: _zend_ts_hash_quick_add_or_update(ht, arKey, nKeyLength, h, pData, nDataSize, pDest, HASH_UPDATE ZEND_FILE_LINE_CC)
! 61: #define zend_ts_hash_quick_add(ht, arKey, nKeyLength, h, pData, nDataSize, pDest) \
! 62: _zend_ts_hash_quick_add_or_update(ht, arKey, nKeyLength, h, pData, nDataSize, pDest, HASH_ADD ZEND_FILE_LINE_CC)
! 63:
! 64: ZEND_API int _zend_ts_hash_index_update_or_next_insert(TsHashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC);
! 65: #define zend_ts_hash_index_update(ht, h, pData, nDataSize, pDest) \
! 66: _zend_ts_hash_index_update_or_next_insert(ht, h, pData, nDataSize, pDest, HASH_UPDATE ZEND_FILE_LINE_CC)
! 67: #define zend_ts_hash_next_index_insert(ht, pData, nDataSize, pDest) \
! 68: _zend_ts_hash_index_update_or_next_insert(ht, 0, pData, nDataSize, pDest, HASH_NEXT_INSERT ZEND_FILE_LINE_CC)
! 69:
! 70: ZEND_API int zend_ts_hash_add_empty_element(TsHashTable *ht, char *arKey, uint nKeyLength);
! 71:
! 72: ZEND_API void zend_ts_hash_graceful_destroy(TsHashTable *ht);
! 73: ZEND_API void zend_ts_hash_apply(TsHashTable *ht, apply_func_t apply_func TSRMLS_DC);
! 74: ZEND_API void zend_ts_hash_apply_with_argument(TsHashTable *ht, apply_func_arg_t apply_func, void * TSRMLS_DC);
! 75: ZEND_API void zend_ts_hash_apply_with_arguments(TsHashTable *ht TSRMLS_DC, apply_func_args_t apply_func, int, ...);
! 76:
! 77: ZEND_API void zend_ts_hash_reverse_apply(TsHashTable *ht, apply_func_t apply_func TSRMLS_DC);
! 78:
! 79:
! 80: /* Deletes */
! 81: ZEND_API int zend_ts_hash_del_key_or_index(TsHashTable *ht, char *arKey, uint nKeyLength, ulong h, int flag);
! 82: #define zend_ts_hash_del(ht, arKey, nKeyLength) \
! 83: zend_ts_hash_del_key_or_index(ht, arKey, nKeyLength, 0, HASH_DEL_KEY)
! 84: #define zend_ts_hash_index_del(ht, h) \
! 85: zend_ts_hash_del_key_or_index(ht, NULL, 0, h, HASH_DEL_INDEX)
! 86:
! 87: ZEND_API ulong zend_ts_get_hash_value(TsHashTable *ht, char *arKey, uint nKeyLength);
! 88:
! 89: /* Data retreival */
! 90: ZEND_API int zend_ts_hash_find(TsHashTable *ht, char *arKey, uint nKeyLength, void **pData);
! 91: ZEND_API int zend_ts_hash_quick_find(TsHashTable *ht, char *arKey, uint nKeyLength, ulong h, void **pData);
! 92: ZEND_API int zend_ts_hash_index_find(TsHashTable *ht, ulong h, void **pData);
! 93:
! 94: /* Misc */
! 95: ZEND_API int zend_ts_hash_exists(TsHashTable *ht, char *arKey, uint nKeyLength);
! 96: ZEND_API int zend_ts_hash_index_exists(TsHashTable *ht, ulong h);
! 97:
! 98: /* Copying, merging and sorting */
! 99: ZEND_API void zend_ts_hash_copy(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size);
! 100: ZEND_API void zend_ts_hash_copy_to_hash(HashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size);
! 101: ZEND_API void zend_ts_hash_merge(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size, int overwrite);
! 102: ZEND_API void zend_ts_hash_merge_ex(TsHashTable *target, TsHashTable *source, copy_ctor_func_t pCopyConstructor, uint size, merge_checker_func_t pMergeSource, void *pParam);
! 103: ZEND_API int zend_ts_hash_sort(TsHashTable *ht, sort_func_t sort_func, compare_func_t compare_func, int renumber TSRMLS_DC);
! 104: ZEND_API int zend_ts_hash_compare(TsHashTable *ht1, TsHashTable *ht2, compare_func_t compar, zend_bool ordered TSRMLS_DC);
! 105: ZEND_API int zend_ts_hash_minmax(TsHashTable *ht, compare_func_t compar, int flag, void **pData TSRMLS_DC);
! 106:
! 107: ZEND_API int zend_ts_hash_num_elements(TsHashTable *ht);
! 108:
! 109: ZEND_API int zend_ts_hash_rehash(TsHashTable *ht);
! 110:
! 111: ZEND_API ulong zend_ts_hash_func(char *arKey, uint nKeyLength);
! 112:
! 113: #if ZEND_DEBUG
! 114: /* debug */
! 115: void zend_ts_hash_display_pListTail(TsHashTable *ht);
! 116: void zend_ts_hash_display(TsHashTable *ht);
! 117: #endif
! 118:
! 119: END_EXTERN_C()
! 120:
! 121: #define ZEND_TS_INIT_SYMTABLE(ht) \
! 122: ZEND_TS_INIT_SYMTABLE_EX(ht, 2, 0)
! 123:
! 124: #define ZEND_TS_INIT_SYMTABLE_EX(ht, n, persistent) \
! 125: zend_ts_hash_init(ht, n, NULL, ZVAL_PTR_DTOR, persistent)
! 126:
! 127: #endif /* ZEND_HASH_H */
! 128:
! 129: /*
! 130: * Local variables:
! 131: * tab-width: 4
! 132: * c-basic-offset: 4
! 133: * indent-tabs-mode: t
! 134: * End:
! 135: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>