7#define LEXBOR_HASH_EXTERN
9#undef LEXBOR_HASH_EXTERN
13#define LEXBOR_STR_RES_MAP_LOWERCASE
14#define LEXBOR_STR_RES_MAP_UPPERCASE
133 chunk_size = table_size / 2;
135 hash->table_size = table_size;
154 hash->struct_size = struct_size;
190 uint32_t hash_id, table_idx;
193 hash_id = insert->
hash(
key, length);
194 table_idx = hash_id %
hash->table_size;
196 entry =
hash->table[table_idx];
200 hash->table[table_idx] = entry;
208 if (entry->
length == length && insert->
cmp(str,
key, length)) {
231 uint32_t hash_id, table_idx;
234 hash_id = search->
hash(
key, length);
235 table_idx = hash_id %
hash->table_size;
237 item =
hash->table[table_idx];
240 hash->table[table_idx] = entry;
248 if (item->
length == length && search->
cmp(str,
key, length)) {
270 key, length, search->
cmp);
278 key, length, search->
cmp);
290 table_idx = hash_id %
hash->table_size;
291 entry =
hash->table[table_idx];
294 while (entry !=
NULL) {
297 if (entry->
length == length && cmp_func(str,
key, length)) {
299 hash->table[table_idx] = entry->
next;
327 entry =
hash->table[ hash_id %
hash->table_size ];
329 while (entry !=
NULL) {
332 if (entry->
length == length && cmp_func(str,
key, length)) {
348 for (i = hash_id = 0; i < length; i++) {
350 hash_id += (hash_id << 10);
351 hash_id ^= (hash_id >> 6);
354 hash_id += (hash_id << 3);
355 hash_id ^= (hash_id >> 11);
356 hash_id += (hash_id << 15);
367 for (i = hash_id = 0; i < length; i++) {
368 hash_id += lexbor_str_res_map_lowercase[
key[i] ];
369 hash_id += (hash_id << 10);
370 hash_id ^= (hash_id >> 6);
373 hash_id += (hash_id << 3);
374 hash_id ^= (hash_id >> 11);
375 hash_id += (hash_id << 15);
386 for (i = hash_id = 0; i < length; i++) {
387 hash_id += lexbor_str_res_map_uppercase[
key[i] ];
388 hash_id += (hash_id << 10);
389 hash_id ^= (hash_id >> 6);
392 hash_id += (hash_id << 3);
393 hash_id ^= (hash_id >> 11);
394 hash_id += (hash_id << 15);
442 for (
size_t i = 0; i < length; i++) {
443 to[i] = lexbor_str_res_map_lowercase[
key[i] ];
469 for (
size_t i = 0; i < length; i++) {
470 to[i] = lexbor_str_res_map_uppercase[
key[i] ];
prev(array|object &$array)
@ LXB_STATUS_ERROR_MEMORY_ALLOCATION
@ LXB_STATUS_ERROR_OBJECT_IS_NULL
void * lexbor_dobject_calloc(lexbor_dobject_t *dobject)
lxb_status_t lexbor_dobject_init(lexbor_dobject_t *dobject, size_t chunk_size, size_t struct_size)
void lexbor_dobject_clean(lexbor_dobject_t *dobject)
lexbor_dobject_t * lexbor_dobject_destroy(lexbor_dobject_t *dobject, bool destroy_self)
void * lexbor_dobject_free(lexbor_dobject_t *dobject, void *data)
lexbor_dobject_t * lexbor_dobject_create(void)
LXB_API const lexbor_hash_search_t * lexbor_hash_search_lower
LXB_API const lexbor_hash_search_t * lexbor_hash_search_raw
const lexbor_hash_insert_t lexbor_hash_insert_upper_var
lxb_inline lexbor_hash_entry_t ** lexbor_hash_table_destroy(lexbor_hash_t *hash)
void lexbor_hash_clean(lexbor_hash_t *hash)
LXB_API const lexbor_hash_insert_t * lexbor_hash_insert_lower
const lexbor_hash_search_t lexbor_hash_search_var
uint32_t lexbor_hash_make_id(const lxb_char_t *key, size_t length)
lxb_inline void lexbor_hash_table_clean(lexbor_hash_t *hash)
uint32_t lexbor_hash_make_id_upper(const lxb_char_t *key, size_t length)
lxb_inline lexbor_hash_entry_t * _lexbor_hash_entry_create(lexbor_hash_t *hash, const lexbor_hash_copy_f copy_func, const lxb_char_t *key, size_t length)
const lexbor_hash_insert_t lexbor_hash_insert_lower_var
lxb_inline lexbor_hash_entry_t ** lexbor_hash_table_create(lexbor_hash_t *hash)
void * lexbor_hash_search_by_hash_id(lexbor_hash_t *hash, uint32_t hash_id, const lxb_char_t *key, size_t length, const lexbor_hash_cmp_f cmp_func)
lxb_status_t lexbor_hash_copy_upper(lexbor_hash_t *hash, lexbor_hash_entry_t *entry, const lxb_char_t *key, size_t length)
void lexbor_hash_remove(lexbor_hash_t *hash, const lexbor_hash_search_t *search, const lxb_char_t *key, size_t length)
lxb_status_t lexbor_hash_init(lexbor_hash_t *hash, size_t table_size, size_t struct_size)
void * lexbor_hash_insert(lexbor_hash_t *hash, const lexbor_hash_insert_t *insert, const lxb_char_t *key, size_t length)
LXB_API const lexbor_hash_search_t * lexbor_hash_search_upper
LXB_API const lexbor_hash_insert_t * lexbor_hash_insert_raw
lxb_status_t lexbor_hash_copy(lexbor_hash_t *hash, lexbor_hash_entry_t *entry, const lxb_char_t *key, size_t length)
const lexbor_hash_insert_t lexbor_hash_insert_var
const lexbor_hash_search_t lexbor_hash_search_lower_var
lexbor_hash_t * lexbor_hash_create(void)
const lexbor_hash_search_t lexbor_hash_search_upper_var
void * lexbor_hash_insert_by_entry(lexbor_hash_t *hash, lexbor_hash_entry_t *entry, const lexbor_hash_search_t *search, const lxb_char_t *key, size_t length)
LXB_API const lexbor_hash_insert_t * lexbor_hash_insert_upper
uint32_t lexbor_hash_make_id_lower(const lxb_char_t *key, size_t length)
lxb_status_t lexbor_hash_copy_lower(lexbor_hash_t *hash, lexbor_hash_entry_t *entry, const lxb_char_t *key, size_t length)
void * lexbor_hash_search(lexbor_hash_t *hash, const lexbor_hash_search_t *search, const lxb_char_t *key, size_t length)
void lexbor_hash_remove_by_hash_id(lexbor_hash_t *hash, uint32_t hash_id, const lxb_char_t *key, size_t length, const lexbor_hash_cmp_f cmp_func)
lexbor_hash_t * lexbor_hash_destroy(lexbor_hash_t *hash, bool destroy_obj)
memset(ptr, 0, type->size)
lxb_status_t(* lexbor_hash_copy_f)(lexbor_hash_t *hash, lexbor_hash_entry_t *entry, const lxb_char_t *key, size_t size)
struct lexbor_hash_search lexbor_hash_search_t
bool(* lexbor_hash_cmp_f)(const lxb_char_t *first, const lxb_char_t *second, size_t size)
lxb_inline lxb_char_t * lexbor_hash_entry_str(const lexbor_hash_entry_t *entry)
struct lexbor_hash lexbor_hash_t
struct lexbor_hash_entry lexbor_hash_entry_t
struct lexbor_hash_insert lexbor_hash_insert_t
#define LEXBOR_HASH_TABLE_MIN_SIZE
#define LEXBOR_HASH_SHORT_SIZE
hash(string $algo, string $data, bool $binary=false, array $options=[])
LXB_API void * lexbor_free(void *dst)
LXB_API void * lexbor_calloc(size_t num, size_t size)
lexbor_mraw_t * lexbor_mraw_create(void)
void * lexbor_mraw_free(lexbor_mraw_t *mraw, void *data)
void lexbor_mraw_clean(lexbor_mraw_t *mraw)
lxb_status_t lexbor_mraw_init(lexbor_mraw_t *mraw, size_t chunk_size)
void * lexbor_mraw_alloc(lexbor_mraw_t *mraw, size_t size)
lexbor_mraw_t * lexbor_mraw_destroy(lexbor_mraw_t *mraw, bool destroy_self)
unsigned char key[REFLECTION_KEY_LEN]
bool lexbor_str_data_nupcmp_right(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
bool lexbor_str_data_ncmp(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
bool lexbor_str_data_nlocmp_right(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
union lexbor_hash_entry::@035143052233045245065130050150326123154202375277 u
lxb_char_t short_str[LEXBOR_HASH_SHORT_SIZE+1]
lexbor_hash_entry_t * next
unsigned int lxb_status_t