1 /* GLIB - Library of useful routines for C programming
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
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 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 #define MIN_ARRAY_SIZE 16
26 typedef struct _GRealArray GRealArray
;
34 guint zero_terminated
: 1;
39 static gint
g_nearest_pow (gint num
);
40 static void g_array_maybe_expand (GRealArray
*array
,
44 static GMemChunk
*array_mem_chunk
= NULL
;
48 g_array_new (gboolean zero_terminated
,
55 array_mem_chunk
= g_mem_chunk_new ("array mem chunk",
57 1024, G_ALLOC_AND_FREE
);
59 array
= g_chunk_new (GRealArray
, array_mem_chunk
);
64 array
->zero_terminated
= (zero_terminated
? 1 : 0);
65 array
->clear
= (clear
? 1 : 0);
66 array
->elt_size
= elt_size
;
68 return (GArray
*) array
;
72 g_array_free (GArray
*array
,
73 gboolean free_segment
)
78 g_mem_chunk_free (array_mem_chunk
, array
);
82 g_array_append_vals (GArray
*farray
,
86 GRealArray
*array
= (GRealArray
*) farray
;
88 g_array_maybe_expand (array
, len
);
90 memcpy (array
->data
+ array
->elt_size
* array
->len
, data
, array
->elt_size
* len
);
98 g_array_prepend_vals (GArray
*farray
,
102 GRealArray
*array
= (GRealArray
*) farray
;
104 g_array_maybe_expand (array
, len
);
106 g_memmove (array
->data
+ array
->elt_size
* len
, array
->data
, array
->elt_size
* array
->len
);
108 memcpy (array
->data
, data
, len
* array
->elt_size
);
116 g_array_set_size (GArray
*farray
,
119 GRealArray
*array
= (GRealArray
*) farray
;
121 if (array
->len
< length
)
122 g_array_maybe_expand (array
, length
- array
->len
);
130 g_nearest_pow (gint num
)
141 g_array_maybe_expand (GRealArray
*array
,
144 guint want_alloc
= (array
->len
+ len
+ array
->zero_terminated
) * array
->elt_size
;
146 if (want_alloc
> array
->alloc
)
148 guint old_alloc
= array
->alloc
;
150 array
->alloc
= g_nearest_pow (want_alloc
);
151 array
->alloc
= MAX (array
->alloc
, MIN_ARRAY_SIZE
);
153 array
->data
= g_realloc (array
->data
, array
->alloc
);
155 if (array
->clear
|| array
->zero_terminated
)
156 memset (array
->data
+ old_alloc
, 0, array
->alloc
- old_alloc
);
163 typedef struct _GRealPtrArray GRealPtrArray
;
165 struct _GRealPtrArray
172 static void g_ptr_array_maybe_expand (GRealPtrArray
*array
,
176 static GMemChunk
*ptr_array_mem_chunk
= NULL
;
183 GRealPtrArray
*array
;
185 if (!ptr_array_mem_chunk
)
186 ptr_array_mem_chunk
= g_mem_chunk_new ("array mem chunk",
187 sizeof (GRealPtrArray
),
188 1024, G_ALLOC_AND_FREE
);
190 array
= g_chunk_new (GRealPtrArray
, ptr_array_mem_chunk
);
196 return (GPtrArray
*) array
;
200 g_ptr_array_free (GPtrArray
*array
,
201 gboolean free_segment
)
203 g_return_if_fail (array
);
206 g_free (array
->pdata
);
208 g_mem_chunk_free (ptr_array_mem_chunk
, array
);
212 g_ptr_array_maybe_expand (GRealPtrArray
*array
,
217 if ((array
->len
+ len
) > array
->alloc
)
219 old_alloc
= array
->alloc
;
221 array
->alloc
= g_nearest_pow (array
->len
+ len
);
222 array
->alloc
= MAX (array
->alloc
, MIN_ARRAY_SIZE
);
224 array
->pdata
= g_realloc (array
->pdata
, sizeof(gpointer
) * array
->alloc
);
226 array
->pdata
= g_new0 (gpointer
, array
->alloc
);
228 memset (array
->pdata
+ old_alloc
, 0, array
->alloc
- old_alloc
);
233 g_ptr_array_set_size (GPtrArray
*farray
,
236 GRealPtrArray
* array
= (GRealPtrArray
*) farray
;
238 g_return_if_fail (array
);
240 if (length
> array
->len
)
241 g_ptr_array_maybe_expand (array
, (length
- array
->len
));
247 g_ptr_array_remove_index (GPtrArray
* farray
,
250 GRealPtrArray
* array
= (GRealPtrArray
*) farray
;
253 g_return_val_if_fail (array
, NULL
);
255 g_return_val_if_fail (index
>= 0 && index
< array
->len
, NULL
);
257 result
= array
->pdata
[index
];
259 array
->pdata
[index
] = array
->pdata
[array
->len
- 1];
261 array
->pdata
[array
->len
- 1] = NULL
;
269 g_ptr_array_remove (GPtrArray
* farray
,
272 GRealPtrArray
* array
= (GRealPtrArray
*) farray
;
275 g_return_val_if_fail (array
, FALSE
);
277 for (i
= 0; i
< array
->len
; i
+= 1)
279 if (array
->pdata
[i
] == data
)
281 g_ptr_array_remove_index (farray
, i
);
290 g_ptr_array_add (GPtrArray
* farray
,
293 GRealPtrArray
* array
= (GRealPtrArray
*) farray
;
295 g_return_if_fail (array
);
297 g_ptr_array_maybe_expand (array
, 1);
299 array
->pdata
[array
->len
++] = data
;
305 GByteArray
* g_byte_array_new (void)
307 return (GByteArray
*) g_array_new (FALSE
, FALSE
, 1);
310 void g_byte_array_free (GByteArray
*array
,
311 gboolean free_segment
)
313 g_array_free ((GArray
*) array
, free_segment
);
316 GByteArray
* g_byte_array_append (GByteArray
*array
,
320 g_array_append_vals ((GArray
*) array
, (guint8
*)data
, len
);
325 GByteArray
* g_byte_array_prepend (GByteArray
*array
,
329 g_array_prepend_vals ((GArray
*) array
, (guint8
*)data
, len
);
334 GByteArray
* g_byte_array_set_size (GByteArray
*array
,
337 g_array_set_size ((GArray
*) array
, length
);