#ifndef __CIRCULARLIST__ #define __CIRCULARLIST__ /** * ciruclar double linked list implementation * **/ #include "util.h" #include struct circular_list { struct circular_list *next; struct circular_list *prev; }; #define CIRCULARLIST_INIT(name) do { (name)->next = (name); (name)->prev = (name); } while(0); static int inline __circular_list_insert(struct circular_list *prev, struct circular_list *new, struct circular_list *next) { prev->next = new; new->prev = prev; new->next = next; next->prev = new; } static int inline circular_list_insert_after(struct circular_list *list, struct circular_list *new_elem) { return __circular_list_insert(list, new_elem, list->next); } static int inline circular_list_insert_before(struct circular_list *list, struct circular_list *new_elem) { return __circular_list_insert(list->prev, new_elem, list); } static void inline __circular_list_delete(struct circular_list *prev, struct circular_list *elem, struct circular_list *next) { prev->next = next; next->prev = prev; elem->next = elem; elem->prev = elem; } static void inline circular_list_delete(struct circular_list *elem) { __circular_list_delete(elem->prev, elem, elem->next); } #define circular_list_get_prev(elem) (elem)->prev #define circular_list_get_next(elem) (elem)->next #define CIRCULARLIST_FOR_EACH(pos, head) for(pos = head->next; pos != head; pos = pos->next) #define CONTAINER_OF(ptr, type, member) ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member))) #endif