X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/13f9ae4ca658a16c0b9d76fb918032f1c8b9841a..100b1380c49e7e88e1faf2b7314515acf4f635fd:/src/xbt/fifo.c diff --git a/src/xbt/fifo.c b/src/xbt/fifo.c index 7a425f687c..841aebec31 100644 --- a/src/xbt/fifo.c +++ b/src/xbt/fifo.c @@ -331,6 +331,42 @@ int xbt_fifo_is_in(xbt_fifo_t f, void *content) return 0; } +/** + * @brief Search the given element in the fifo using a comparison function + * + * This function allows to search an item with a user provided function instead + * of the pointer comparison used elsewhere in this module. Assume for example that you have a fifo of + * strings. You cannot use xbt_fifo_remove() to remove, say, "TOTO" from it because internally, xbt_fifo_remove() + * will do something like "if (item->content == "toto"), then remove it". And the pointer to the item content + * and the pointer to "toto" will never match. As a solution, the current function provides a way to search elements + * that are semanticaly equivalent instead of only syntaxically. So, removing "Toto" from a fifo can be + * achieved this way: + * + * @verbatim +int my_comparison_function(void *searched, void *seen) { + return !strcmp(searched, seen); +} + + xbt_fifo_remove_item(fifo, + xbt_fifo_search_item(fifo, my_comparison_function, "Toto")); +@endverbatim + * + * \param f a fifo list + * \param cmp_fun the comparison function. Prototype: void *a,void *b -> int. Semantic: returns true iff a=b + * @param closure the element to search. It will be provided as first argument to each call of cmp_fun + * \return the first item matching the comparison function, or NULL if no such item exists + */ +xbt_fifo_item_t xbt_fifo_search_item(xbt_fifo_t f, int_f_pvoid_pvoid_t cmp_fun, void *closure) { + xbt_fifo_item_t item = xbt_fifo_get_first_item(f); + while (item) { + if (cmp_fun(closure, item->content)) + return item; + item = item->next; + } + return NULL; + +} + /** * \param f a list * \return a table with the objects stored in \a f.