add ecore_list_find() to find a data node via a compare callback

SVN revision: 27578
This commit is contained in:
rephorm 2006-12-28 03:30:11 +00:00 committed by rephorm
parent 5f7e0aec95
commit affe150318
2 changed files with 32 additions and 0 deletions

View File

@ -113,6 +113,8 @@ extern "C" {
/* Traversing the list and returning data */
EAPI void *ecore_list_next(Ecore_List * list);
EAPI void *ecore_list_find(Ecore_List *list, Ecore_Compare_Cb function,
void *user_data);
/* Check to see if there is any data in the list */
EAPI int ecore_list_is_empty(Ecore_List * list);

View File

@ -25,6 +25,7 @@ static void *_ecore_list_goto_index(Ecore_List *list, int index);
/* Iterative function */
static int _ecore_list_for_each(Ecore_List *list, Ecore_For_Each function,
void *user_data);
static void *_ecore_list_find(Ecore_List *list, Ecore_Compare_Cb function, void *user_data);
/* Private double linked list functions */
static void *_ecore_dlist_previous(Ecore_DList * list);
@ -1020,6 +1021,35 @@ _ecore_list_for_each(Ecore_List *list, Ecore_For_Each function, void *user_data)
return TRUE;
}
/**
* Find data in @p list using the compare function @p func
* @param list The list.
* @param function The function to test each node of @p list with
* @param user_data Data to match against (used by @p function)
* @return the first matching data node, or NULL if none match
*/
EAPI void *
ecore_list_find(Ecore_List *list, Ecore_Compare_Cb function, void *user_data)
{
CHECK_PARAM_POINTER_RETURN("list", list, NULL);
return _ecore_list_find(list, function, user_data);
}
/* The real meat of finding a node via a compare cb */
static void *
_ecore_list_find(Ecore_List *list, Ecore_Compare_Cb function, void *user_data)
{
void *value;
if (!list || !function) return NULL;
_ecore_list_goto_first(list);
while ((value = _ecore_list_next(list)) != NULL)
if (!function(value, user_data)) return value;
return NULL;
}
/* Initialize a node to starting values */
EAPI int
ecore_list_node_init(Ecore_List_Node *node)