6#define ID_TABLE_DEBUG 0
20 return rb_id_serial_to_id(
key);
26 return rb_id_to_serial(
id);
49#define ITEM_GET_KEY(tbl, i) ((tbl)->items[i].key)
50#define ITEM_KEY_ISSET(tbl, i) ((tbl)->items[i].key)
51#define ITEM_COLLIDED(tbl, i) ((tbl)->items[i].collision)
52#define ITEM_SET_COLLIDED(tbl, i) ((tbl)->items[i].collision = 1)
59#define ITEM_GET_KEY(tbl, i) ((tbl)->items[i].key >> 1)
60#define ITEM_KEY_ISSET(tbl, i) ((tbl)->items[i].key > 1)
61#define ITEM_COLLIDED(tbl, i) ((tbl)->items[i].key & 1)
62#define ITEM_SET_COLLIDED(tbl, i) ((tbl)->items[i].key |= 1)
80 return (capa + 1) << 2;
99 return rb_id_table_init(tbl, (
int)
capa);
120 return (
size_t)tbl->
num;
139 ix = (ix + d) &
mask;
156 ix = (ix + d) &
mask;
163 ITEM_SET_KEY(tbl, ix,
key);
175 ITEM_SET_KEY(tbl, ix, 0);
188 int new_cap = round_capa(tbl->
num + (tbl->
num >> 1));
192 if (new_cap < tbl->
capa) {
193 new_cap = round_capa(tbl->
used + (tbl->
used >> 1));
195 tmp_tbl.
capa = new_cap;
197 for (i = 0; i < tbl->
capa; i++) {
200 hash_table_raw_insert(&tmp_tbl,
key, tbl->
items[i].
val);
209#if ID_TABLE_DEBUG && 0
217 fprintf(stderr,
"tbl: %p (capa: %d, num: %d, used: %d)\n", tbl, tbl->
capa, tbl->
num, tbl->
used);
218 for (i=0; i<
capa; i++) {
220 fprintf(stderr,
" -> [%d] %s %d\n", i,
rb_id2name(key2id(keys[i])), (
int)keys[i]);
230 int index = hash_table_index(tbl,
key);
244 const int index = hash_table_index(tbl,
key);
250 hash_table_extend(tbl);
251 hash_table_raw_insert(tbl,
key, val);
259 return rb_id_table_insert_key(tbl, id2key(
id), val);
266 int index = hash_table_index(tbl,
key);
267 return hash_delete_index(tbl, index);
275 for (i=0; i<
capa; i++) {
282 ret = (*replace)(
NULL, &val, data,
TRUE);
296 for (i=0; i<
capa; i++) {
303 hash_delete_index(tbl, i);
315 for (i=0; i<
capa; i++) {
320 hash_delete_index(tbl, i);
#define ITEM_SET_COLLIDED(tbl, i)
void rb_id_table_clear(struct rb_id_table *tbl)
int rb_id_table_insert(struct rb_id_table *tbl, ID id, VALUE val)
void rb_id_table_foreach_with_replace(struct rb_id_table *tbl, rb_id_table_foreach_func_t *func, rb_id_table_update_callback_func_t *replace, void *data)
size_t rb_id_table_memsize(const struct rb_id_table *tbl)
#define ITEM_KEY_ISSET(tbl, i)
int rb_id_table_lookup(struct rb_id_table *tbl, ID id, VALUE *valp)
void rb_id_table_free(struct rb_id_table *tbl)
void rb_id_table_foreach_values(struct rb_id_table *tbl, rb_id_table_foreach_values_func_t *func, void *data)
size_t rb_id_table_size(const struct rb_id_table *tbl)
#define ITEM_GET_KEY(tbl, i)
struct rb_id_table * rb_id_table_create(size_t capa)
int rb_id_table_delete(struct rb_id_table *tbl, ID id)
#define ITEM_COLLIDED(tbl, i)
void rb_id_table_foreach(struct rb_id_table *tbl, rb_id_table_foreach_func_t *func, void *data)
enum rb_id_table_iterator_result rb_id_table_update_callback_func_t(ID *id, VALUE *val, void *data, int existing)
enum rb_id_table_iterator_result rb_id_table_foreach_func_t(ID id, VALUE val, void *data)
enum rb_id_table_iterator_result rb_id_table_foreach_values_func_t(VALUE val, void *data)
rb_id_table_iterator_result
const char * rb_id2name(ID)
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
#define MEMZERO(p, type, n)