]> git.decadent.org.uk Git - ion3.git/blob - libtu/ptrlist.h
[svn-upgrade] Integrating new upstream version, ion3 (20070506)
[ion3.git] / libtu / ptrlist.h
1 /*
2  * libtu/ptrlist.h
3  *
4  * Copyright (c) Tuomo Valkonen 1999-2005.
5  *
6  * You may distribute and modify this library under the terms of either
7  * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
8  */
9
10 #ifndef LIBTU_PTRLIST_H
11 #define LIBTU_PTRLIST_H
12
13 #include "types.h"
14 #include "iterable.h"
15
16
17 INTRSTRUCT(PtrList);
18
19
20 DECLSTRUCT(PtrList){
21     void *ptr;
22     PtrList *next, *prev;
23 };
24
25
26 typedef PtrList* PtrListIterTmp;
27
28 #define PTRLIST_FIRST(TYPE, LL) ((LL)==NULL ? NULL : (TYPE)(LL)->ptr)
29 #define PTRLIST_LAST(TYPE, LL) ((LL)==NULL ? NULL : (TYPE)(LL)->prev->ptr)
30 #define PTRLIST_EMPTY(LIST) ((LIST)==NULL)
31
32 #define FOR_ALL_ON_PTRLIST(TYPE, VAR, LL, TMP) \
33     FOR_ALL_ITER(ptrlist_iter_init, (TYPE)ptrlist_iter, VAR, LL, &(TMP))
34
35 #define FOR_ALL_ON_PTRLIST_REV(TYPE, VAR, LL, TMP)        \
36     FOR_ALL_ITER(ptrlist_iter_rev_init,                   \
37                  (TYPE)ptrlist_iter_rev, VAR, LL, &(TMP))
38
39 #define FOR_ALL_ON_PTRLIST_UNSAFE(TYPE, VAR, LL) \
40     FOR_ALL_ON_PTRLIST(TYPE, VAR, LL, ptrlist_iter_tmp)
41
42 extern PtrListIterTmp ptrlist_iter_tmp;
43
44 extern bool ptrlist_insert_last(PtrList **ptrlist, void *ptr);
45 extern bool ptrlist_insert_first(PtrList **ptrlist, void *ptr);
46 extern bool ptrlist_reinsert_last(PtrList **ptrlist, void *ptr);
47 extern bool ptrlist_reinsert_first(PtrList **ptrlist, void *ptr);
48 extern bool ptrlist_remove(PtrList **ptrlist, void *ptr);
49 extern bool ptrlist_contains(PtrList *ptrlist, void *ptr);
50 extern void ptrlist_clear(PtrList **ptrlist);
51 extern void ptrlist_iter_init(PtrListIterTmp *state, PtrList *ptrlist);
52 extern void *ptrlist_iter(PtrListIterTmp *state);
53 extern void ptrlist_iter_rev_init(PtrListIterTmp *state, PtrList *ptrlist);
54 extern void *ptrlist_iter_rev(PtrListIterTmp *state);
55 extern void *ptrlist_take_first(PtrList **ptrlist);
56 extern void *ptrlist_take_last(PtrList **ptrlist);
57
58 #endif /* LIBTU_PTRLIST_H */