5 #ifndef _INTRO_LISTS_H_ 6 #define _INTRO_LISTS_H_ 30 #ifdef INT_COMPILER_MSVC 31 # define OFFSET_OF(Type, Member) ((size_t) &((Type *)0)->Member) 33 # define OFFSET_OF(Type, Member) __builtin_offsetof(Type, Member) 34 #endif // INT_COMPILER_MSVC 36 #define CONTAINING_RECORD(List, Type, Member) (Type *)((size_t)(List) - OFFSET_OF(Type, Member)) 39 #define LIST_HEAD_INIT(Name) { { .Head = &(Name) }, { .Tail = &(Name) } } 41 #define list_for_each(_head, _struct_type, _var) _list_for_each(_head, _struct_type, Link, _var) 42 #define list_for_next(_start, _head, _type, _var) _list_for_next(_start, _head, _type, Link, _var) 43 #define list_for_each_link(_head, _struct_type, _member, _var) _list_for_each(_head, _struct_type, _member, _var) 48 #define _next(_var, _member) _var->_member.Flink 49 #define _next_entry(_var, _member, _type) CONTAINING_RECORD(_next(_var, _member), _type, _member) 51 #define PREPROC_CONCAT(a, b) PREPROC_CONCAT_1(a, b) 52 #define PREPROC_CONCAT_1(a, b) PREPROC_CONCAT_2(~, a ## b) 53 #define PREPROC_CONCAT_2(p, res) res 55 #define UNIQUE_NAME(base) PREPROC_CONCAT(base, __LINE__) 57 #define _list_for_each(_head, _type, _member, _var) \ 58 for (_type *_var = CONTAINING_RECORD(_head.Flink, _type, _member), *UNIQUE_NAME(_n) = _next_entry(_var, _member, _type); \ 59 &_var->_member != &_head; \ 60 _var = UNIQUE_NAME(_n), UNIQUE_NAME(_n) = _next_entry(_var, _member, _type)) 62 #define _list_for_next(_start, _head, _type, _member, _var) \ 63 for (_type *_var = _next_entry(_start, _member, _type), *UNIQUE_NAME(_n) = _next_entry(_var, _member, _type); \ 64 &_var->_member != &_head; \ 65 _var = UNIQUE_NAME(_n), UNIQUE_NAME(_n) = _next_entry(_var, _member, _type)) 100 return (
BOOLEAN)(flink == blink);
112 ListHead->
Flink = flink;
113 flink->
Blink = ListHead;
127 ListHead->
Blink = blink;
128 blink->
Flink = ListHead;
142 Entry->
Flink = ListHead;
143 Entry->
Blink = blink;
145 blink->
Flink = Entry;
147 ListHead->
Blink = Entry;
160 Entry->
Blink = ListHead;
162 Flink->
Blink = Entry;
164 ListHead->
Flink = Entry;
181 #endif // _INTRO_LISTS_H_
static void InsertHeadList(LIST_ENTRY *ListHead, LIST_ENTRY *Entry)
struct _LIST_ENTRY * Flink
static BOOLEAN IsListEmpty(const LIST_ENTRY *ListHead)
struct _LIST_ENTRY * Head
static LIST_ENTRY * RemoveHeadList(LIST_ENTRY *ListHead)
struct _LIST_ENTRY * PLIST_HEAD
static BOOLEAN RemoveEntryList(LIST_ENTRY *Entry)
struct _LIST_ENTRY LIST_HEAD
static void InsertAfterList(LIST_ENTRY *Pivot, LIST_ENTRY *Item)
static void InsertTailList(LIST_ENTRY *ListHead, LIST_ENTRY *Entry)
struct _LIST_ENTRY LIST_ENTRY
static void InitializeListHead(LIST_ENTRY *ListHead)
struct _LIST_ENTRY * PLIST_ENTRY
struct _LIST_ENTRY * Tail
struct _LIST_ENTRY * Blink
static LIST_ENTRY * RemoveTailList(LIST_ENTRY *ListHead)