1.1.7
by Michael Tokarev
Import upstream version 1.7.3 |
1 |
#ifndef __LIST_H
|
2 |
#define __LIST_H
|
|
3 |
||
4 |
#include "types.h" // container_of |
|
5 |
||
6 |
||
7 |
/****************************************************************
|
|
8 |
* hlist - Double linked lists with a single pointer list head
|
|
9 |
****************************************************************/
|
|
10 |
||
11 |
struct hlist_node { |
|
12 |
struct hlist_node *next, **pprev; |
|
13 |
};
|
|
14 |
||
15 |
struct hlist_head { |
|
16 |
struct hlist_node *first; |
|
17 |
};
|
|
18 |
||
19 |
static inline int |
|
20 |
hlist_empty(const struct hlist_head *h) |
|
21 |
{
|
|
22 |
return !h->first; |
|
23 |
}
|
|
24 |
||
25 |
static inline void |
|
26 |
hlist_del(struct hlist_node *n) |
|
27 |
{
|
|
28 |
struct hlist_node *next = n->next; |
|
29 |
struct hlist_node **pprev = n->pprev; |
|
30 |
*pprev = next; |
|
31 |
if (next) |
|
32 |
next->pprev = pprev; |
|
33 |
}
|
|
34 |
||
35 |
static inline void |
|
36 |
hlist_add(struct hlist_node *n, struct hlist_node **pprev) |
|
37 |
{
|
|
38 |
struct hlist_node *next = *pprev; |
|
39 |
n->pprev = pprev; |
|
40 |
n->next = next; |
|
41 |
if (next) |
|
42 |
next->pprev = &n->next; |
|
43 |
*pprev = n; |
|
44 |
}
|
|
45 |
||
46 |
static inline void |
|
47 |
hlist_add_head(struct hlist_node *n, struct hlist_head *h) |
|
48 |
{
|
|
49 |
hlist_add(n, &h->first); |
|
50 |
}
|
|
51 |
||
52 |
static inline void |
|
53 |
hlist_add_before(struct hlist_node *n, struct hlist_node *next) |
|
54 |
{
|
|
55 |
hlist_add(n, next->pprev); |
|
56 |
}
|
|
57 |
||
58 |
static inline void |
|
59 |
hlist_add_after(struct hlist_node *n, struct hlist_node *prev) |
|
60 |
{
|
|
61 |
hlist_add(n, &prev->next); |
|
62 |
}
|
|
63 |
||
64 |
#define hlist_for_each_entry(pos, head, member) \
|
|
65 |
for (pos = container_of((head)->first, typeof(*pos), member) \
|
|
66 |
; pos != container_of(NULL, typeof(*pos), member) \
|
|
67 |
; pos = container_of(pos->member.next, typeof(*pos), member))
|
|
68 |
||
69 |
#define hlist_for_each_entry_safe(pos, n, head, member) \
|
|
70 |
for (pos = container_of((head)->first, typeof(*pos), member) \
|
|
71 |
; pos != container_of(NULL, typeof(*pos), member) \
|
|
72 |
&& ({ n = pos->member.next; 1; }) \
|
|
73 |
; pos = container_of(n, typeof(*pos), member))
|
|
74 |
||
75 |
#define hlist_for_each_entry_pprev(pos, pprev, head, member) \
|
|
76 |
for (pprev = &(head)->first \
|
|
77 |
; *pprev && ({ pos=container_of(*pprev, typeof(*pos), member); 1; }) \
|
|
78 |
; pprev = &(*pprev)->next)
|
|
79 |
||
80 |
||
81 |
#endif // list.h |