5 bool list_compare_default(void *v1, void *v2)
10 bool list_compare_string(void *v1, void *v2)
12 return strcmp(v1, v2) == 0;
15 List list_create(ListComparator cmp)
18 .cmp = cmp ? cmp : list_compare_default,
23 void list_clear(List *list)
25 list_clear_func(list, NULL, NULL);
28 void list_clear_func(List *list, void (*func)(void *key, void *value, void *arg), void *arg)
30 for (ListPair *pair = list->first; pair != NULL;) {
31 ListPair *next = pair->next;
33 func(pair->key, pair->value, arg);
40 static ListPair *make_pair(void *key, void *value)
42 ListPair *pair = malloc(sizeof(ListPair));
49 bool list_put(List *list, void *key, void *value)
52 for (pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
53 if (list->cmp((*pairptr)->key, key))
56 *pairptr = make_pair(key, value);
60 void *list_get_cached(List *list, void *key, void *(*provider)(void *key))
63 for (pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
64 if (list->cmp((*pairptr)->key, key))
65 return (*pairptr)->value;
67 return (*pairptr = make_pair(key, provider(key)))->value;
70 void list_set(List *list, void *key, void *value)
73 for (pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
74 if (list->cmp((*pairptr)->key, key))
77 *pairptr = make_pair(key, value);
80 void *list_delete(List *list, void *key)
82 for (ListPair **pairptr = &list->first; *pairptr != NULL; pairptr = &(*pairptr)->next) {
83 if (list->cmp((*pairptr)->key, key)) {
84 ListPair *pair = *pairptr;
85 void *value = (*pairptr)->value;
86 *pairptr = pair->next;
94 void *list_get(List *list, void *key)
96 for (ListPair *pair = list->first; pair != NULL; pair = pair->next)
97 if (list->cmp(pair->key, key))