1 /*
2  * Copyright 2018 The Hafnium Authors.
3  *
4  * Use of this source code is governed by a BSD-style
5  * license that can be found in the LICENSE file or at
6  * https://opensource.org/licenses/BSD-3-Clause.
7  */
8 
9 #pragma once
10 
11 #include <stdbool.h>
12 #include <stddef.h>
13 
14 struct list_entry {
15 	struct list_entry *next;
16 	struct list_entry *prev;
17 };
18 
19 #define LIST_INIT(l)                   \
20 	{                              \
21 		.next = &l, .prev = &l \
22 	}
23 #define CONTAINER_OF(ptr, type, field) \
24 	((type *)((char *)ptr - offsetof(type, field)))
25 
list_init(struct list_entry * e)26 static inline void list_init(struct list_entry *e)
27 {
28 	e->next = e;
29 	e->prev = e;
30 }
31 
list_append(struct list_entry * l,struct list_entry * e)32 static inline void list_append(struct list_entry *l, struct list_entry *e)
33 {
34 	e->next = l;
35 	e->prev = l->prev;
36 
37 	e->next->prev = e;
38 	e->prev->next = e;
39 }
40 
list_prepend(struct list_entry * l,struct list_entry * e)41 static inline void list_prepend(struct list_entry *l, struct list_entry *e)
42 {
43 	e->next = l->next;
44 	e->prev = l;
45 
46 	e->next->prev = e;
47 	e->prev->next = e;
48 }
49 
list_empty(struct list_entry * l)50 static inline bool list_empty(struct list_entry *l)
51 {
52 	return l->next == l;
53 }
54 
list_remove(struct list_entry * e)55 static inline void list_remove(struct list_entry *e)
56 {
57 	e->prev->next = e->next;
58 	e->next->prev = e->prev;
59 	list_init(e);
60 }
61