/** * g_array_remove_range: * @array: a @GArray * @index_: the index of the first element to remove * @length: the number of elements to remove * * Removes the given number of elements starting at the given index * from a #GArray. The following elements are moved to close the gap. * * Returns: the #GArray * * Since: 2.4 */ GArray* g_array_remove_range (GArray *farray, guint index_, guint length) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ <= array->len, NULL); g_return_val_if_fail (index_ + length <= array->len, NULL); if (array->clear_func != NULL) { guint i; for (i = 0; i < length; i++) array->clear_func (g_array_elt_pos (array, index_ + i)); } if (index_ + length != array->len) memmove (g_array_elt_pos (array, index_), g_array_elt_pos (array, index_ + length), (array->len - (index_ + length)) * array->elt_size); array->len -= length; if (G_UNLIKELY (g_mem_gc_friendly)) g_array_elt_zero (array, array->len, length); else g_array_zero_terminate (array); return farray; }
GArray* g_array_remove_range (GArray *farray, guint index_, guint length) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); g_return_val_if_fail (index_ + length <= array->len, NULL); if (index_ + length != array->len) g_memmove (g_array_elt_pos (array, index_), g_array_elt_pos (array, index_ + length), (array->len - (index_ + length)) * array->elt_size); array->len -= length; #ifdef ENABLE_GC_FRIENDLY g_array_elt_zero (array, array->len, length); #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_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; }
static gchar * array_free (GRealArray *array, ArrayFreeFlags flags) { gchar *segment; if (flags & FREE_SEGMENT) { if (array->clear_func != NULL) { guint i; for (i = 0; i < array->len; i++) array->clear_func (g_array_elt_pos (array, i)); } g_free (array->data); segment = NULL; } else segment = (gchar*) array->data; if (flags & PRESERVE_WRAPPER) { array->data = NULL; array->len = 0; array->alloc = 0; } else { g_slice_free1 (sizeof (GRealArray), array); } return segment; }
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; }
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; }
EXPORT_C GArray* g_array_remove_range (GArray *farray, guint index_, guint length) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ < array->len, NULL); g_return_val_if_fail (index_ + length <= array->len, NULL); if (index_ + length != array->len) g_memmove (g_array_elt_pos (array, index_), g_array_elt_pos (array, index_ + length), (array->len - (index_ + length)) * array->elt_size); array->len -= length; if (G_UNLIKELY (g_mem_gc_friendly)) g_array_elt_zero (array, array->len, length); else g_array_zero_terminate (array); return farray; }
/** * 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; }