linked-list.h
Raw
1#ifndef LINKED_LIST_H
2#define LINKED_LIST_H
3
4#include <cutils/common.h>
5#include <stdlib.h>
6
7typedef struct SLnode
8{
9 void* item;
10 struct SLnode* next;
11} SLnode;
12
13typedef struct DLnode
14{
15 void* item;
16 struct DLnode* next;
17 struct DLnode* prev;
18} DLnode;
19
20typedef struct LinkedList
21{
22 void* head; /*SLnode if doubly_linked is false, otherwise DLnode*/
23 void* tail;
24 size_t length;
25 bool_t doubly_linked;
26 bool_t circularly_linked;
27} LinkedList;
28
29LinkedList* new_ll(bool_t doubly_linked, bool_t circularly_linked);
30
31void delete_sll(LinkedList* ll, void(*rmv) (void*));
32void delete_dll(LinkedList* ll, void(*rmv) (void*));
33HEDLEY_INLINE
34static void delete_ll(LinkedList* ll, void(*rmv) (void*))
35{
36 if(ll->doubly_linked)
37 delete_dll(ll, rmv);
38 else
39 delete_sll(ll, rmv);
40}
41
42void* sll_at(const LinkedList* ll, size_t index);
43void* dll_at(const LinkedList* ll, size_t index);
44HEDLEY_INLINE
45static void* ll_at(const LinkedList* ll, size_t index)
46{
47 if(ll->doubly_linked)
48 return sll_at(ll, index);
49 else
50 return dll_at(ll, index);
51}
52#define ll_pop(ll) ll_pop_at(ll, ll->length-1)
53void* sll_pop_at(LinkedList* ll, size_t index);
54void* dll_pop_at(LinkedList* ll, size_t index);
55HEDLEY_INLINE
56static void* ll_pop_at(LinkedList* ll, size_t index)
57{
58 if(ll->doubly_linked)
59 return sll_pop_at(ll, index);
60 else
61 return dll_pop_at(ll, index);
62}
63
64#define ll_push(ll, item) ll_insert(ll, ll->length, item)
65bool_t sll_insert(LinkedList* ll, size_t index, void* item);
66bool_t dll_insert(LinkedList* ll, size_t index, void* item);
67HEDLEY_INLINE
68static bool_t ll_insert(LinkedList* ll, size_t index, void* item)
69{
70 if(ll->doubly_linked)
71 return sll_insert(ll, index, item);
72 else
73 return dll_insert(ll, index, item);
74}
75
76
77void sll_remove(LinkedList* ll, size_t index, void (*rmv)(void*));
78void dll_remove(LinkedList* ll, size_t index, void (*rmv)(void*));
79HEDLEY_INLINE
80static void ll_remove(LinkedList* ll, size_t index, void (*rmv)(void*))
81{
82 if(ll->doubly_linked)
83 sll_remove(ll, index, rmv);
84 else
85 dll_remove(ll, index, rmv);
86}
87void sll_remove_range(LinkedList* ll, size_t index, size_t length, void (*rmv)(void*));
88void dll_remove_range(LinkedList* ll, size_t index, size_t length, void (*rmv)(void*));
89HEDLEY_INLINE
90static void ll_remove_range(LinkedList* ll, size_t index, size_t length, void (*rmv)(void*))
91{
92 if(ll->doubly_linked)
93 sll_remove_range(ll, index, length, rmv);
94 else
95 dll_remove_range(ll, index, length, rmv);
96}
97
98size_t* sll_find(const LinkedList* haystack, const void* needle, int (*cmp)(const void*, const void*));
99size_t* dll_find(const LinkedList* haystack, const void* needle, int (*cmp)(const void*, const void*));
100HEDLEY_INLINE
101static size_t* ll_find(const LinkedList* haystack, const void* needle, int (*cmp)(const void*, const void*))
102{
103 if(haystack->doubly_linked)
104 return sll_find(haystack, needle, cmp);
105 else
106 return dll_find(haystack, needle, cmp);
107}
108void sll_swap(LinkedList* ll, size_t item1, size_t item2);
109void dll_swap(LinkedList* ll, size_t item1, size_t item2);
110HEDLEY_INLINE
111static void ll_swap(LinkedList* ll, size_t item1, size_t item2)
112{
113 if(ll->doubly_linked)
114 sll_swap(ll, item1, item2);
115 else
116 dll_swap(ll, item1, item2);
117}
118
119
120#endif /* LINKED_LIST_H */
121