GRand: move docs from tmpl to inline comments
[platform/upstream/glib.git] / glib / garray.c
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 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, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GLib Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 /* 
28  * MT safe
29  */
30
31 #include "config.h"
32
33 #include <string.h>
34 #include <stdlib.h>
35
36 #include "garray.h"
37
38 #include "gmem.h"
39 #include "gthread.h"
40 #include "gmessages.h"
41 #include "gqsort.h"
42
43 #include "galias.h"
44
45
46 #define MIN_ARRAY_SIZE  16
47
48 typedef struct _GRealArray  GRealArray;
49
50 struct _GRealArray
51 {
52   guint8 *data;
53   guint   len;
54   guint   alloc;
55   guint   elt_size;
56   guint   zero_terminated : 1;
57   guint   clear : 1;
58   volatile gint ref_count;
59 };
60
61 #define g_array_elt_len(array,i) ((array)->elt_size * (i))
62 #define g_array_elt_pos(array,i) ((array)->data + g_array_elt_len((array),(i)))
63 #define g_array_elt_zero(array, pos, len)                               \
64   (memset (g_array_elt_pos ((array), pos), 0,  g_array_elt_len ((array), len)))
65 #define g_array_zero_terminate(array) G_STMT_START{                     \
66   if ((array)->zero_terminated)                                         \
67     g_array_elt_zero ((array), (array)->len, 1);                        \
68 }G_STMT_END
69
70 static guint g_nearest_pow        (gint        num) G_GNUC_CONST;
71 static void  g_array_maybe_expand (GRealArray *array,
72                                    gint        len);
73
74 GArray*
75 g_array_new (gboolean zero_terminated,
76              gboolean clear,
77              guint    elt_size)
78 {
79   return (GArray*) g_array_sized_new (zero_terminated, clear, elt_size, 0);
80 }
81
82 GArray* g_array_sized_new (gboolean zero_terminated,
83                            gboolean clear,
84                            guint    elt_size,
85                            guint    reserved_size)
86 {
87   GRealArray *array = g_slice_new (GRealArray);
88
89   array->data            = NULL;
90   array->len             = 0;
91   array->alloc           = 0;
92   array->zero_terminated = (zero_terminated ? 1 : 0);
93   array->clear           = (clear ? 1 : 0);
94   array->elt_size        = elt_size;
95   array->ref_count       = 1;
96
97   if (array->zero_terminated || reserved_size != 0)
98     {
99       g_array_maybe_expand (array, reserved_size);
100       g_array_zero_terminate(array);
101     }
102
103   return (GArray*) array;
104 }
105
106 /**
107  * g_array_ref:
108  * @array: A #GArray.
109  *
110  * Atomically increments the reference count of @array by one. This
111  * function is MT-safe and may be called from any thread.
112  *
113  * Returns: The passed in #GArray.
114  *
115  * Since: 2.22
116  **/
117 GArray *
118 g_array_ref (GArray *array)
119 {
120   GRealArray *rarray = (GRealArray*) array;
121   g_return_val_if_fail (g_atomic_int_get (&rarray->ref_count) > 0, array);
122   g_atomic_int_inc (&rarray->ref_count);
123   return array;
124 }
125
126 /**
127  * g_array_unref:
128  * @array: A #GArray.
129  *
130  * Atomically decrements the reference count of @array by one. If the
131  * reference count drops to 0, all memory allocated by the array is
132  * released. This function is MT-safe and may be called from any
133  * thread.
134  *
135  * Since: 2.22
136  **/
137 void
138 g_array_unref (GArray *array)
139 {
140   GRealArray *rarray = (GRealArray*) array;
141   g_return_if_fail (g_atomic_int_get (&rarray->ref_count) > 0);
142   if (g_atomic_int_dec_and_test (&rarray->ref_count))
143     g_array_free (array, TRUE);
144 }
145
146 /**
147  * g_array_get_element_size:
148  * @array: A #GArray.
149  *
150  * Gets the size of the elements in @array.
151  *
152  * Returns: Size of each element, in bytes.
153  *
154  * Since: 2.22
155  **/
156 guint
157 g_array_get_element_size (GArray *array)
158 {
159   GRealArray *rarray = (GRealArray*) array;
160   return rarray->elt_size;
161 }
162
163 gchar*
164 g_array_free (GArray   *farray,
165               gboolean  free_segment)
166 {
167   GRealArray *array = (GRealArray*) farray;
168   gchar* segment;
169   gboolean preserve_wrapper;
170
171   g_return_val_if_fail (array, NULL);
172
173   /* if others are holding a reference, preserve the wrapper but do free/return the data */
174   preserve_wrapper = FALSE;
175   if (g_atomic_int_get (&array->ref_count) > 1)
176     preserve_wrapper = TRUE;
177
178   if (free_segment)
179     {
180       g_free (array->data);
181       segment = NULL;
182     }
183   else
184     segment = (gchar*) array->data;
185
186   if (preserve_wrapper)
187     {
188       array->data            = NULL;
189       array->len             = 0;
190       array->alloc           = 0;
191     }
192   else
193     {
194       g_slice_free1 (sizeof (GRealArray), array);
195     }
196
197   return segment;
198 }
199
200 GArray*
201 g_array_append_vals (GArray       *farray,
202                      gconstpointer data,
203                      guint         len)
204 {
205   GRealArray *array = (GRealArray*) farray;
206
207   g_array_maybe_expand (array, len);
208
209   memcpy (g_array_elt_pos (array, array->len), data, 
210           g_array_elt_len (array, len));
211
212   array->len += len;
213
214   g_array_zero_terminate (array);
215
216   return farray;
217 }
218
219 GArray*
220 g_array_prepend_vals (GArray        *farray,
221                       gconstpointer  data,
222                       guint          len)
223 {
224   GRealArray *array = (GRealArray*) farray;
225
226   g_array_maybe_expand (array, len);
227
228   g_memmove (g_array_elt_pos (array, len), g_array_elt_pos (array, 0), 
229              g_array_elt_len (array, array->len));
230
231   memcpy (g_array_elt_pos (array, 0), data, g_array_elt_len (array, len));
232
233   array->len += len;
234
235   g_array_zero_terminate (array);
236
237   return farray;
238 }
239
240 GArray*
241 g_array_insert_vals (GArray        *farray,
242                      guint          index_,
243                      gconstpointer  data,
244                      guint          len)
245 {
246   GRealArray *array = (GRealArray*) farray;
247
248   g_array_maybe_expand (array, len);
249
250   g_memmove (g_array_elt_pos (array, len + index_), 
251              g_array_elt_pos (array, index_), 
252              g_array_elt_len (array, array->len - index_));
253
254   memcpy (g_array_elt_pos (array, index_), data, g_array_elt_len (array, len));
255
256   array->len += len;
257
258   g_array_zero_terminate (array);
259
260   return farray;
261 }
262
263 GArray*
264 g_array_set_size (GArray *farray,
265                   guint   length)
266 {
267   GRealArray *array = (GRealArray*) farray;
268   if (length > array->len)
269     {
270       g_array_maybe_expand (array, length - array->len);
271       
272       if (array->clear)
273         g_array_elt_zero (array, array->len, length - array->len);
274     }
275   else if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len)
276     g_array_elt_zero (array, length, array->len - length);
277   
278   array->len = length;
279   
280   g_array_zero_terminate (array);
281   
282   return farray;
283 }
284
285 GArray*
286 g_array_remove_index (GArray *farray,
287                       guint   index_)
288 {
289   GRealArray* array = (GRealArray*) farray;
290
291   g_return_val_if_fail (array, NULL);
292
293   g_return_val_if_fail (index_ < array->len, NULL);
294
295   if (index_ != array->len - 1)
296     g_memmove (g_array_elt_pos (array, index_),
297                g_array_elt_pos (array, index_ + 1),
298                g_array_elt_len (array, array->len - index_ - 1));
299   
300   array->len -= 1;
301
302   if (G_UNLIKELY (g_mem_gc_friendly))
303     g_array_elt_zero (array, array->len, 1);
304   else
305     g_array_zero_terminate (array);
306
307   return farray;
308 }
309
310 GArray*
311 g_array_remove_index_fast (GArray *farray,
312                            guint   index_)
313 {
314   GRealArray* array = (GRealArray*) farray;
315
316   g_return_val_if_fail (array, NULL);
317
318   g_return_val_if_fail (index_ < array->len, NULL);
319
320   if (index_ != array->len - 1)
321     memcpy (g_array_elt_pos (array, index_), 
322             g_array_elt_pos (array, array->len - 1),
323             g_array_elt_len (array, 1));
324   
325   array->len -= 1;
326
327   if (G_UNLIKELY (g_mem_gc_friendly))
328     g_array_elt_zero (array, array->len, 1);
329   else
330     g_array_zero_terminate (array);
331
332   return farray;
333 }
334
335 GArray*
336 g_array_remove_range (GArray *farray,
337                       guint   index_,
338                       guint   length)
339 {
340   GRealArray *array = (GRealArray*) farray;
341
342   g_return_val_if_fail (array, NULL);
343   g_return_val_if_fail (index_ < array->len, NULL);
344   g_return_val_if_fail (index_ + length <= array->len, NULL);
345
346   if (index_ + length != array->len)
347     g_memmove (g_array_elt_pos (array, index_), 
348                g_array_elt_pos (array, index_ + length), 
349                (array->len - (index_ + length)) * array->elt_size);
350
351   array->len -= length;
352   if (G_UNLIKELY (g_mem_gc_friendly))
353     g_array_elt_zero (array, array->len, length);
354   else
355     g_array_zero_terminate (array);
356
357   return farray;
358 }
359
360 void
361 g_array_sort (GArray       *farray,
362               GCompareFunc  compare_func)
363 {
364   GRealArray *array = (GRealArray*) farray;
365
366   g_return_if_fail (array != NULL);
367
368   qsort (array->data,
369          array->len,
370          array->elt_size,
371          compare_func);
372 }
373
374 void
375 g_array_sort_with_data (GArray           *farray,
376                         GCompareDataFunc  compare_func,
377                         gpointer          user_data)
378 {
379   GRealArray *array = (GRealArray*) farray;
380
381   g_return_if_fail (array != NULL);
382
383   g_qsort_with_data (array->data,
384                      array->len,
385                      array->elt_size,
386                      compare_func,
387                      user_data);
388 }
389
390 /* Returns the smallest power of 2 greater than n, or n if
391  * such power does not fit in a guint
392  */
393 static guint
394 g_nearest_pow (gint num)
395 {
396   guint n = 1;
397
398   while (n < num && n > 0)
399     n <<= 1;
400
401   return n ? n : num;
402 }
403
404 static void
405 g_array_maybe_expand (GRealArray *array,
406                       gint        len)
407 {
408   guint want_alloc = g_array_elt_len (array, array->len + len + 
409                                       array->zero_terminated);
410
411   if (want_alloc > array->alloc)
412     {
413       want_alloc = g_nearest_pow (want_alloc);
414       want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE);
415
416       array->data = g_realloc (array->data, want_alloc);
417
418       if (G_UNLIKELY (g_mem_gc_friendly))
419         memset (array->data + array->alloc, 0, want_alloc - array->alloc);
420
421       array->alloc = want_alloc;
422     }
423 }
424
425 /* Pointer Array
426  */
427
428 typedef struct _GRealPtrArray  GRealPtrArray;
429
430 struct _GRealPtrArray
431 {
432   gpointer     *pdata;
433   guint         len;
434   guint         alloc;
435   volatile gint ref_count;
436   GDestroyNotify element_free_func;
437 };
438
439 static void g_ptr_array_maybe_expand (GRealPtrArray *array,
440                                       gint           len);
441
442 GPtrArray*
443 g_ptr_array_new (void)
444 {
445   return g_ptr_array_sized_new (0);
446 }
447
448 GPtrArray*  
449 g_ptr_array_sized_new (guint reserved_size)
450 {
451   GRealPtrArray *array = g_slice_new (GRealPtrArray);
452
453   array->pdata = NULL;
454   array->len = 0;
455   array->alloc = 0;
456   array->ref_count = 1;
457   array->element_free_func = NULL;
458
459   if (reserved_size != 0)
460     g_ptr_array_maybe_expand (array, reserved_size);
461
462   return (GPtrArray*) array;  
463 }
464
465 /**
466  * g_ptr_array_new_with_free_func:
467  * @element_free_func: A function to free elements with destroy @array or %NULL.
468  *
469  * Creates a new #GPtrArray with a reference count of 1 and use @element_free_func
470  * for freeing each element when the array is destroyed either via
471  * g_ptr_array_unref(), when g_ptr_array_free() is called with @free_segment
472  * set to %TRUE or when removing elements.
473  *
474  * Returns: A new #GPtrArray.
475  *
476  * Since: 2.22
477  **/
478 GPtrArray *
479 g_ptr_array_new_with_free_func (GDestroyNotify element_free_func)
480 {
481   GPtrArray *array;
482
483   array = g_ptr_array_new ();
484   g_ptr_array_set_free_func (array, element_free_func);
485   return array;
486 }
487
488 /**
489  * g_ptr_array_set_free_func:
490  * @array: A #GPtrArray.
491  * @element_free_func: A function to free elements with destroy @array or %NULL.
492  *
493  * Sets a function for freeing each element when @array is destroyed
494  * either via g_ptr_array_unref(), when g_ptr_array_free() is called
495  * with @free_segment set to %TRUE or when removing elements.
496  *
497  * Since: 2.22
498  **/
499 void
500 g_ptr_array_set_free_func (GPtrArray        *array,
501                            GDestroyNotify    element_free_func)
502 {
503   GRealPtrArray* rarray = (GRealPtrArray*) array;
504   rarray->element_free_func = element_free_func;
505 }
506
507 /**
508  * g_ptr_array_ref:
509  * @array: A #GArray.
510  *
511  * Atomically increments the reference count of @array by one. This
512  * function is MT-safe and may be called from any thread.
513  *
514  * Returns: The passed in #GPtrArray.
515  *
516  * Since: 2.22
517  **/
518 GPtrArray *
519 g_ptr_array_ref (GPtrArray *array)
520 {
521   GRealPtrArray *rarray = (GRealPtrArray*) array;
522   g_return_val_if_fail (g_atomic_int_get (&rarray->ref_count) > 0, array);
523   g_atomic_int_inc (&rarray->ref_count);
524   return array;
525 }
526
527 /**
528  * g_ptr_array_unref:
529  * @array: A #GPtrArray.
530  *
531  * Atomically decrements the reference count of @array by one. If the
532  * reference count drops to 0, the effect is the same as calling
533  * g_ptr_array_free() with @free_segment set to %TRUE. This function
534  * is MT-safe and may be called from any thread.
535  *
536  * Since: 2.22
537  **/
538 void
539 g_ptr_array_unref (GPtrArray *array)
540 {
541   GRealPtrArray *rarray = (GRealPtrArray*) array;
542   g_return_if_fail (g_atomic_int_get (&rarray->ref_count) > 0);
543   if (g_atomic_int_dec_and_test (&rarray->ref_count))
544     g_ptr_array_free (array, TRUE);
545 }
546
547 gpointer*
548 g_ptr_array_free (GPtrArray *farray,
549                   gboolean   free_segment)
550 {
551   GRealPtrArray *array = (GRealPtrArray*) farray;
552   gpointer* segment;
553   gboolean preserve_wrapper;
554
555   g_return_val_if_fail (array, NULL);
556
557   /* if others are holding a reference, preserve the wrapper but do free/return the data */
558   preserve_wrapper = FALSE;
559   if (g_atomic_int_get (&array->ref_count) > 1)
560     preserve_wrapper = TRUE;
561
562   if (free_segment)
563     {
564       if (array->element_free_func != NULL)
565         g_ptr_array_foreach (farray, (GFunc) array->element_free_func, NULL);
566       g_free (array->pdata);
567       segment = NULL;
568     }
569   else
570     segment = array->pdata;
571
572   if (preserve_wrapper)
573     {
574       array->pdata = NULL;
575       array->len = 0;
576       array->alloc = 0;
577     }
578   else
579     {
580       g_slice_free1 (sizeof (GRealPtrArray), array);
581     }
582
583   return segment;
584 }
585
586 static void
587 g_ptr_array_maybe_expand (GRealPtrArray *array,
588                           gint           len)
589 {
590   if ((array->len + len) > array->alloc)
591     {
592       guint old_alloc = array->alloc;
593       array->alloc = g_nearest_pow (array->len + len);
594       array->alloc = MAX (array->alloc, MIN_ARRAY_SIZE);
595       array->pdata = g_realloc (array->pdata, sizeof (gpointer) * array->alloc);
596       if (G_UNLIKELY (g_mem_gc_friendly))
597         for ( ; old_alloc < array->alloc; old_alloc++)
598           array->pdata [old_alloc] = NULL;
599     }
600 }
601
602 void
603 g_ptr_array_set_size  (GPtrArray *farray,
604                        gint       length)
605 {
606   GRealPtrArray* array = (GRealPtrArray*) farray;
607
608   g_return_if_fail (array);
609
610   if (length > array->len)
611     {
612       int i;
613       g_ptr_array_maybe_expand (array, (length - array->len));
614       /* This is not 
615        *     memset (array->pdata + array->len, 0,
616        *            sizeof (gpointer) * (length - array->len));
617        * to make it really portable. Remember (void*)NULL needn't be
618        * bitwise zero. It of course is silly not to use memset (..,0,..).
619        */
620       for (i = array->len; i < length; i++)
621         array->pdata[i] = NULL;
622     }
623   else if (length < array->len)
624     g_ptr_array_remove_range (farray, length, array->len - length);
625
626   array->len = length;
627 }
628
629 gpointer
630 g_ptr_array_remove_index (GPtrArray *farray,
631                           guint      index_)
632 {
633   GRealPtrArray* array = (GRealPtrArray*) farray;
634   gpointer result;
635
636   g_return_val_if_fail (array, NULL);
637
638   g_return_val_if_fail (index_ < array->len, NULL);
639
640   result = array->pdata[index_];
641   
642   if (array->element_free_func != NULL)
643     array->element_free_func (array->pdata[index_]);
644
645   if (index_ != array->len - 1)
646     g_memmove (array->pdata + index_, array->pdata + index_ + 1, 
647                sizeof (gpointer) * (array->len - index_ - 1));
648   
649   array->len -= 1;
650
651   if (G_UNLIKELY (g_mem_gc_friendly))
652     array->pdata[array->len] = NULL;
653
654   return result;
655 }
656
657 gpointer
658 g_ptr_array_remove_index_fast (GPtrArray *farray,
659                                guint      index_)
660 {
661   GRealPtrArray* array = (GRealPtrArray*) farray;
662   gpointer result;
663
664   g_return_val_if_fail (array, NULL);
665
666   g_return_val_if_fail (index_ < array->len, NULL);
667
668   result = array->pdata[index_];
669   
670   if (index_ != array->len - 1)
671     {
672       if (array->element_free_func != NULL)
673         array->element_free_func (array->pdata[index_]);
674       array->pdata[index_] = array->pdata[array->len - 1];
675     }
676
677   array->len -= 1;
678
679   if (G_UNLIKELY (g_mem_gc_friendly))
680     array->pdata[array->len] = NULL;
681
682   return result;
683 }
684
685 void
686 g_ptr_array_remove_range (GPtrArray *farray,
687                           guint      index_,
688                           guint      length)
689 {
690   GRealPtrArray* array = (GRealPtrArray*) farray;
691   guint n;
692
693   g_return_if_fail (array);
694   g_return_if_fail (index_ < array->len);
695   g_return_if_fail (index_ + length <= array->len);
696
697   if (array->element_free_func != NULL)
698     {
699       for (n = index_; n < index_ + length; n++)
700         array->element_free_func (array->pdata[n]);
701     }
702
703   if (index_ + length != array->len)
704     {
705       g_memmove (&array->pdata[index_],
706                  &array->pdata[index_ + length], 
707                  (array->len - (index_ + length)) * sizeof (gpointer));
708     }
709
710   array->len -= length;
711   if (G_UNLIKELY (g_mem_gc_friendly))
712     {
713       guint i;
714       for (i = 0; i < length; i++)
715         array->pdata[array->len + i] = NULL;
716     }
717 }
718
719 gboolean
720 g_ptr_array_remove (GPtrArray *farray,
721                     gpointer   data)
722 {
723   GRealPtrArray* array = (GRealPtrArray*) farray;
724   guint i;
725
726   g_return_val_if_fail (array, FALSE);
727
728   for (i = 0; i < array->len; i += 1)
729     {
730       if (array->pdata[i] == data)
731         {
732           g_ptr_array_remove_index (farray, i);
733           return TRUE;
734         }
735     }
736
737   return FALSE;
738 }
739
740 gboolean
741 g_ptr_array_remove_fast (GPtrArray *farray,
742                          gpointer   data)
743 {
744   GRealPtrArray* array = (GRealPtrArray*) farray;
745   guint i;
746
747   g_return_val_if_fail (array, FALSE);
748
749   for (i = 0; i < array->len; i += 1)
750     {
751       if (array->pdata[i] == data)
752         {
753           g_ptr_array_remove_index_fast (farray, i);
754           return TRUE;
755         }
756     }
757
758   return FALSE;
759 }
760
761 void
762 g_ptr_array_add (GPtrArray *farray,
763                  gpointer   data)
764 {
765   GRealPtrArray* array = (GRealPtrArray*) farray;
766
767   g_return_if_fail (array);
768
769   g_ptr_array_maybe_expand (array, 1);
770
771   array->pdata[array->len++] = data;
772 }
773
774 void
775 g_ptr_array_sort (GPtrArray    *array,
776                   GCompareFunc  compare_func)
777 {
778   g_return_if_fail (array != NULL);
779
780   qsort (array->pdata,
781          array->len,
782          sizeof (gpointer),
783          compare_func);
784 }
785
786 void
787 g_ptr_array_sort_with_data (GPtrArray        *array,
788                             GCompareDataFunc  compare_func,
789                             gpointer          user_data)
790 {
791   g_return_if_fail (array != NULL);
792
793   g_qsort_with_data (array->pdata,
794                      array->len,
795                      sizeof (gpointer),
796                      compare_func,
797                      user_data);
798 }
799
800 /**
801  * g_ptr_array_foreach:
802  * @array: a #GPtrArray
803  * @func: the function to call for each array element
804  * @user_data: user data to pass to the function
805  * 
806  * Calls a function for each element of a #GPtrArray.
807  *
808  * Since: 2.4
809  **/
810 void
811 g_ptr_array_foreach (GPtrArray *array,
812                      GFunc      func,
813                      gpointer   user_data)
814 {
815   guint i;
816
817   g_return_if_fail (array);
818
819   for (i = 0; i < array->len; i++)
820     (*func) (array->pdata[i], user_data);
821 }
822
823 /* Byte arrays 
824  */
825
826 GByteArray* g_byte_array_new (void)
827 {
828   return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, 0);
829 }
830
831 GByteArray* g_byte_array_sized_new (guint reserved_size)
832 {
833   return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, reserved_size);
834 }
835
836 guint8*     g_byte_array_free     (GByteArray *array,
837                                    gboolean    free_segment)
838 {
839   return (guint8*) g_array_free ((GArray*) array, free_segment);
840 }
841
842 /**
843  * g_byte_array_ref:
844  * @array: A #GByteArray.
845  *
846  * Atomically increments the reference count of @array by one. This
847  * function is MT-safe and may be called from any thread.
848  *
849  * Returns: The passed in #GByteArray.
850  *
851  * Since: 2.22
852  **/
853 GByteArray *
854 g_byte_array_ref (GByteArray *array)
855 {
856   return (GByteArray *) g_array_ref ((GArray *) array);
857 }
858
859 /**
860  * g_byte_array_unref:
861  * @array: A #GByteArray.
862  *
863  * Atomically decrements the reference count of @array by one. If the
864  * reference count drops to 0, all memory allocated by the array is
865  * released. This function is MT-safe and may be called from any
866  * thread.
867  *
868  * Since: 2.22
869  **/
870 void
871 g_byte_array_unref (GByteArray *array)
872 {
873   g_array_unref ((GArray *) array);
874 }
875
876 GByteArray* g_byte_array_append   (GByteArray   *array,
877                                    const guint8 *data,
878                                    guint         len)
879 {
880   g_array_append_vals ((GArray*) array, (guint8*)data, len);
881
882   return array;
883 }
884
885 GByteArray* g_byte_array_prepend  (GByteArray   *array,
886                                    const guint8 *data,
887                                    guint         len)
888 {
889   g_array_prepend_vals ((GArray*) array, (guint8*)data, len);
890
891   return array;
892 }
893
894 GByteArray* g_byte_array_set_size (GByteArray *array,
895                                    guint       length)
896 {
897   g_array_set_size ((GArray*) array, length);
898
899   return array;
900 }
901
902 GByteArray* g_byte_array_remove_index (GByteArray *array,
903                                        guint       index_)
904 {
905   g_array_remove_index ((GArray*) array, index_);
906
907   return array;
908 }
909
910 GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
911                                             guint       index_)
912 {
913   g_array_remove_index_fast ((GArray*) array, index_);
914
915   return array;
916 }
917
918 GByteArray*
919 g_byte_array_remove_range (GByteArray *array,
920                            guint       index_,
921                            guint       length)
922 {
923   g_return_val_if_fail (array, NULL);
924   g_return_val_if_fail (index_ < array->len, NULL);
925   g_return_val_if_fail (index_ + length <= array->len, NULL);
926
927   return (GByteArray *)g_array_remove_range ((GArray*) array, index_, length);
928 }
929
930 void
931 g_byte_array_sort (GByteArray   *array,
932                    GCompareFunc  compare_func)
933 {
934   g_array_sort ((GArray *) array, compare_func);
935 }
936
937 void
938 g_byte_array_sort_with_data (GByteArray       *array,
939                              GCompareDataFunc  compare_func,
940                              gpointer          user_data)
941 {
942   g_array_sort_with_data ((GArray *) array, compare_func, user_data);
943 }
944
945 #define __G_ARRAY_C__
946 #include "galiasdef.c"