00001
00012 #ifndef __KERN_LIST_H__
00013 #define __KERN_LIST_H__
00014
00015
00016 typedef struct ListNode
00017 {
00018
00019 struct ListNode * next;
00020
00021 struct ListNode * previous;
00022 } ListNode;
00023
00024
00025 typedef ListNode * ListIterator;
00026
00027
00028
00029
00030
00031
00032 typedef struct
00033 {
00034
00035 ListNode sentinel;
00036 } List;
00037
00038 #define list_begin(list) ((list) -> sentinel.next)
00039 #define list_end(list) (& (list) -> sentinel)
00040 #define list_next(iterator) ((iterator) -> next)
00041 #define list_previous(iterator) ((iterator) -> previous)
00042
00043 #define list_front(list) ((void *) list_begin (list))
00044 #define list_back(list) ((void *) list_previous (list_end (list)))
00045
00046 #define list_empty(list) (list_begin (list) == list_end (list))
00047
00048 #define list_insert_front(list,value) (list_insert (list_begin (list), (value)))
00049 #define list_insert_back(list,value) (list_insert (list_end (list), (value)))
00050
00051 #define list_remove_front(list) (list_remove (list_begin (list)))
00052 #define list_remove_back(list) (list_remove (list_previous (list_end (list))))
00053
00054 #define LIST_ELEMENT(node,type,field) \
00055 ((type *) ((char *) (node) - (unsigned int) & ((type *) 0) -> field))
00056
00065 extern void list_clear (List * list);
00075 extern ListIterator list_insert (ListIterator position, void *value);
00084 extern void * list_remove (ListIterator position);
00093 extern unsigned int list_size (List * list);
00094
00095 #endif
00096