forked from thesofproject/sof
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlist.h
More file actions
101 lines (82 loc) · 2.52 KB
/
list.h
File metadata and controls
101 lines (82 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2016 Intel Corporation. All rights reserved.
*
* Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
* Keyon Jie <yang.jie@linux.intel.com>
*/
#ifndef __SOF_LIST_H__
#define __SOF_LIST_H__
/* Really simple list manipulation */
struct list_item;
struct list_item {
struct list_item *next;
struct list_item *prev;
};
/* initialise list before any use - list will point to itself */
static inline void list_init(struct list_item *list)
{
list->next = list;
list->prev = list;
}
/* add new item to the start or head of the list */
static inline void list_item_prepend(struct list_item *item,
struct list_item *list)
{
struct list_item *next = list->next;
next->prev = item;
item->next = next;
item->prev = list;
list->next = item;
}
/* add new item to the end or tail of the list */
static inline void list_item_append(struct list_item *item,
struct list_item *list)
{
struct list_item *tail = list->prev;
tail->next = item;
item->next = list;
item->prev = tail;
list->prev = item;
}
/* delete item from the list leaves deleted list item
*in undefined state list_is_empty will return true
*/
static inline void list_item_del(struct list_item *item)
{
item->next->prev = item->prev;
item->prev->next = item->next;
list_init(item);
}
/* is list item the last item in list ? */
static inline int list_item_is_last(struct list_item *item,
struct list_item *list)
{
return item->next == list;
}
/* is list empty ? */
#define list_is_empty(item) \
((item)->next == item)
#define __list_object(item, type, offset) \
((type *)((char *)(item) - (offset)))
/* get the container object of the list item */
#define list_item(item, type, member) \
__list_object(item, type, offsetof(type, member))
/* get the container object of the first item in the list */
#define list_first_item(list, type, member) \
__list_object((list)->next, type, offsetof(type, member))
/* get the next container object in the list */
#define list_next_item(object, member) \
list_item((object)->member.next, typeof(*(object)), member)
/* list iterator */
#define list_for_item(item, list) \
for (item = (list)->next; item != (list); item = item->next)
/* list iterator */
#define list_for_item_prev(item, list) \
for (item = (list)->prev; item != (list); item = item->prev)
/* list iterator - safe to delete items */
#define list_for_item_safe(item, tmp, list) \
for (item = (list)->next, tmp = item->next;\
item != (list); \
item = tmp, tmp = item->next)
#endif /* __SOF_LIST_H__ */