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)26static 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)32static 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)41static 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)50static inline bool list_empty(struct list_entry *l) 51 { 52 return l->next == l; 53 } 54 list_remove(struct list_entry * e)55static 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