]>
Commit | Line | Data |
---|---|---|
064af421 | 1 | /* |
e0edde6f | 2 | * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc. |
064af421 | 3 | * |
a14bc59f BP |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
064af421 | 7 | * |
a14bc59f BP |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
064af421 BP |
15 | */ |
16 | #ifndef LIST_H | |
17 | #define LIST_H 1 | |
18 | ||
19 | /* Doubly linked list. */ | |
20 | ||
21 | #include <stdbool.h> | |
22 | #include <stddef.h> | |
23 | #include "util.h" | |
24 | ||
25 | /* Doubly linked list head or element. */ | |
847c7448 | 26 | struct list { |
064af421 BP |
27 | struct list *prev; /* Previous list element. */ |
28 | struct list *next; /* Next list element. */ | |
847c7448 | 29 | }; |
064af421 BP |
30 | |
31 | #define LIST_INITIALIZER(LIST) { LIST, LIST } | |
32 | ||
33 | void list_init(struct list *); | |
b3907fbc | 34 | void list_poison(struct list *); |
064af421 BP |
35 | |
36 | /* List insertion. */ | |
37 | void list_insert(struct list *, struct list *); | |
38 | void list_splice(struct list *before, struct list *first, struct list *last); | |
39 | void list_push_front(struct list *, struct list *); | |
40 | void list_push_back(struct list *, struct list *); | |
41 | void list_replace(struct list *, const struct list *); | |
42 | void list_moved(struct list *); | |
43 | ||
44 | /* List removal. */ | |
45 | struct list *list_remove(struct list *); | |
46 | struct list *list_pop_front(struct list *); | |
47 | struct list *list_pop_back(struct list *); | |
48 | ||
49 | /* List elements. */ | |
0574c613 BP |
50 | struct list *list_front(const struct list *); |
51 | struct list *list_back(const struct list *); | |
064af421 BP |
52 | |
53 | /* List properties. */ | |
54 | size_t list_size(const struct list *); | |
55 | bool list_is_empty(const struct list *); | |
dc1539ae BP |
56 | bool list_is_singleton(const struct list *); |
57 | bool list_is_short(const struct list *); | |
064af421 | 58 | |
4e8e4213 | 59 | #define LIST_FOR_EACH(ITER, MEMBER, LIST) \ |
772ec52b | 60 | for (ASSIGN_CONTAINER(ITER, (LIST)->next, MEMBER); \ |
4e8e4213 | 61 | &(ITER)->MEMBER != (LIST); \ |
772ec52b | 62 | ASSIGN_CONTAINER(ITER, (ITER)->MEMBER.next, MEMBER)) |
4e8e4213 | 63 | #define LIST_FOR_EACH_REVERSE(ITER, MEMBER, LIST) \ |
772ec52b | 64 | for (ASSIGN_CONTAINER(ITER, (LIST)->prev, MEMBER); \ |
4e8e4213 | 65 | &(ITER)->MEMBER != (LIST); \ |
772ec52b BP |
66 | ASSIGN_CONTAINER(ITER, (ITER)->MEMBER.prev, MEMBER)) |
67 | #define LIST_FOR_EACH_SAFE(ITER, NEXT, MEMBER, LIST) \ | |
68 | for (ASSIGN_CONTAINER(ITER, (LIST)->next, MEMBER); \ | |
69 | (&(ITER)->MEMBER != (LIST) \ | |
70 | ? ASSIGN_CONTAINER(NEXT, (ITER)->MEMBER.next, MEMBER) \ | |
71 | : 0); \ | |
72 | (ITER) = (NEXT)) | |
064af421 BP |
73 | |
74 | #endif /* list.h */ |