Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=b58e3982c2c935b7b0ef7784743f10fc832a2ec7
commit b58e3982c2c935b7b0ef7784743f10fc832a2ec7 Author: Michel Hermier <[email protected]> Date: Sun Jun 9 17:45:21 2013 +0200 libflib: Add f_(r)foreach(_safe) macros and their f_list_(r)foreach(_safe) counterparts. diff --git a/lib/libflib/flist.c b/lib/libflib/flist.c index dd13231..7e0ce08 100644 --- a/lib/libflib/flist.c +++ b/lib/libflib/flist.c @@ -190,6 +190,50 @@ size_t f_list_count (FList *list) { return count; } +void f_list_foreach (FList *list, FVisitorFunc fn, void *user_data) { + FListItem *it; + + if (fn == NULL) { + return; + } + __f_foreach (it, list) { + fn (it, user_data); + } +} + +void f_list_foreach_safe (FList *list, FVisitorFunc fn, void *user_data) { + FListItem *it, *next; + + if (fn == NULL) { + return; + } + f_foreach_safe (it, next, list) { + fn (it, user_data); + } +} + +void f_list_rforeach (FList *list, FVisitorFunc fn, void *user_data) { + FListItem *it; + + if (fn == NULL) { + return; + } + __f_rforeach (it, list) { + fn (fn, user_data); + } +} + +void f_list_rforeach_safe (FList *list, FVisitorFunc fn, void *user_data) { + FListItem *it, *next; + + if (fn == NULL) { + return; + } + f_rforeach_safe (it, next, list) { + fn (it, user_data); + } +} + /* DO NOT MAKE PUBLIC FOR NOW: * Require list implemantation change. */ diff --git a/lib/libflib/flist.h b/lib/libflib/flist.h index 4f58817..db421ee 100644 --- a/lib/libflib/flist.h +++ b/lib/libflib/flist.h @@ -67,6 +67,10 @@ void f_list_add (FList *list, FListItem *listitem); void f_list_add_sorted (FList *list, FListItem *listitem, FCompareFunc fn, void *user_data); void f_list_append (FList *list, FListItem *listitem); size_t f_list_count (FList *list); +void f_list_foreach (FList *list, FVisitorFunc fn, void *user_data); +void f_list_foreach_safe (FList *list, FVisitorFunc fn, void *user_data); +void f_list_rforeach (FList *list, FVisitorFunc fn, void *user_data); +void f_list_rforeach_safe (FList *list, FVisitorFunc fn, void *user_data); #define f_list_entry(ptr, type, member) \ f_containerof (f_identity_cast (FListItem *, ptr), type, member) @@ -78,25 +82,45 @@ size_t f_list_count (FList *list); f_list_entry (f_identity_cast (type *, ptr)->member.previous, type, member) #define __f_foreach(it, list) \ - for (it = f_list_begin (f_identity_cast(FList *, list)); \ + for (it = f_list_begin (list); \ it != f_list_end (list); \ it = f_identity_cast(FListItem *, it)->next) +#define f_foreach_safe(it, next, list) \ + for (it = f_list_begin (list), next = f_identity_cast (FListItem *, it)->next; \ + it != f_list_end (list); \ + it = next, next = f_identity_cast (FListItem *, it)->next) + #define f_foreach_entry(it, list, member) \ for (it = f_list_entry (f_list_begin (list), f_typeof (*it), member); \ &it->member != f_list_end (list); \ it = f_list_entry_next (it, f_typeof (*it), member)) +#define f_foreach_entry_safe(it, next, list, member) \ + for (it = f_list_entry (f_list_begin (list), f_typeof (*it), member), next = f_list_entry_next (it, f_typeof (*it), member); \ + &it->member != f_list_end (list); \ + it = next, next = f_list_entry_next (it, f_typeof (*it), member)) + #define __f_rforeach(it, list) \ - for (it = f_list_rbegin (f_identity_cast(FList *, list)); \ - it != f_list_rend (FList *, list); \ + for (it = f_list_rbegin (list); \ + it != f_list_rend (list); \ it = f_identity_cast(FListItem *, it)->previous) +#define f_rforeach_safe(it, next, list) \ + for (it = f_list_rbegin (list), next = f_identity_cast(FListItem *, it)->previous; \ + it != f_list_rend (list); \ + it = next, next = f_identity_cast (FListItem *, it)->previous) + #define f_rforeach_entry(it, list, member) \ for (it = f_list_entry (f_list_rbegin (list), f_typeof (*it), member); \ &it->member != f_list_rend (list); \ it = f_list_entry_previous (it, f_typeof(*it), member)) +#define f_rforeach_entry_next(it, list, member) \ + for (it = f_list_entry (f_list_rbegin (list), f_typeof (*it), member), next = f_list_entry_previous (it, f_typeof(*it), member); \ + &it->member != f_list_rend (list); \ + it = next, next = f_list_entry_previous (it, f_typeof(*it), member)) + typedef struct FPtrListItem FPtrListItem; struct FPtrListItem { _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
