b8efdef3d7e9e0446100d702e5e8aa10bc9c871b
[monolithium.git] / sdk / list.h
1 /*
2  * list.h
3  *
4  * Copyright (C) 2015 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef __MONOLITHIUM_LIST_H__
21 #define __MONOLITHIUM_LIST_H__
22
23 #include "defs.h"
24
25 #define LIST_INITIALIZER(name) { &name, &name }
26 #define DECLARE_LIST(name) list_entry_t name = LIST_INITIALIZER(name)
27
28 #define list_put_after  list_prepend
29 #define list_put_before list_append
30
31 typedef struct _list_entry_t
32 {
33     struct _list_entry_t *next, *prev;
34 } list_entry_t;
35
36 static inline void list_prepend(list_entry_t *list, list_entry_t *entry)
37 {
38     entry->next = list->next;
39     entry->prev = list;
40     entry->next->prev = entry;
41     entry->prev->next = entry;
42 }
43
44 static inline void list_append(list_entry_t *list, list_entry_t *entry)
45 {
46     entry->next = list;
47     entry->prev = list->prev;
48     entry->next->prev = entry;
49     entry->prev->next = entry;
50 }
51
52 static inline void list_remove(list_entry_t *entry)
53 {
54     entry->next->prev = entry->prev;
55     entry->prev->next = entry->next;
56 }
57
58 static inline void list_init(list_entry_t *list)
59 {
60     list->next = list->prev = list;
61 }
62
63 static inline void list_init_array(list_entry_t *list_array, size_t size)
64 {
65     size_t i;
66     for (i = 0; i < size; i++) list_init(&list_array[i]);
67 }
68
69 #endif