summaryrefslogtreecommitdiff
path: root/libqueue/queue/sq.h
blob: e0a22cf80d15a61b02fe35fd96133e590ffba208 (plain)
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
/* vim: set ts=4 sw=4 ai:
 * sq.h -- singly linked queue implementation derived from NetBSD's queue.h
 */

#ifndef SQ_H
#define SQ_H

struct sqe {
	void *data;
	struct sqe *next;
};

struct sqh {
	struct sqe *first;
	struct sqe **last;
};

#define sq_first(hd) ((hd)->first)
#define sq_last(hd) (*(((struct sqh *)(void *)((hd)->last))->last))
#define sq_next(e) ((e)->next)
#define sq_empty(hd) (((hd)->first) == NULL)
#define sq_init(hd) do { \
	(hd)->first = NULL; \
	(hd)->last = &(hd)->first; \
} while (0)

#define sq_foreach(var,head) \
	for ((var) = ((head)->first); \
		(var) != NULL; \
		(var) = ((var)->next))

#define sq_foreach_safe(var,head,vnext) \
	for ((var) = ((head)->first); \
		(var) != NULL && ((vnext) = sq_next((var)), 1); \
		(var) = (vnext))

struct sqh *sq_new(void);
struct sqe *sq_elem_new(void *);
void sq_insert_head(struct sqh *, struct sqe *);
void sq_insert_tail(struct sqh *, struct sqe *);
void sq_insert_after(struct sqh *, struct sqe *, struct sqe *);
void sq_remove_head(struct sqh *);
void sq_remove_after(struct sqh *, struct sqe *);
void sq_remove(struct sqh *, struct sqe *);
void sq_concat(struct sqh *, struct sqh *);
void sq_cleanup(struct sqh *, void (*)(void *));
struct sqe *sq_find_from_data(struct sqh *, const void *, int (*)(const void *, const void *));

#endif/*!SQ_H*/