revert breaks some stupid old compilers
[oscam.git] / oscam-llist.h
blobf284993fdb772cc9eef4abcd5dec5429271122cf
2 /* singularly linked-list */
4 #ifndef OSCAM_LLIST_H_
5 #define OSCAM_LLIST_H_
7 typedef struct llnode LL_NODE;
8 struct llnode
10 void *obj;
11 LL_NODE *nxt;
14 typedef struct llist LLIST;
15 struct llist
17 // void *obj;
18 LL_NODE *initial;
19 LL_NODE *last;
20 int32_t count;
21 CS_MUTEX_LOCK lock;
22 int32_t flag;
23 uint32_t version; // updated on every modification of the list - exception is on prepends and appends as this should not have impacts on iterations!
26 typedef struct lliter LL_ITER;
27 struct lliter
29 LLIST *l;
30 LL_NODE *cur, *prv;
31 uint32_t ll_version;
34 typedef struct llistlockiter LL_LOCKITER;
35 struct llistlockiter
37 LLIST *l;
38 int32_t writelock;
39 LL_ITER it;
42 LLIST *ll_create(const char *name); // create llist, return ptr to llist
43 void ll_destroy(LLIST **pl); // same as ll_clear_abstract() but frees up LLIST mem as well
44 void ll_destroy_data(LLIST **pl); // same as ll_clear_data() but frees up obj allocations as well
45 void ll_destroy_free_data(LLIST **pl); // same as ll_clear_data() but frees up obj allocations as well. More, really free node without use GBC
47 void ll_clear(LLIST *l); // frees up all llnodes nodes but not data held in obj ptrs
48 void ll_clear_data(LLIST *l); // same as ll_clear_data() but frees up obj allocations as well
50 void **ll_sort(const LLIST *l, void *compare, int32_t *size); // sorts the list, compare = int func(const T *a, const T *b)
51 LL_NODE *ll_append(LLIST *l, void *obj); // append obj to llist
52 LL_NODE *ll_prepend(LLIST *l, void *obj); // prepend obj to llist
54 //clones a list, duplicates data
55 LLIST *ll_clone(LLIST *l, uint32_t copysize);
57 //New type of lock, list is locked during iterate! create=lock, destroy=unlock
58 LL_LOCKITER *ll_li_create(LLIST *l, int32_t writelock);
59 void ll_li_destroy(LL_LOCKITER *li);
60 void *ll_li_next(LL_LOCKITER *li);
62 //Old Iterators:
63 LL_ITER ll_iter_create(LLIST *l); // return ptr to iterator obj
64 void *ll_iter_next(LL_ITER *it); // iterate to and return next llnode obj, returns NULL at end
65 void *ll_iter_next_remove(LL_ITER *it); // iterate to and return next llnode obj, returns NULL at end, removing it
66 void *ll_iter_peek(const LL_ITER *it, int32_t offset); // return obj at offset from iterator but do not iterate
67 void ll_iter_reset(LL_ITER *it); // reset itrerator to first llnode
68 void ll_iter_insert(LL_ITER *it, void *obj); // insert obj at iterator node
69 void *ll_iter_remove(LL_ITER *it); // remove llnode at iterator, returns ptr to the llnode obj removed
70 void ll_iter_remove_data(LL_ITER *it); // remove llnode and free llnode obj
71 void *ll_iter_move(LL_ITER *it, int32_t offset);// moves the iterator position
72 int32_t ll_iter_move_first(LL_ITER *it); // moves an entry to top
73 static inline int32_t ll_count(const LLIST *l) // return number of items in list
75 if(!l || l->flag)
76 { return 0; }
78 return l->count;
80 void *ll_has_elements(const LLIST *l); // returns first obj if has one
81 void *ll_last_element(const LLIST *l);
82 int32_t ll_contains(const LLIST *l, const void *obj);
83 const void *ll_contains_data(const LLIST *l, const void *obj, uint32_t size);
84 int32_t ll_remove(LLIST *l, const void *obj);
85 void ll_remove_data(LLIST *l, void *obj);
86 int32_t ll_remove_all(LLIST *l, const LLIST *elements_to_remove); // removes all elements from l where elements are in elements_to_remove
88 void ll_putall(LLIST *dest, LLIST *src);
90 void *ll_remove_first(LLIST *l);
91 void ll_remove_first_data(LLIST *l);
93 #endif