/** * 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; }
/** * 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; }
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; }
GArray* g_array_set_size (GArray *farray, guint length) { GRealArray *array = (GRealArray*) farray; if (length > array->len) { g_array_maybe_expand (array, length - array->len); if (array->clear) g_array_elt_zero (array, array->len, length - array->len); } else if (G_UNLIKELY (g_mem_gc_friendly) && length < array->len) g_array_elt_zero (array, length, array->len - length); array->len = length; g_array_zero_terminate (array); return farray; }
GArray* g_array_set_size (GArray *farray, guint length) { GRealArray *array = (GRealArray*) farray; if (length > array->len) { g_array_maybe_expand (array, length - array->len); if (array->clear) g_array_elt_zero (array, array->len, length - array->len); } #ifdef ENABLE_GC_FRIENDLY else if (length < array->len) g_array_elt_zero (array, length, array->len - length); #endif /* ENABLE_GC_FRIENDLY */ array->len = length; g_array_zero_terminate (array); return farray; }
/** * g_array_set_size: * @array: a #GArray * @length: the new size of the #GArray * * Sets the size of the array, expanding it if necessary. If the array * was created with @clear_ set to %TRUE, the new elements are set to 0. * * Returns: the #GArray */ GArray* g_array_set_size (GArray *farray, guint length) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); if (length > array->len) { g_array_maybe_expand (array, length - array->len); if (array->clear) g_array_elt_zero (array, array->len, length - array->len); } else if (length < array->len) g_array_remove_range (farray, length, array->len - length); array->len = length; 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; }