diff -r 000000000000 -r 0e761a78d257 gstreamer_core/gst/gstfilter.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/gst/gstfilter.c Thu Dec 17 08:53:32 2009 +0200 @@ -0,0 +1,92 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library 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. + */ + +/** + * SECTION:gstfilter + * @short_description: A utility function to filter GLists. + * + * + * Filtering a list + * + * GList *node; + * GstObject *result = NULL; + * + * node = gst_filter_run (list, (GstFilterFunc) my_filter, TRUE, NULL); + * if (node) { + * result = GST_OBJECT (node->data); + * gst_object_ref (result); + * gst_list_free (node); + * } + * + * + */ +#include "gst_private.h" +#include + +/** + * gst_filter_run: + * @list: a linked list + * @func: the function to execute for each item + * @first: flag to stop execution after a successful item + * @user_data: user data + * + * Iterates over the elements in @list, calling @func with the + * list item data for each item. If @func returns TRUE, @data is + * prepended to the list of results returned. If @first is true, + * the search is halted after the first result is found. + * + * Since gst_filter_run() knows nothing about the type of @data, no + * reference will be taken (if @data refers to an object) and no copy of + * @data wil be made in any other way when prepending @data to the list of + * results. + * + * Returns: the list of results. Free with g_list_free() when no longer needed + * (the data contained in the list is a flat copy and does need to be + * unreferenced or freed). + */ +#ifdef __SYMBIAN32__ +EXPORT_C +#endif + +GList * +gst_filter_run (const GList * list, GstFilterFunc func, gboolean first, + gpointer user_data) +{ + const GList *walk = list; + GList *result = NULL; + + while (walk) { + gboolean res = TRUE; + gpointer data = walk->data; + + walk = g_list_next (walk); + + if (func) + res = func (data, user_data); + + if (res) { + result = g_list_prepend (result, data); + + if (first) + break; + } + } + + return result; +}