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 34 G_BEGIN_DECLS 35 36 typedef struct _GBytes GBytes; 37 typedef struct _GArray GArray; 38 typedef struct _GByteArray GByteArray; 39 typedef struct _GPtrArray GPtrArray; 40 41 struct _GArray 42 { 43 gchar *data; 44 guint len; 45 }; 46 47 struct _GByteArray 48 { 49 guint8 *data; 50 guint len; 51 }; 52 53 struct _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 69 GLIB_AVAILABLE_IN_ALL 70 GArray* g_array_new (gboolean zero_terminated, 71 gboolean clear_, 72 guint element_size); 73 GLIB_AVAILABLE_IN_ALL 74 GArray* g_array_sized_new (gboolean zero_terminated, 75 gboolean clear_, 76 guint element_size, 77 guint reserved_size); 78 GLIB_AVAILABLE_IN_2_62 79 GArray* g_array_copy (GArray *array); 80 GLIB_AVAILABLE_IN_ALL 81 gchar* g_array_free (GArray *array, 82 gboolean free_segment); 83 GLIB_AVAILABLE_IN_ALL 84 GArray *g_array_ref (GArray *array); 85 GLIB_AVAILABLE_IN_ALL 86 void g_array_unref (GArray *array); 87 GLIB_AVAILABLE_IN_ALL 88 guint g_array_get_element_size (GArray *array); 89 GLIB_AVAILABLE_IN_ALL 90 GArray* g_array_append_vals (GArray *array, 91 gconstpointer data, 92 guint len); 93 GLIB_AVAILABLE_IN_ALL 94 GArray* g_array_prepend_vals (GArray *array, 95 gconstpointer data, 96 guint len); 97 GLIB_AVAILABLE_IN_ALL 98 GArray* g_array_insert_vals (GArray *array, 99 guint index_, 100 gconstpointer data, 101 guint len); 102 GLIB_AVAILABLE_IN_ALL 103 GArray* g_array_set_size (GArray *array, 104 guint length); 105 GLIB_AVAILABLE_IN_ALL 106 GArray* g_array_remove_index (GArray *array, 107 guint index_); 108 GLIB_AVAILABLE_IN_ALL 109 GArray* g_array_remove_index_fast (GArray *array, 110 guint index_); 111 GLIB_AVAILABLE_IN_ALL 112 GArray* g_array_remove_range (GArray *array, 113 guint index_, 114 guint length); 115 GLIB_AVAILABLE_IN_ALL 116 void g_array_sort (GArray *array, 117 GCompareFunc compare_func); 118 GLIB_AVAILABLE_IN_ALL 119 void g_array_sort_with_data (GArray *array, 120 GCompareDataFunc compare_func, 121 gpointer user_data); 122 GLIB_AVAILABLE_IN_2_62 123 gboolean g_array_binary_search (GArray *array, 124 gconstpointer target, 125 GCompareFunc compare_func, 126 guint *out_match_index); 127 GLIB_AVAILABLE_IN_ALL 128 void 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_] 136 GLIB_AVAILABLE_IN_ALL 137 GPtrArray* g_ptr_array_new (void); 138 GLIB_AVAILABLE_IN_ALL 139 GPtrArray* g_ptr_array_new_with_free_func (GDestroyNotify element_free_func); 140 GLIB_AVAILABLE_IN_2_62 141 GPtrArray *g_ptr_array_copy (GPtrArray *array, 142 GCopyFunc func, 143 gpointer user_data); 144 GLIB_AVAILABLE_IN_ALL 145 GPtrArray* g_ptr_array_sized_new (guint reserved_size); 146 GLIB_AVAILABLE_IN_ALL 147 GPtrArray* g_ptr_array_new_full (guint reserved_size, 148 GDestroyNotify element_free_func); 149 GLIB_AVAILABLE_IN_ALL 150 gpointer* g_ptr_array_free (GPtrArray *array, 151 gboolean free_seg); 152 GLIB_AVAILABLE_IN_ALL 153 GPtrArray* g_ptr_array_ref (GPtrArray *array); 154 GLIB_AVAILABLE_IN_ALL 155 void g_ptr_array_unref (GPtrArray *array); 156 GLIB_AVAILABLE_IN_ALL 157 void g_ptr_array_set_free_func (GPtrArray *array, 158 GDestroyNotify element_free_func); 159 GLIB_AVAILABLE_IN_ALL 160 void g_ptr_array_set_size (GPtrArray *array, 161 gint length); 162 GLIB_AVAILABLE_IN_ALL 163 gpointer g_ptr_array_remove_index (GPtrArray *array, 164 guint index_); 165 GLIB_AVAILABLE_IN_ALL 166 gpointer g_ptr_array_remove_index_fast (GPtrArray *array, 167 guint index_); 168 GLIB_AVAILABLE_IN_2_58 169 gpointer g_ptr_array_steal_index (GPtrArray *array, 170 guint index_); 171 GLIB_AVAILABLE_IN_2_58 172 gpointer g_ptr_array_steal_index_fast (GPtrArray *array, 173 guint index_); 174 GLIB_AVAILABLE_IN_ALL 175 gboolean g_ptr_array_remove (GPtrArray *array, 176 gpointer data); 177 GLIB_AVAILABLE_IN_ALL 178 gboolean g_ptr_array_remove_fast (GPtrArray *array, 179 gpointer data); 180 GLIB_AVAILABLE_IN_ALL 181 GPtrArray *g_ptr_array_remove_range (GPtrArray *array, 182 guint index_, 183 guint length); 184 GLIB_AVAILABLE_IN_ALL 185 void g_ptr_array_add (GPtrArray *array, 186 gpointer data); 187 GLIB_AVAILABLE_IN_2_62 188 void g_ptr_array_extend (GPtrArray *array_to_extend, 189 GPtrArray *array, 190 GCopyFunc func, 191 gpointer user_data); 192 GLIB_AVAILABLE_IN_2_62 193 void g_ptr_array_extend_and_steal (GPtrArray *array_to_extend, 194 GPtrArray *array); 195 GLIB_AVAILABLE_IN_2_40 196 void g_ptr_array_insert (GPtrArray *array, 197 gint index_, 198 gpointer data); 199 GLIB_AVAILABLE_IN_ALL 200 void g_ptr_array_sort (GPtrArray *array, 201 GCompareFunc compare_func); 202 GLIB_AVAILABLE_IN_ALL 203 void g_ptr_array_sort_with_data (GPtrArray *array, 204 GCompareDataFunc compare_func, 205 gpointer user_data); 206 GLIB_AVAILABLE_IN_ALL 207 void g_ptr_array_foreach (GPtrArray *array, 208 GFunc func, 209 gpointer user_data); 210 GLIB_AVAILABLE_IN_2_54 211 gboolean g_ptr_array_find (GPtrArray *haystack, 212 gconstpointer needle, 213 guint *index_); 214 GLIB_AVAILABLE_IN_2_54 215 gboolean 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 225 GLIB_AVAILABLE_IN_ALL 226 GByteArray* g_byte_array_new (void); 227 GLIB_AVAILABLE_IN_ALL 228 GByteArray* g_byte_array_new_take (guint8 *data, 229 gsize len); 230 GLIB_AVAILABLE_IN_ALL 231 GByteArray* g_byte_array_sized_new (guint reserved_size); 232 GLIB_AVAILABLE_IN_ALL 233 guint8* g_byte_array_free (GByteArray *array, 234 gboolean free_segment); 235 GLIB_AVAILABLE_IN_ALL 236 GBytes* g_byte_array_free_to_bytes (GByteArray *array); 237 GLIB_AVAILABLE_IN_ALL 238 GByteArray *g_byte_array_ref (GByteArray *array); 239 GLIB_AVAILABLE_IN_ALL 240 void g_byte_array_unref (GByteArray *array); 241 GLIB_AVAILABLE_IN_ALL 242 GByteArray* g_byte_array_append (GByteArray *array, 243 const guint8 *data, 244 guint len); 245 GLIB_AVAILABLE_IN_ALL 246 GByteArray* g_byte_array_prepend (GByteArray *array, 247 const guint8 *data, 248 guint len); 249 GLIB_AVAILABLE_IN_ALL 250 GByteArray* g_byte_array_set_size (GByteArray *array, 251 guint length); 252 GLIB_AVAILABLE_IN_ALL 253 GByteArray* g_byte_array_remove_index (GByteArray *array, 254 guint index_); 255 GLIB_AVAILABLE_IN_ALL 256 GByteArray* g_byte_array_remove_index_fast (GByteArray *array, 257 guint index_); 258 GLIB_AVAILABLE_IN_ALL 259 GByteArray* g_byte_array_remove_range (GByteArray *array, 260 guint index_, 261 guint length); 262 GLIB_AVAILABLE_IN_ALL 263 void g_byte_array_sort (GByteArray *array, 264 GCompareFunc compare_func); 265 GLIB_AVAILABLE_IN_ALL 266 void g_byte_array_sort_with_data (GByteArray *array, 267 GCompareDataFunc compare_func, 268 gpointer user_data); 269 270 G_END_DECLS 271 272 #endif /* __G_ARRAY_H__ */ 273