From e06df9182cf6b4fa3e4b96758d1e846cf0fd1f07 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 17 Feb 2011 07:29:12 +0000 Subject: [PATCH] +eina_list_move* for moving list node data to another list SVN revision: 57110 --- legacy/eina/ChangeLog | 4 ++ legacy/eina/src/include/eina_list.h | 4 ++ legacy/eina/src/lib/eina_list.c | 59 +++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/legacy/eina/ChangeLog b/legacy/eina/ChangeLog index fdd1d0fe0d..c36045ee45 100644 --- a/legacy/eina/ChangeLog +++ b/legacy/eina/ChangeLog @@ -18,3 +18,7 @@ * Added eina_unicode_utf8* functions for utf8 string handling and conversions to and from Eina_Unicode + +2011-02-17 Mike Blumenkrantz + + * Added eina_list_move* functions for moving list node data to other lists diff --git a/legacy/eina/src/include/eina_list.h b/legacy/eina/src/include/eina_list.h index e19d67d88d..5a750d1e17 100644 --- a/legacy/eina/src/include/eina_list.h +++ b/legacy/eina/src/include/eina_list.h @@ -110,6 +110,10 @@ EAPI Eina_List *eina_list_demote_list(Eina_List *list, Eina_List *mov EAPI void *eina_list_data_find(const Eina_List *list, const void *data) EINA_PURE EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; EAPI Eina_List *eina_list_data_find_list(const Eina_List *list, const void *data) EINA_PURE EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; + +EAPI Eina_Bool eina_list_move(Eina_List **to, Eina_List **from, void *data); +EAPI Eina_Bool eina_list_move_list(Eina_List **to, Eina_List **from, Eina_List *data); + EAPI Eina_List *eina_list_free(Eina_List *list); EAPI void *eina_list_nth(const Eina_List *list, unsigned int n) EINA_PURE EINA_WARN_UNUSED_RESULT; diff --git a/legacy/eina/src/lib/eina_list.c b/legacy/eina/src/lib/eina_list.c index f3a4710543..fb59aae752 100644 --- a/legacy/eina/src/lib/eina_list.c +++ b/legacy/eina/src/lib/eina_list.c @@ -1200,6 +1200,65 @@ eina_list_data_find(const Eina_List *list, const void *data) return NULL; } +/** + * @brief Move a data pointer from one list to another + * + * @param to The list to move the data to + * @param from The list to move from + * @param data The data to move + * @return #EINA_TRUE on success, else #EINA_FALSE + * + * This function is a shortcut for doing the following: + * to = eina_list_append(to, data); + * from = eina_list_remove(from, data); + */ +EAPI Eina_Bool +eina_list_move(Eina_List **to, Eina_List **from, void *data) +{ + Eina_List *l; + + EINA_SAFETY_ON_NULL_RETURN_VAL(to, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(from, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); + + EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE); + EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE); + + l = eina_list_data_find_list(*from, data); + if (!l) return EINA_FALSE; /* should this be SAFETY_ON_NULL for a warning? */ + + *to = eina_list_append(*to, data); + *from = eina_list_remove_list(*from, l); + return EINA_TRUE; +} + +/** + * @brief Move a list node from one list to another + * + * @param to The list to move the data to + * @param from The list to move from + * @param data The list node containing the data to move + * @return #EINA_TRUE on success, else #EINA_FALSE + * + * This function is a shortcut for doing the following: + * to = eina_list_append(to, data->data); + * from = eina_list_remove_list(from, data); + */ +EAPI Eina_Bool +eina_list_move_list(Eina_List **to, Eina_List **from, Eina_List *data) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(to, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(from, EINA_FALSE); + + EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE); + EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE); + EINA_MAGIC_CHECK_LIST(data, EINA_FALSE); + + *to = eina_list_append(*to, data->data); + *from = eina_list_remove_list(*from, data); + return EINA_TRUE; +} + /** * @brief Find a member of a list and return the list node containing that member. *