fis-gtm/sr_port/hashtab_str.h

79 lines
3.3 KiB
C

/****************************************************************
* *
* Copyright 2009, 2011 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#ifndef HASHTAB_STR_H
#define HASHTAB_STR_H
#include "hashtab.h" /* needed for STR_HASH (in COMPUTE_HASH_MNAME) */
typedef struct
{
mstr str;
uint4 hash_code;
GTM64_ONLY(int4 filler;)
} stringkey;
typedef struct
{
stringkey key;
void *value;
} ht_ent_str;
typedef struct hash_table_str_struct
{
ht_ent_str *base; /* base of array of hent_* entries */
ht_ent_str *top; /* top of array of hent_* entries */
unsigned int size; /* Hash table size */
unsigned int initial_size; /* Hash table initial size */
ht_ent_str *spare_base; /* spare array of hent_* entries */
unsigned int spare_base_size;/* size of spare array */
boolean_t dont_compact; /* if set, never perform compaction */
boolean_t dont_keep_spare_table; /* if set, don't keep a spare table */
boolean_t defer_base_release; /* if set don't release base, caller will free_base...() later */
unsigned int count; /* Number of valid entries */
unsigned int del_count; /* Number of entries marked deleted. */
unsigned int exp_trigger_size;/* When exp_trigger_size entried are used, expand table */
unsigned int cmp_trigger_size;/* When cmp_trigger_size reached compact table */
sm_uc_ptr_t entry_passed_thru;/* Bit vector used to determine whether a particular */
/* ht_ent has been involved in a collision (meaning that */
/* this value can't be marked empty on delete */
} hash_table_str;
#define HTENT_EMPTY_STR(tabent, type, htvalue) (!(tabent)->key.hash_code && !(tabent)->key.str.len)
#define HTENT_MARK_EMPTY_STR(tabent) \
{ \
(tabent)->key.hash_code = 0; \
(tabent)->key.str.len = 0; \
}
#define HTENT_VALID_STR(tabent, type, htvalue) ((!HTENT_EMPTY_STR(tabent, type, htvalue)) && \
(HT_DELETED_ENTRY != (htvalue = (type *)(tabent)->value)))
#define COMPUTE_HASH_STR(hkey) \
{ \
assert((0 <= (hkey)->str.len) && (MAX_STRLEN >= (hkey)->str.len)); \
if (0 == (hkey)->str.len) \
/* Likely null string -- need nonzero hash code */ \
(hkey)->hash_code = 1; \
else \
STR_HASH((hkey)->str.addr, (hkey)->str.len, ((hkey)->hash_code), 0); \
}
/* Prototypes for addr hash routines. See hashtab_implementation.h for detail interface and implementation */
void init_hashtab_str(hash_table_str *table, int minsize, boolean_t dont_compact, boolean_t dont_keep_spare_table);
void expand_hashtab_str(hash_table_str *table, int minsize);
boolean_t add_hashtab_str(hash_table_str *table, stringkey *key, void *value, ht_ent_str **tabentptr);
void *lookup_hashtab_str(hash_table_str *table, stringkey *key);
void delete_hashtab_ent_str(hash_table_str *table, ht_ent_str *tabent);
boolean_t delete_hashtab_str(hash_table_str *table, stringkey *key);
void free_hashtab_str(hash_table_str *table);
void reinitialize_hashtab_str(hash_table_str *table);
void compact_hashtab_str(hash_table_str *table);
#endif /* HASHTAB_STR_H */