| /* Simple dictionary |
| * |
| * Copyright 2005 Juan Lang |
| * |
| * This is a pretty basic dictionary, or map if you prefer. It's not |
| * thread-safe. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| #ifndef __DICTIONARY_H__ |
| #define __DICTIONARY_H__ |
| |
| #include <stdarg.h> |
| #include "windef.h" |
| #include "winbase.h" |
| |
| struct dictionary; |
| |
| /* Returns whether key a is less than, equal to, or greater than key b, in |
| * the same way (a - b) would for integers or strcmp(a, b) would for ANSI |
| * strings. |
| */ |
| typedef int (*comparefunc)(const void *a, const void *b, void *extra); |
| |
| /* Called for every element removed from the dictionary. See |
| * dictionary_destroy, dictionary_insert, and dictionary_remove. |
| */ |
| typedef void (*destroyfunc)(void *k, void *v, void *extra); |
| |
| /* Called for each element in the dictionary. Return FALSE if you don't want |
| * to enumerate any more. |
| */ |
| typedef BOOL (*enumeratefunc)(const void *k, const void *v, void *extra, |
| void *closure); |
| |
| /* Constructs a dictionary, using c as a comparison function for keys. |
| * If d is not NULL, it will be called whenever an item is about to be removed |
| * from the table, for example when dictionary_remove is called for a key, or |
| * when dictionary_destroy is called. |
| * extra is passed to c (and d, if it's provided). |
| * Assumes c is not NULL. |
| */ |
| struct dictionary *dictionary_create(comparefunc c, destroyfunc d, void *extra); |
| |
| /* Assumes d is not NULL. */ |
| void dictionary_destroy(struct dictionary *d); |
| |
| /* Returns how many entries have been stored in the dictionary. If two values |
| * with the same key are inserted, only one is counted. |
| */ |
| UINT dictionary_num_entries(struct dictionary *d); |
| |
| /* Sets an element with key k and value v to the dictionary. If a value |
| * already exists with key k, its value is replaced, and the destroyfunc (if |
| * set) is called for the previous item. |
| * Assumes k and v can be bitwise-copied. |
| * Both k and v are allowed to be NULL, in case you want to use integer |
| * values for either the key or the value. |
| * Assumes d is not NULL. |
| */ |
| void dictionary_insert(struct dictionary *d, const void *k, const void *v); |
| |
| /* If a value with key k has been inserted into the dictionary, *v is set |
| * to its associated value. Returns FALSE if the key is not found, and TRUE |
| * if it is. *v is undefined if it returns FALSE. (It is not set to NULL, |
| * because this dictionary doesn't prevent you from using NULL as a value |
| * value; see dictionary_insert.) |
| * Assumes d and v are not NULL. |
| */ |
| BOOL dictionary_find(struct dictionary *d, const void *k, void **v); |
| |
| /* Removes the element with key k from the dictionary. Calls the destroyfunc |
| * for the dictionary with the element if found (so you may destroy it if it's |
| * dynamically allocated.) |
| * Assumes d is not NULL. |
| */ |
| void dictionary_remove(struct dictionary *d, const void *k); |
| |
| void dictionary_enumerate(struct dictionary *d, enumeratefunc e, void *closure); |
| |
| #endif /* ndef __DICTIONARY_H__ */ |