1/*
2 * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _FSSH_LIST_H
6#define _FSSH_LIST_H
7
8
9#include "fssh_types.h"
10
11
12/* This header defines a doubly-linked list. It differentiates between a link
13 * and an item.
14 * A link is what is put into and removed from a list, an item is the whole
15 * object that contains the link. The item doesn't have to be begin with a
16 * link; the offset to the link structure is given to init_list_etc(), so that
17 * list_get_next/prev_item() will work correctly.
18 * Note, the offset value is only needed for the *_item() functions. If the
19 * offset is 0, list_link and item are identical - if you use init_list(),
20 * you don't have to care about the difference between a link and an item.
21 */
22
23
24namespace FSShell {
25
26
27typedef struct list_link list_link;
28
29/* The object that is put into the list must begin with these
30 * fields, but it doesn't have to be this structure.
31 */
32
33struct list_link {
34	list_link *next;
35	list_link *prev;
36};
37
38struct list {
39	list_link	link;
40	int32_t		offset;
41};
42
43
44extern void list_init(struct list *list);
45extern void list_init_etc(struct list *list, int32_t offset);
46extern void list_add_link_to_head(struct list *list, void *_link);
47extern void list_add_link_to_tail(struct list *list, void *_link);
48extern void list_remove_link(void *_link);
49extern void *list_get_next_item(struct list *list, void *item);
50extern void *list_get_prev_item(struct list *list, void *item);
51extern void *list_get_last_item(struct list *list);
52extern void list_add_item(struct list *list, void *item);
53extern void list_remove_item(struct list *list, void *item);
54extern void list_insert_item_before(struct list *list, void *before, void *item);
55extern void *list_remove_head_item(struct list *list);
56extern void *list_remove_tail_item(struct list *list);
57extern void list_move_to_list(struct list *sourceList, struct list *targetList);
58
59static inline bool
60list_is_empty(struct list *list)
61{
62	return list->link.next == (list_link *)list;
63}
64
65static inline void *
66list_get_first_item(struct list *list)
67{
68	return list_get_next_item(list, NULL);
69}
70
71
72}	// namespace FSShell
73
74#endif	/* _FSSH_LIST_H */
75