summaryrefslogtreecommitdiffstats
path: root/list.h
diff options
context:
space:
mode:
authorManuel Bachmann <manuel.bachmann@iot.bzh>2016-06-09 18:22:08 +0200
committerYannick Gicquel <yannick.gicquel@iot.bzh>2016-10-11 17:09:06 +0200
commit6c2aef81c4182695487fabbd19c5c0a84409b49f (patch)
tree00343bff2a76a3193ac3c586c97f63c26e37f6b4 /list.h
parent0d031cbfdcb94efa7daa596df5106666b12e9e2b (diff)
Initial commit
Change-Id: Ic974941bdd30309b4adb72b7a05959332750210b Signed-off-by: Manuel Bachmann <manuel.bachmann@iot.bzh>
Diffstat (limited to 'list.h')
-rw-r--r--list.h48
1 files changed, 48 insertions, 0 deletions
diff --git a/list.h b/list.h
new file mode 100644
index 0000000..5cc1473
--- /dev/null
+++ b/list.h
@@ -0,0 +1,48 @@
+#ifndef paagllist
+#define paagllist
+
+#define AGL_DLIST_INIT(self) \
+ do { \
+ (&(self))->prev = &(self); \
+ (&(self))->next = &(self); \
+ } while(0)
+
+#define AGL_OFFSET(structure, member) \
+ ((int)((char *)((&((structure *)0)->member)) - (char *)0))
+
+#define AGL_LIST_RELOCATE(structure, member, ptr) \
+ ((structure *)(void *)((char *)ptr - AGL_OFFSET(structure, member)))
+
+#define AGL_DLIST_FOR_EACH(structure, member, pos, head) \
+ for (pos = AGL_LIST_RELOCATE(structure, member, (head)->next); \
+ &pos->member != (head); \
+ pos = AGL_LIST_RELOCATE(structure, member, pos->member.next))
+
+#define AGL_DLIST_FOR_EACH_SAFE(structure, member, pos, n, head) \
+ for (pos = AGL_LIST_RELOCATE(structure, member, (head)->next), \
+ n = AGL_LIST_RELOCATE(structure, member, pos->member.next); \
+ &pos->member != (head); \
+ pos = n, \
+ n = AGL_LIST_RELOCATE(structure, member, pos->member.next))
+
+#define AGL_DLIST_FOR_EACH_BACKWARDS(structure, member, pos, head) \
+ for (pos = AGL_LIST_RELOCATE(structure, member, (head)->prev); \
+ &pos->member != (head); \
+ pos = AGL_LIST_RELOCATE(structure, member, pos->member.prev))
+
+#define AGL_DLIST_UNLINK(structure, member, elem) \
+ do { \
+ agl_dlist *after = (elem)->member.prev; \
+ agl_dlist *before = (elem)->member.next; \
+ after->next = before; \
+ before->prev = after; \
+ (elem)->member.prev = (elem)->member.next = &(elem)->member; \
+ } while(0)
+
+
+typedef struct agl_dlist {
+ struct agl_dlist *prev;
+ struct agl_dlist *next;
+} agl_dlist;
+
+#endif