diff options
author | Manuel Bachmann <manuel.bachmann@iot.bzh> | 2016-06-09 18:22:08 +0200 |
---|---|---|
committer | Yannick Gicquel <yannick.gicquel@iot.bzh> | 2016-10-11 17:09:06 +0200 |
commit | 6c2aef81c4182695487fabbd19c5c0a84409b49f (patch) | |
tree | 00343bff2a76a3193ac3c586c97f63c26e37f6b4 /list.h | |
parent | 0d031cbfdcb94efa7daa596df5106666b12e9e2b (diff) |
Initial commit
Change-Id: Ic974941bdd30309b4adb72b7a05959332750210b
Signed-off-by: Manuel Bachmann <manuel.bachmann@iot.bzh>
Diffstat (limited to 'list.h')
-rw-r--r-- | list.h | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -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 |