diff options
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 |