- struct ec_dict_elt_ref *ref;
- size_t idx;
-
- ref = ec_dict_lookup(dict, key);
- if (ref == NULL)
- return -1;
-
- /* we could resize table here */
-
- TAILQ_REMOVE(&dict->list, ref, next);
- idx = ref->elt->hash & (dict->table_size - 1);
- TAILQ_REMOVE(&dict->table[idx], ref, hnext);
- ec_dict_elt_ref_free(ref);
- dict->len--;
-
- return 0;
-}
-
-static int ec_dict_table_resize(struct ec_dict *dict, size_t new_size)
-{
- struct ec_dict_elt_ref_list *new_table;
- struct ec_dict_elt_ref *ref;
- size_t i;
-
- if (new_size == 0 || (new_size & (new_size - 1))) {
- errno = EINVAL;
- return -1;
- }
-
- new_table = ec_calloc(new_size, sizeof(*dict->table));
- if (new_table == NULL)
- return -1;
- for (i = 0; i < new_size; i++)
- TAILQ_INIT(&new_table[i]);
-
- TAILQ_FOREACH(ref, &dict->list, next) {
- i = ref->elt->hash & (dict->table_size - 1);
- TAILQ_REMOVE(&dict->table[i], ref, hnext);
- i = ref->elt->hash & (new_size - 1);
- TAILQ_INSERT_TAIL(&new_table[i], ref, hnext);
- }
-
- ec_free(dict->table);
- dict->table = new_table;
- dict->table_size = new_size;
-
- return 0;
-}
-
-static int
-__ec_dict_set(struct ec_dict *dict, struct ec_dict_elt_ref *ref)
-{
- size_t new_size;
- uint32_t mask;
- int ret;
-
- /* remove previous entry if any */
- ec_dict_del(dict, ref->elt->key);
-
- if (dict->len >= dict->table_size) {
- if (dict->table_size != 0)
- new_size = dict->table_size << FACTOR;
- else
- new_size = 1 << FACTOR;
- ret = ec_dict_table_resize(dict, new_size);
- if (ret < 0)
- return ret;
- }
-
- mask = dict->table_size - 1;
- TAILQ_INSERT_TAIL(&dict->table[ref->elt->hash & mask], ref, hnext);
- TAILQ_INSERT_TAIL(&dict->list, ref, next);
- dict->len++;
-
- return 0;