1/* GLIB - Library of useful routines for C programming
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
16 */
17
18/*
19 * Modified by the GLib Team and others 1997-2000. See the AUTHORS
20 * file for a list of people on the GLib Team. See the ChangeLog
21 * files for a list of changes. These files are distributed with
22 * GLib at ftp://ftp.gtk.org/pub/gtk/.
23 */
24
25#ifndef __G_ARRAY_H__
26#define __G_ARRAY_H__
27
28#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
29#error "Only <glib.h> can be included directly."
30#endif
31
32#include <glib/gtypes.h>
33
34G_BEGIN_DECLS
35
36typedef struct _GBytes GBytes;
37typedef struct _GArray GArray;
38typedef struct _GByteArray GByteArray;
39typedef struct _GPtrArray GPtrArray;
40
41struct _GArray
42{
43 gchar *data;
44 guint len;
45};
46
47struct _GByteArray
48{
49 guint8 *data;
50 guint len;
51};
52
53struct _GPtrArray
54{
55 gpointer *pdata;
56 guint len;
57};
58
59/* Resizable arrays. remove fills any cleared spot and shortens the
60 * array, while preserving the order. remove_fast will distort the
61 * order by moving the last element to the position of the removed.
62 */
63
64#define g_array_append_val(a,v) g_array_append_vals (a, &(v), 1)
65#define g_array_prepend_val(a,v) g_array_prepend_vals (a, &(v), 1)
66#define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &(v), 1)
67#define g_array_index(a,t,i) (((t*) (void *) (a)->data) [(i)])
68
69GLIB_AVAILABLE_IN_ALL
70GArray* g_array_new (gboolean zero_terminated,
71 gboolean clear_,
72 guint element_size);
73GLIB_AVAILABLE_IN_ALL
74GArray* g_array_sized_new (gboolean zero_terminated,
75 gboolean clear_,
76 guint element_size,
77 guint reserved_size);
78GLIB_AVAILABLE_IN_2_62
79GArray* g_array_copy (GArray *array);
80GLIB_AVAILABLE_IN_ALL
81gchar* g_array_free (GArray *array,
82 gboolean free_segment);
83GLIB_AVAILABLE_IN_ALL
84GArray *g_array_ref (GArray *array);
85GLIB_AVAILABLE_IN_ALL
86void g_array_unref (GArray *array);
87GLIB_AVAILABLE_IN_ALL
88guint g_array_get_element_size (GArray *array);
89GLIB_AVAILABLE_IN_ALL
90GArray* g_array_append_vals (GArray *array,
91 gconstpointer data,
92 guint len);
93GLIB_AVAILABLE_IN_ALL
94GArray* g_array_prepend_vals (GArray *array,
95 gconstpointer data,
96 guint len);
97GLIB_AVAILABLE_IN_ALL
98GArray* g_array_insert_vals (GArray *array,
99 guint index_,
100 gconstpointer data,
101 guint len);
102GLIB_AVAILABLE_IN_ALL
103GArray* g_array_set_size (GArray *array,
104 guint length);
105GLIB_AVAILABLE_IN_ALL
106GArray* g_array_remove_index (GArray *array,
107 guint index_);
108GLIB_AVAILABLE_IN_ALL
109GArray* g_array_remove_index_fast (GArray *array,
110 guint index_);
111GLIB_AVAILABLE_IN_ALL
112GArray* g_array_remove_range (GArray *array,
113 guint index_,
114 guint length);
115GLIB_AVAILABLE_IN_ALL
116void g_array_sort (GArray *array,
117 GCompareFunc compare_func);
118GLIB_AVAILABLE_IN_ALL
119void g_array_sort_with_data (GArray *array,
120 GCompareDataFunc compare_func,
121 gpointer user_data);
122GLIB_AVAILABLE_IN_2_62
123gboolean g_array_binary_search (GArray *array,
124 gconstpointer target,
125 GCompareFunc compare_func,
126 guint *out_match_index);
127GLIB_AVAILABLE_IN_ALL
128void g_array_set_clear_func (GArray *array,
129 GDestroyNotify clear_func);
130
131/* Resizable pointer array. This interface is much less complicated
132 * than the above. Add appends a pointer. Remove fills any cleared
133 * spot and shortens the array. remove_fast will again distort order.
134 */
135#define g_ptr_array_index(array,index_) ((array)->pdata)[index_]
136GLIB_AVAILABLE_IN_ALL
137GPtrArray* g_ptr_array_new (void);
138GLIB_AVAILABLE_IN_ALL
139GPtrArray* g_ptr_array_new_with_free_func (GDestroyNotify element_free_func);
140GLIB_AVAILABLE_IN_2_62
141GPtrArray *g_ptr_array_copy (GPtrArray *array,
142 GCopyFunc func,
143 gpointer user_data);
144GLIB_AVAILABLE_IN_ALL
145GPtrArray* g_ptr_array_sized_new (guint reserved_size);
146GLIB_AVAILABLE_IN_ALL
147GPtrArray* g_ptr_array_new_full (guint reserved_size,
148 GDestroyNotify element_free_func);
149GLIB_AVAILABLE_IN_ALL
150gpointer* g_ptr_array_free (GPtrArray *array,
151 gboolean free_seg);
152GLIB_AVAILABLE_IN_ALL
153GPtrArray* g_ptr_array_ref (GPtrArray *array);
154GLIB_AVAILABLE_IN_ALL
155void g_ptr_array_unref (GPtrArray *array);
156GLIB_AVAILABLE_IN_ALL
157void g_ptr_array_set_free_func (GPtrArray *array,
158 GDestroyNotify element_free_func);
159GLIB_AVAILABLE_IN_ALL
160void g_ptr_array_set_size (GPtrArray *array,
161 gint length);
162GLIB_AVAILABLE_IN_ALL
163gpointer g_ptr_array_remove_index (GPtrArray *array,
164 guint index_);
165GLIB_AVAILABLE_IN_ALL
166gpointer g_ptr_array_remove_index_fast (GPtrArray *array,
167 guint index_);
168GLIB_AVAILABLE_IN_2_58
169gpointer g_ptr_array_steal_index (GPtrArray *array,
170 guint index_);
171GLIB_AVAILABLE_IN_2_58
172gpointer g_ptr_array_steal_index_fast (GPtrArray *array,
173 guint index_);
174GLIB_AVAILABLE_IN_ALL
175gboolean g_ptr_array_remove (GPtrArray *array,
176 gpointer data);
177GLIB_AVAILABLE_IN_ALL
178gboolean g_ptr_array_remove_fast (GPtrArray *array,
179 gpointer data);
180GLIB_AVAILABLE_IN_ALL
181GPtrArray *g_ptr_array_remove_range (GPtrArray *array,
182 guint index_,
183 guint length);
184GLIB_AVAILABLE_IN_ALL
185void g_ptr_array_add (GPtrArray *array,
186 gpointer data);
187GLIB_AVAILABLE_IN_2_62
188void g_ptr_array_extend (GPtrArray *array_to_extend,
189 GPtrArray *array,
190 GCopyFunc func,
191 gpointer user_data);
192GLIB_AVAILABLE_IN_2_62
193void g_ptr_array_extend_and_steal (GPtrArray *array_to_extend,
194 GPtrArray *array);
195GLIB_AVAILABLE_IN_2_40
196void g_ptr_array_insert (GPtrArray *array,
197 gint index_,
198 gpointer data);
199GLIB_AVAILABLE_IN_ALL
200void g_ptr_array_sort (GPtrArray *array,
201 GCompareFunc compare_func);
202GLIB_AVAILABLE_IN_ALL
203void g_ptr_array_sort_with_data (GPtrArray *array,
204 GCompareDataFunc compare_func,
205 gpointer user_data);
206GLIB_AVAILABLE_IN_ALL
207void g_ptr_array_foreach (GPtrArray *array,
208 GFunc func,
209 gpointer user_data);
210GLIB_AVAILABLE_IN_2_54
211gboolean g_ptr_array_find (GPtrArray *haystack,
212 gconstpointer needle,
213 guint *index_);
214GLIB_AVAILABLE_IN_2_54
215gboolean g_ptr_array_find_with_equal_func (GPtrArray *haystack,
216 gconstpointer needle,
217 GEqualFunc equal_func,
218 guint *index_);
219
220
221/* Byte arrays, an array of guint8. Implemented as a GArray,
222 * but type-safe.
223 */
224
225GLIB_AVAILABLE_IN_ALL
226GByteArray* g_byte_array_new (void);
227GLIB_AVAILABLE_IN_ALL
228GByteArray* g_byte_array_new_take (guint8 *data,
229 gsize len);
230GLIB_AVAILABLE_IN_ALL
231GByteArray* g_byte_array_sized_new (guint reserved_size);
232GLIB_AVAILABLE_IN_ALL
233guint8* g_byte_array_free (GByteArray *array,
234 gboolean free_segment);
235GLIB_AVAILABLE_IN_ALL
236GBytes* g_byte_array_free_to_bytes (GByteArray *array);
237GLIB_AVAILABLE_IN_ALL
238GByteArray *g_byte_array_ref (GByteArray *array);
239GLIB_AVAILABLE_IN_ALL
240void g_byte_array_unref (GByteArray *array);
241GLIB_AVAILABLE_IN_ALL
242GByteArray* g_byte_array_append (GByteArray *array,
243 const guint8 *data,
244 guint len);
245GLIB_AVAILABLE_IN_ALL
246GByteArray* g_byte_array_prepend (GByteArray *array,
247 const guint8 *data,
248 guint len);
249GLIB_AVAILABLE_IN_ALL
250GByteArray* g_byte_array_set_size (GByteArray *array,
251 guint length);
252GLIB_AVAILABLE_IN_ALL
253GByteArray* g_byte_array_remove_index (GByteArray *array,
254 guint index_);
255GLIB_AVAILABLE_IN_ALL
256GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
257 guint index_);
258GLIB_AVAILABLE_IN_ALL
259GByteArray* g_byte_array_remove_range (GByteArray *array,
260 guint index_,
261 guint length);
262GLIB_AVAILABLE_IN_ALL
263void g_byte_array_sort (GByteArray *array,
264 GCompareFunc compare_func);
265GLIB_AVAILABLE_IN_ALL
266void g_byte_array_sort_with_data (GByteArray *array,
267 GCompareDataFunc compare_func,
268 gpointer user_data);
269
270G_END_DECLS
271
272#endif /* __G_ARRAY_H__ */
273