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) {.next = &l, .prev = &l} 20 #define CONTAINER_OF(ptr, type, field) \ 21 ((type *)((char *)ptr - offsetof(type, field))) 22 list_init(struct list_entry * e)23static inline void list_init(struct list_entry *e) 24 { 25 e->next = e; 26 e->prev = e; 27 } 28 list_append(struct list_entry * l,struct list_entry * e)29static inline void list_append(struct list_entry *l, struct list_entry *e) 30 { 31 e->next = l; 32 e->prev = l->prev; 33 34 e->next->prev = e; 35 e->prev->next = e; 36 } 37 list_prepend(struct list_entry * l,struct list_entry * e)38static inline void list_prepend(struct list_entry *l, struct list_entry *e) 39 { 40 e->next = l->next; 41 e->prev = l; 42 43 e->next->prev = e; 44 e->prev->next = e; 45 } 46 list_empty(struct list_entry * l)47static inline bool list_empty(struct list_entry *l) 48 { 49 return l->next == l; 50 } 51 list_remove(struct list_entry * e)52static inline void list_remove(struct list_entry *e) 53 { 54 e->prev->next = e->next; 55 e->next->prev = e->prev; 56 list_init(e); 57 } 58