static void test_set_insert_ex(CuTest * tc) { const char * strings[] = { "aaa", "bbb", "ccc", "ddd" }; struct quicklist *ql = NULL; int qi; /* insert a string: */ CuAssertIntEquals(tc, ql_true, ql_set_insert_ex(&ql, (void *)strings[0], cmp_str)); CuAssertIntEquals(tc, 1, ql_length(ql)); /* insert a second string: */ CuAssertIntEquals(tc, ql_true, ql_set_insert_ex(&ql, (void *)strings[1], cmp_str)); CuAssertIntEquals(tc, 2, ql_length(ql)); /* same string again, no change: */ CuAssertIntEquals(tc, ql_false, ql_set_insert_ex(&ql, (void *)strings[1], cmp_str)); CuAssertIntEquals(tc, 2, ql_length(ql)); /* a third string */ CuAssertIntEquals(tc, ql_true, ql_set_insert_ex(&ql, (void *)strings[2], cmp_str)); CuAssertIntEquals(tc, 3, ql_length(ql)); /* check that they are alphabetically ordered: */ for (qi = 0; qi != 3; ++qi) { CuAssertPtrEquals(tc, (void *)strings[qi], ql_get(ql, qi)); } CuAssertIntEquals(tc, 1, ql_set_find_ex(&ql, &qi, (void *)strings[2], cmp_str)); CuAssertIntEquals(tc, 2, qi); ql_free(ql); }
void add_donation(faction * f1, faction * f2, int amount, region * r) { transfer tr, *tf; quicklist *ql = transfers; int qi = 0; tr.r = r; tr.f1 = f1; tr.f2 = f2; tr.amount = amount; if (ql_set_find_ex(&ql, &qi, &tr, cmp_transfer)) { tf = (transfer *)ql_get(ql, qi); tf->amount += amount; } else { tf = malloc(sizeof(transfer)); memcpy(tf, &tr, sizeof(transfer)); } ql_set_insert_ex(&transfers, tf, cmp_transfer); }