1 /* Libvisual - The audio visualisation framework.
2  *
3  * Copyright (C) 2004, 2005, 2006 Dennis Smit <ds@nerds-incorporated.org>
4  *
5  * Authors: Dennis Smit <ds@nerds-incorporated.org>
6  *
7  * $Id: lv_collection.h,v 1.7 2006/01/22 13:23:37 synap Exp $
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser General Public License as
11  * published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22  */
23 
24 #ifndef _LV_COLLECTION_H
25 #define _LV_COLLECTION_H
26 
27 #include <libvisual-0.4/libvisual/lv_common.h>
28 
29 VISUAL_BEGIN_DECLS
30 
31 #define VISUAL_COLLECTION(obj)				(VISUAL_CHECK_CAST ((obj), VisCollection))
32 #define VISUAL_COLLECTIONITER(obj)			(VISUAL_CHECK_CAST ((obj), VisCollectionIter))
33 
34 typedef struct _VisCollection VisCollection;
35 typedef struct _VisCollectionIter VisCollectionIter;
36 
37 /**
38  * A VisCollection destroyer function needs this signature, these functions are used
39  * to destroy data entries within collections.
40  *
41  * @arg data The data that was stored in a collection entry and thus can be destroyed.
42  *
43  * @return FIXME blah blah blah
44  */
45 typedef int (*VisCollectionDestroyerFunc)(void *data);
46 
47 /**
48  */
49 typedef int (*VisCollectionDestroyFunc)(VisCollection *collection);
50 
51 /**
52  */
53 typedef int (*VisCollectionSizeFunc)(VisCollection *collection);
54 
55 /**
56  */
57 typedef VisCollectionIter *(*VisCollectionIterFunc)(VisCollection *collection);
58 
59 /**
60  */
61 typedef void (*VisCollectionIterAssignFunc)(VisCollectionIter *iter, VisCollection *collection, VisObject *context,
62 		int index);
63 
64 /**
65  */
66 typedef void (*VisCollectionIterNextFunc)(VisCollectionIter *iter, VisCollection *collection, VisObject *context);
67 
68 /**
69  */
70 typedef int (*VisCollectionIterHasMoreFunc)(VisCollectionIter *iter, VisCollection *collection, VisObject *context);
71 
72 /**
73  */
74 typedef void *(*VisCollectionIterGetDataFunc)(VisCollectionIter *iter, VisCollection *collection, VisObject *context);
75 
76 /**
77  */
78 struct _VisCollection {
79 	VisObject			 object;	/**< The VisObject data. */
80 
81 	VisCollectionDestroyerFunc	 destroyer;
82 	VisCollectionDestroyFunc	 destroyfunc;
83 	VisCollectionSizeFunc		 sizefunc;
84 	VisCollectionIterFunc		 iterfunc;
85 };
86 
87 /**
88  */
89 struct _VisCollectionIter {
90 	VisObject			 object;
91 
92 	VisCollectionIterAssignFunc	 assignfunc;
93 	VisCollectionIterNextFunc	 nextfunc;
94 	VisCollectionIterHasMoreFunc	 hasmorefunc;
95 	VisCollectionIterGetDataFunc	 getdatafunc;
96 
97 	VisCollection			*collection;
98 
99 	VisObject			*context;
100 };
101 
102 /* prototypes */
103 int visual_collection_set_destroyer (VisCollection *collection, VisCollectionDestroyerFunc destroyer);
104 VisCollectionDestroyerFunc visual_collection_get_destroyer (VisCollection *collection);
105 
106 int visual_collection_set_destroy_func (VisCollection *collection, VisCollectionDestroyFunc destroyfunc);
107 VisCollectionDestroyFunc visual_collection_get_destroy_func (VisCollection *collection);
108 
109 int visual_collection_set_size_func (VisCollection *collection, VisCollectionSizeFunc sizefunc);
110 VisCollectionSizeFunc visual_collection_get_size_func (VisCollection *collection);
111 
112 int visual_collection_set_iter_func (VisCollection *collection, VisCollectionIterFunc iterfunc);
113 VisCollectionIterFunc visual_collection_get_iter_func (VisCollection *collection);
114 
115 int visual_collection_dtor (VisObject *object);
116 
117 int visual_collection_destroy (VisCollection *collection);
118 int visual_collection_size (VisCollection *collection);
119 VisCollectionIter *visual_collection_get_iter (VisCollection *collection);
120 
121 
122 VisCollectionIter *visual_collection_iter_new (
123 		VisCollectionIterAssignFunc assignfunc, VisCollectionIterNextFunc nextfunc,
124 		VisCollectionIterHasMoreFunc hasmorefunc, VisCollectionIterGetDataFunc getdatafunc,
125 		VisCollection *collection, VisObject *context);
126 int visual_collection_iter_init (VisCollectionIter *iter,
127 		VisCollectionIterAssignFunc assignfunc, VisCollectionIterNextFunc nextfunc,
128 		VisCollectionIterHasMoreFunc hasmorefunc, VisCollectionIterGetDataFunc getdatafunc,
129 		VisCollection *collection, VisObject *context);
130 
131 void visual_collection_iter_assign (VisCollectionIter *iter, int index);
132 void visual_collection_iter_next (VisCollectionIter *iter);
133 int visual_collection_iter_has_more (VisCollectionIter *iter);
134 void *visual_collection_iter_get_data (VisCollectionIter *iter);
135 
136 VISUAL_END_DECLS
137 
138 #endif /* _LV_COLLECTION_H */
139