1/*
2 * Author:      William Chia-Wei Cheng (bill.cheng@acm.org)
3 *
4 * Copyright (C) 2001-2009, William Chia-Wei Cheng.
5 *
6 * This file may be distributed under the terms of the Q Public License
7 * as defined by Trolltech AS of Norway and appearing in the file
8 * LICENSE.QPL included in the packaging of this file.
9 *
10 * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING
11 * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
12 * PURPOSE.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
13 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
14 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
16 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 *
18 * @(#)$Header: /mm2/home/cvs/bc-src/tgif/list.e,v 1.6 2011/05/16 16:21:58 william Exp $
19 */
20
21#ifndef _TGIF_LIST_E_
22#define _TGIF_LIST_E_
23
24typedef int (CMPFN)ARGS_DECL((void*, void*)); /* a comparison function */
25
26typedef struct tagCVListElem {
27    void *obj;
28    struct tagCVListElem *next;
29    struct tagCVListElem *prev;
30} CVListElem;
31
32typedef struct tagCVList {
33    int num_members;
34    CVListElem anchor;
35
36    int  (*Length)(struct tagCVList *);
37    int  (*Empty)(struct tagCVList *);
38
39    int  (*Append)(struct tagCVList *, void*);
40    int  (*Prepend)(struct tagCVList *, void*);
41    void (*Unlink)(struct tagCVList *, CVListElem*);
42    void (*UnlinkAll)(struct tagCVList *);
43    int  (*InsertBefore)(struct tagCVList *, void*, CVListElem*);
44    int  (*InsertAfter)(struct tagCVList *, void*, CVListElem*);
45
46    CVListElem *(*First)(struct tagCVList *);
47    CVListElem *(*Last)(struct tagCVList *);
48    CVListElem *(*Next)(struct tagCVList *, CVListElem *cur);
49    CVListElem *(*Prev)(struct tagCVList *, CVListElem *cur);
50
51    /* returns the CVListElem that contains obj */
52    CVListElem *(*Find)(struct tagCVList *, void*, CMPFN*);
53} CVList;
54
55#ifdef _INCLUDE_FROM_LIST_C_
56#undef extern
57#define extern
58#endif /*_INCLUDE_FROM_LIST_C_*/
59
60extern int	CompareForStringList ARGS_DECL((void *pv1, void *pv2));
61
62extern int	ListLength ARGS_DECL((CVList*));
63extern int	ListEmpty ARGS_DECL((CVList*));
64
65extern int	ListAppend ARGS_DECL((CVList*, void*));
66extern int	ListPrepend ARGS_DECL((CVList*, void*));
67
68extern void	ListUnlink ARGS_DECL((CVList*, CVListElem*));
69extern void	ListUnlinkAll ARGS_DECL((CVList*));
70
71extern int	ListInsertAfter ARGS_DECL((CVList*, void*, CVListElem*));
72extern int	ListInsertBefore ARGS_DECL((CVList*, void*, CVListElem*));
73
74extern CVListElem	*ListFirst ARGS_DECL((CVList*));
75extern CVListElem	*ListLast ARGS_DECL((CVList*));
76extern CVListElem	*ListNext ARGS_DECL((CVList*, CVListElem*));
77extern CVListElem	*ListPrev ARGS_DECL((CVList*, CVListElem*));
78
79extern CVListElem	*ListFind ARGS_DECL((CVList*, void*, CMPFN*));
80
81extern void	CVListCleanUp ARGS_DECL((CVList*));
82extern int	CVListInit ARGS_DECL((CVList*));
83
84#ifdef _INCLUDE_FROM_LIST_C_
85#undef extern
86#ifndef _NO_RECURSIVE_EXTERN
87#define extern extern
88#endif /* ~_NO_RECURSIVE_EXTERN */
89#endif /*_INCLUDE_FROM_LIST_C_*/
90
91#endif /*_TGIF_LIST_E_*/
92