1/* Abstract sequential list data type.
2   Copyright (C) 2006 Free Software Foundation, Inc.
3   Written by Bruno Haible <bruno@clisp.org>, 2006.
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 2, or (at your option)
8   any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program; if not, write to the Free Software Foundation,
17   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19#include <config.h>
20
21/* Specification.  */
22#include "gl_list.h"
23
24#if !HAVE_INLINE
25
26/* Define all functions of this file as inline accesses to the
27   struct gl_list_implementation.
28   Use #define to avoid a warning because of extern vs. static.  */
29
30gl_list_t
31gl_list_create_empty (gl_list_implementation_t implementation,
32		      gl_listelement_equals_fn equals_fn,
33		      gl_listelement_hashcode_fn hashcode_fn,
34		      bool allow_duplicates)
35{
36  return implementation->create_empty (implementation, equals_fn, hashcode_fn,
37				       allow_duplicates);
38}
39
40gl_list_t
41gl_list_create (gl_list_implementation_t implementation,
42		gl_listelement_equals_fn equals_fn,
43		gl_listelement_hashcode_fn hashcode_fn,
44		bool allow_duplicates,
45		size_t count, const void **contents)
46{
47  return implementation->create (implementation, equals_fn, hashcode_fn,
48				 allow_duplicates, count, contents);
49}
50
51size_t
52gl_list_size (gl_list_t list)
53{
54  return ((const struct gl_list_impl_base *) list)->vtable
55	 ->size (list);
56}
57
58const void *
59gl_list_node_value (gl_list_t list, gl_list_node_t node)
60{
61  return ((const struct gl_list_impl_base *) list)->vtable
62	 ->node_value (list, node);
63}
64
65gl_list_node_t
66gl_list_next_node (gl_list_t list, gl_list_node_t node)
67{
68  return ((const struct gl_list_impl_base *) list)->vtable
69	 ->next_node (list, node);
70}
71
72gl_list_node_t
73gl_list_previous_node (gl_list_t list, gl_list_node_t node)
74{
75  return ((const struct gl_list_impl_base *) list)->vtable
76	 ->previous_node (list, node);
77}
78
79const void *
80gl_list_get_at (gl_list_t list, size_t position)
81{
82  return ((const struct gl_list_impl_base *) list)->vtable
83	 ->get_at (list, position);
84}
85
86gl_list_node_t
87gl_list_set_at (gl_list_t list, size_t position, const void *elt)
88{
89  return ((const struct gl_list_impl_base *) list)->vtable
90	 ->set_at (list, position, elt);
91}
92
93gl_list_node_t
94gl_list_search (gl_list_t list, const void *elt)
95{
96  size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
97  return ((const struct gl_list_impl_base *) list)->vtable
98	 ->search_from_to (list, 0, size, elt);
99}
100
101gl_list_node_t
102gl_list_search_from (gl_list_t list, size_t start_index, const void *elt)
103{
104  size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
105  return ((const struct gl_list_impl_base *) list)->vtable
106	 ->search_from_to (list, start_index, size, elt);
107}
108
109gl_list_node_t
110gl_list_search_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt)
111{
112  return ((const struct gl_list_impl_base *) list)->vtable
113	 ->search_from_to (list, start_index, end_index, elt);
114}
115
116size_t
117gl_list_indexof (gl_list_t list, const void *elt)
118{
119  size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
120  return ((const struct gl_list_impl_base *) list)->vtable
121	 ->indexof_from_to (list, 0, size, elt);
122}
123
124size_t
125gl_list_indexof_from (gl_list_t list, size_t start_index, const void *elt)
126{
127  size_t size = ((const struct gl_list_impl_base *) list)->vtable->size (list);
128  return ((const struct gl_list_impl_base *) list)->vtable
129	 ->indexof_from_to (list, start_index, size, elt);
130}
131
132size_t
133gl_list_indexof_from_to (gl_list_t list, size_t start_index, size_t end_index, const void *elt)
134{
135  return ((const struct gl_list_impl_base *) list)->vtable
136	 ->indexof_from_to (list, start_index, end_index, elt);
137}
138
139gl_list_node_t
140gl_list_add_first (gl_list_t list, const void *elt)
141{
142  return ((const struct gl_list_impl_base *) list)->vtable
143	 ->add_first (list, elt);
144}
145
146gl_list_node_t
147gl_list_add_last (gl_list_t list, const void *elt)
148{
149  return ((const struct gl_list_impl_base *) list)->vtable
150	 ->add_last (list, elt);
151}
152
153gl_list_node_t
154gl_list_add_before (gl_list_t list, gl_list_node_t node, const void *elt)
155{
156  return ((const struct gl_list_impl_base *) list)->vtable
157	 ->add_before (list, node, elt);
158}
159
160gl_list_node_t
161gl_list_add_after (gl_list_t list, gl_list_node_t node, const void *elt)
162{
163  return ((const struct gl_list_impl_base *) list)->vtable
164	 ->add_after (list, node, elt);
165}
166
167gl_list_node_t
168gl_list_add_at (gl_list_t list, size_t position, const void *elt)
169{
170  return ((const struct gl_list_impl_base *) list)->vtable
171	 ->add_at (list, position, elt);
172}
173
174bool
175gl_list_remove_node (gl_list_t list, gl_list_node_t node)
176{
177  return ((const struct gl_list_impl_base *) list)->vtable
178	 ->remove_node (list, node);
179}
180
181bool
182gl_list_remove_at (gl_list_t list, size_t position)
183{
184  return ((const struct gl_list_impl_base *) list)->vtable
185	 ->remove_at (list, position);
186}
187
188bool
189gl_list_remove (gl_list_t list, const void *elt)
190{
191  return ((const struct gl_list_impl_base *) list)->vtable
192	 ->remove (list, elt);
193}
194
195void
196gl_list_free (gl_list_t list)
197{
198  ((const struct gl_list_impl_base *) list)->vtable->list_free (list);
199}
200
201gl_list_iterator_t
202gl_list_iterator (gl_list_t list)
203{
204  return ((const struct gl_list_impl_base *) list)->vtable
205	 ->iterator (list);
206}
207
208gl_list_iterator_t
209gl_list_iterator_from_to (gl_list_t list, size_t start_index, size_t end_index)
210{
211  return ((const struct gl_list_impl_base *) list)->vtable
212	 ->iterator_from_to (list, start_index, end_index);
213}
214
215bool
216gl_list_iterator_next (gl_list_iterator_t *iterator,
217		       const void **eltp, gl_list_node_t *nodep)
218{
219  return iterator->vtable->iterator_next (iterator, eltp, nodep);
220}
221
222void
223gl_list_iterator_free (gl_list_iterator_t *iterator)
224{
225  iterator->vtable->iterator_free (iterator);
226}
227
228gl_list_node_t
229gl_sortedlist_search (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
230{
231  return ((const struct gl_list_impl_base *) list)->vtable
232	 ->sortedlist_search (list, compar, elt);
233}
234
235gl_list_node_t
236gl_sortedlist_search_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
237{
238  return ((const struct gl_list_impl_base *) list)->vtable
239	 ->sortedlist_search_from_to (list, compar, start_index, end_index,
240				      elt);
241}
242
243size_t
244gl_sortedlist_indexof (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
245{
246  return ((const struct gl_list_impl_base *) list)->vtable
247	 ->sortedlist_indexof (list, compar, elt);
248}
249
250size_t
251gl_sortedlist_indexof_from_to (gl_list_t list, gl_listelement_compar_fn compar, size_t start_index, size_t end_index, const void *elt)
252{
253  return ((const struct gl_list_impl_base *) list)->vtable
254	 ->sortedlist_indexof_from_to (list, compar, start_index, end_index,
255				       elt);
256}
257
258gl_list_node_t
259gl_sortedlist_add (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
260{
261  return ((const struct gl_list_impl_base *) list)->vtable
262	 ->sortedlist_add (list, compar, elt);
263}
264
265bool
266gl_sortedlist_remove (gl_list_t list, gl_listelement_compar_fn compar, const void *elt)
267{
268  return ((const struct gl_list_impl_base *) list)->vtable
269	 ->sortedlist_remove (list, compar, elt);
270}
271
272#endif
273