Пример #1
0
Файл: st.c Проект: sho-h/ruby
static void
add_packed_direct(st_table *table, st_data_t key, st_data_t value, st_index_t hash_val)
{
    if (table->real_entries < MAX_PACKED_HASH) {
	st_index_t i = table->real_entries++;
	PKEY_SET(table, i, key);
	PVAL_SET(table, i, value);
	PHASH_SET(table, i, hash_val);
	table->num_entries++;
    }
    else {
	unpack_entries(table);
	add_direct(table, key, value, hash_val, hash_pos(hash_val, table->num_bins));
    }
}
Пример #2
0
void
st_add_direct(st_table *table, st_data_t key, st_data_t value)
{
    unsigned int hash_val, bin_pos;

    if (table->entries_packed) {
        int i;
        if ((table->num_entries+1) * 2 <= table->num_bins && table->num_entries+1 <= MAX_PACKED_NUMHASH) {
            i = table->num_entries++;
            table->bins[i*2] = (struct st_table_entry*)key;
            table->bins[i*2+1] = (struct st_table_entry*)value;
            return;
        }
        else {
            unpack_entries(table);
        }
    }

    hash_val = do_hash(key, table);
    bin_pos = hash_val % table->num_bins;
    ADD_DIRECT(table, key, value, hash_val, bin_pos);
}
Пример #3
0
int
st_insert(register st_table *table, register st_data_t key, st_data_t value)
{
    unsigned int hash_val, bin_pos;
    register st_table_entry *ptr;

    if (table->entries_packed) {
        int i;
        for (i = 0; i < table->num_entries; i++) {
            if ((st_data_t)table->bins[i*2] == key) {
                table->bins[i*2+1] = (struct st_table_entry*)value;
                return 1;
            }
        }
        if ((table->num_entries+1) * 2 <= table->num_bins && table->num_entries+1 <= MAX_PACKED_NUMHASH) {
            i = table->num_entries++;
            table->bins[i*2] = (struct st_table_entry*)key;
            table->bins[i*2+1] = (struct st_table_entry*)value;
            return 0;
        }
        else {
            unpack_entries(table);
        }
    }

    hash_val = do_hash(key, table);
    FIND_ENTRY(table, ptr, hash_val, bin_pos);

    if (ptr == 0) {
	ADD_DIRECT(table, key, value, hash_val, bin_pos);
	return 0;
    }
    else {
	ptr->record = value;
	return 1;
    }
}