5 * Aaron Bockover (abockover@novell.com)
7 * (C) 2006 Novell, Inc.
9 * Permission is hereby granted, free of charge, to any person obtaining
10 * a copy of this software and associated documentation files (the
11 * "Software"), to deal in the Software without restriction, including
12 * without limitation the rights to use, copy, modify, merge, publish,
13 * distribute, sublicense, and/or sell copies of the Software, and to
14 * permit persons to whom the Software is furnished to do so, subject to
15 * the following conditions:
17 * The above copyright notice and this permission notice shall be
18 * included in all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 #define MAX(a,b) ((a) > (b) ? (a) : (b))
35 typedef struct _GPtrArrayPriv {
42 g_ptr_array_grow(GPtrArrayPriv *array, guint length)
44 gint new_length = array->len + length;
46 g_return_if_fail(array != NULL);
48 if(new_length <= array->size) {
54 while(array->size < new_length) {
58 array->size = MAX(array->size, 16);
59 array->pdata = g_realloc(array->pdata, array->size * sizeof(gpointer));
65 return g_ptr_array_sized_new(0);
69 g_ptr_array_sized_new(guint reserved_size)
71 GPtrArrayPriv *array = g_new0(GPtrArrayPriv, 1);
77 if(reserved_size > 0) {
78 g_ptr_array_grow(array, reserved_size);
81 return (GPtrArray *)array;
85 g_ptr_array_free(GPtrArray *array, gboolean free_seg)
87 gpointer *data = NULL;
89 g_return_val_if_fail(array != NULL, NULL);
103 g_ptr_array_add(GPtrArray *array, gpointer data)
105 g_return_if_fail(array != NULL);
106 g_ptr_array_grow((GPtrArrayPriv *)array, 1);
107 array->pdata[array->len++] = data;
111 g_ptr_array_foreach(GPtrArray *array, GFunc func, gpointer user_data)
115 for(i = 0; i < array->len; i++) {
116 func(g_ptr_array_index(array, i), user_data);