GArray* g_array_remove_index_fast (GArray* farray, guint index) { GRealArray* array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index < array->len, NULL); if (index != array->len - 1) memcpy (g_array_elt_pos (array, index), g_array_elt_pos (array, array->len - 1), g_array_elt_len (array, 1)); array->len -= 1; #ifdef ENABLE_GC_FRIENDLY g_array_elt_zero (array, array->len, 1); #else /* !ENABLE_GC_FRIENDLY */ g_array_zero_terminate (array); #endif /* ENABLE_GC_FRIENDLY */ return farray; }
/** * g_array_remove_index_fast: * @array: a @GArray * @index_: the index of the element to remove * * Removes the element at the given index from a #GArray. The last * element in the array is used to fill in the space, so this function * does not preserve the order of the #GArray. But it is faster than * g_array_remove_index(). * * Returns: the #GArray */ GArray* g_array_remove_index_fast (GArray *farray, guint index_) { GRealArray* array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); if (array->clear_func != NULL) array->clear_func (g_array_elt_pos (array, index_)); if (index_ != array->len - 1) memcpy (g_array_elt_pos (array, index_), g_array_elt_pos (array, array->len - 1), g_array_elt_len (array, 1)); array->len -= 1; if (G_UNLIKELY (g_mem_gc_friendly)) g_array_elt_zero (array, array->len, 1); else g_array_zero_terminate (array); return farray; }
GArray* g_array_prepend_vals (GArray *farray, gconstpointer data, guint len) { GRealArray *array = (GRealArray*) farray; g_array_maybe_expand (array, len); g_memmove (g_array_elt_pos (array, len), g_array_elt_pos (array, 0), g_array_elt_len (array, array->len)); memcpy (g_array_elt_pos (array, 0), data, g_array_elt_len (array, len)); array->len += len; g_array_zero_terminate (array); return farray; }
EXPORT_C GArray* g_array_insert_vals (GArray *farray, guint index_, gconstpointer data, guint len) { GRealArray *array = (GRealArray*) farray; g_array_maybe_expand (array, len); g_memmove (g_array_elt_pos (array, len + index_), g_array_elt_pos (array, index_), g_array_elt_len (array, array->len - index_)); memcpy (g_array_elt_pos (array, index_), data, g_array_elt_len (array, len)); array->len += len; g_array_zero_terminate (array); return farray; }
static void g_array_maybe_expand (GRealArray *array, gint len) { guint want_alloc = g_array_elt_len (array, array->len + len + array->zero_terminated); if (want_alloc > array->alloc) { want_alloc = g_nearest_pow (want_alloc); want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE); array->data = g_realloc (array->data, want_alloc); if (G_UNLIKELY (g_mem_gc_friendly)) memset (array->data + array->alloc, 0, want_alloc - array->alloc); array->alloc = want_alloc; } }
/** * g_array_append_val: * @a: a #GArray * @v: the value to append to the #GArray * * Adds the value on to the end of the array. The array will grow in * size automatically if necessary. * * g_array_append_val() is a macro which uses a reference to the value * parameter @v. This means that you cannot use it with literal values * such as "27". You must use variables. * * Returns: the #GArray */ GArray* g_array_append_vals (GArray *farray, gconstpointer data, guint len) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_array_maybe_expand (array, len); memcpy (g_array_elt_pos (array, array->len), data, g_array_elt_len (array, len)); array->len += len; g_array_zero_terminate (array); return farray; }
static void g_array_maybe_expand (GRealArray *array, gint len) { guint want_alloc = g_array_elt_len (array, array->len + len + array->zero_terminated); if (want_alloc > array->alloc) { want_alloc = g_nearest_pow (want_alloc); want_alloc = MAX (want_alloc, MIN_ARRAY_SIZE); array->data = g_realloc (array->data, want_alloc); #ifdef ENABLE_GC_FRIENDLY memset (array->data + array->alloc, 0, want_alloc - array->alloc); #endif /* ENABLE_GC_FRIENDLY */ array->alloc = want_alloc; } }
GArray* g_array_remove_index (GArray* farray, guint index) { GRealArray* array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index < array->len, NULL); if (index != array->len - 1) g_memmove (g_array_elt_pos (array, index), g_array_elt_pos (array, index + 1), g_array_elt_len (array, array->len - index - 1)); array->len -= 1; if (G_UNLIKELY (g_mem_gc_friendly)) g_array_elt_zero (array, array->len, 1); else g_array_zero_terminate (array); return farray; }