1 |
|
---|
2 | /* singularly linked-list */
|
---|
3 |
|
---|
4 | #ifndef DATASTRUCT_LLIST_H_
|
---|
5 | #define DATASTRUCT_LLIST_H_
|
---|
6 |
|
---|
7 | #include <pthread.h>
|
---|
8 |
|
---|
9 | typedef struct llnode LL_NODE;
|
---|
10 | struct llnode {
|
---|
11 | void *obj;
|
---|
12 | LL_NODE *nxt;
|
---|
13 | unsigned char flag;
|
---|
14 | };
|
---|
15 |
|
---|
16 | typedef struct llist LLIST;
|
---|
17 | struct llist {
|
---|
18 | void *obj;
|
---|
19 | LL_NODE *initial;
|
---|
20 | int32_t count;
|
---|
21 | pthread_mutex_t lock;
|
---|
22 | };
|
---|
23 |
|
---|
24 | typedef struct lliter LL_ITER;
|
---|
25 | struct lliter {
|
---|
26 | LLIST *l;
|
---|
27 | LL_NODE *cur, *prv;
|
---|
28 | };
|
---|
29 |
|
---|
30 | LLIST *ll_create(); // create llist, return ptr to llist
|
---|
31 | void ll_destroy(LLIST *l); // same as ll_clear_abstract() but frees up LLIST mem as well
|
---|
32 | void ll_destroy_data(LLIST *l); // same as ll_clear_data() but frees up obj allocations as well
|
---|
33 | void ll_clear(LLIST *l); // frees up all llnodes nodes but not data held in obj ptrs
|
---|
34 | void ll_clear_data(LLIST *l); // same as ll_clear_data() but frees up obj allocations as well
|
---|
35 |
|
---|
36 | LL_NODE *ll_append(LLIST *l, void *obj); // append obj to llist
|
---|
37 | LL_NODE *ll_prepend(LLIST *l, void *obj); // prepend obj to llist
|
---|
38 |
|
---|
39 | LL_ITER *ll_iter_create(LLIST *l); // return ptr to iterator obj
|
---|
40 | void ll_iter_release(LL_ITER *it); // free up the iterator obj
|
---|
41 | void *ll_iter_next(LL_ITER *it); // iterate to and return next llnode obj, returns NULL at end
|
---|
42 | void *ll_iter_peek(LL_ITER *it, int32_t offset); // return obj at offset from iterator but do not iterate
|
---|
43 | void ll_iter_reset(LL_ITER *it); // reset itrerator to first llnode
|
---|
44 | void ll_iter_insert(LL_ITER *it, void *obj); // insert obj at iterator node
|
---|
45 | void *ll_iter_remove(LL_ITER *it); // remove llnode at iterator, returns ptr to the llnode obj removed
|
---|
46 | void ll_iter_remove_data(LL_ITER *it); // remove llnode and free llnode obj
|
---|
47 | void *ll_iter_move(LL_ITER *it, int offset); // moves the iterator position
|
---|
48 | int ll_iter_move_first(LL_ITER *it); // moves an entry to top
|
---|
49 | int32_t ll_count(LLIST *l); // return number of items in list
|
---|
50 | void *ll_has_elements(LLIST *l); // returns first obj if has one
|
---|
51 |
|
---|
52 | int32_t ll_contains(LLIST *l, void *obj);
|
---|
53 | int32_t ll_remove(LLIST *l, void *obj);
|
---|
54 | void ll_remove_data(LLIST *l, void *obj);
|
---|
55 | int32_t ll_remove_all(LLIST *l, LLIST *elements_to_remove); // removes all elements from l where elements are in elements_to_remove
|
---|
56 | #endif
|
---|