/* * Return TRUE when two dictionaries have exactly the same key/values. */ int dict_equal( dict_T *d1, dict_T *d2, int ic, /* ignore case for strings */ int recursive) /* TRUE when used recursively */ { hashitem_T *hi; dictitem_T *item2; int todo; if (d1 == NULL && d2 == NULL) return TRUE; if (d1 == NULL || d2 == NULL) return FALSE; if (d1 == d2) return TRUE; if (dict_len(d1) != dict_len(d2)) return FALSE; todo = (int)d1->dv_hashtab.ht_used; for (hi = d1->dv_hashtab.ht_array; todo > 0; ++hi) { if (!HASHITEM_EMPTY(hi)) { item2 = dict_find(d2, hi->hi_key, -1); if (item2 == NULL) return FALSE; if (!tv_equal(&HI2DI(hi)->di_tv, &item2->di_tv, ic, recursive)) return FALSE; --todo; } } return TRUE; }
void case_dict_clear() { struct dict *dict = dict(); assert(dict_set(dict, "key1", 4, "val1") == DICT_OK); assert(dict_set(dict, "key2", 4, "val2") == DICT_OK); assert(dict_set(dict, "key3", 4, "val3") == DICT_OK); assert(dict_set(dict, "key4", 4, "val4") == DICT_OK); assert(dict_len(dict) == 4); dict_clear(dict); assert(dict_len(dict) == 0); dict_free(dict); }
void case_dict_pop() { struct dict *dict = dict(); char *key = "key", *val = "val"; size_t len = strlen(key); assert(dict_set(dict, key, len, val) == DICT_OK); assert(dict_len(dict) == 1); assert(dict_pop(dict, key, len) == val); assert(dict_len(dict) == 0); assert(dict_pop(dict, key, len) == NULL); assert(dict_len(dict) == 0); dict_free(dict); }
void case_dict_resize() { struct dict *dict = dict(); assert(dict_set(dict, "key1", 4, "val1") == DICT_OK); assert(dict_set(dict, "key2", 4, "val2") == DICT_OK); assert(dict_set(dict, "key3", 4, "val3") == DICT_OK); assert(dict_set(dict, "key4", 4, "val4") == DICT_OK); assert(dict_len(dict) == 4); assert(dict->idx == 0 && dict_cap(dict) == 7); assert(dict_set(dict, "key5", 4, "val5") == DICT_OK); assert(dict_set(dict, "key6", 4, "val6") == DICT_OK); assert(dict_len(dict) == 6); assert(dict->idx == 1 && dict_cap(dict) == 17); dict_free(dict); }