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

Reply via email to