GArray* g_array_append_vals (GArray *farray, gconstpointer data, guint len) { GRealArray *array = (GRealArray*) farray; 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; }
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; }
/** * g_array_prepend_val: * @a: a #GArray * @v: the value to prepend to the #GArray * * Adds the value on to the start of the array. The array will grow in * size automatically if necessary. * * This operation is slower than g_array_append_val() since the * existing elements in the array have to be moved to make space for * the new element. * * g_array_prepend_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_prepend_vals (GArray *farray, gconstpointer data, guint len) { GRealArray *array = (GRealArray*) farray; g_return_val_if_fail (array, NULL); g_array_maybe_expand (array, len); 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; }
GArray* g_array_sized_new (gboolean zero_terminated, gboolean clear, guint elt_size, guint reserved_size) { GRealArray *array = g_slice_new (GRealArray); array->data = NULL; array->len = 0; array->alloc = 0; array->zero_terminated = (zero_terminated ? 1 : 0); array->clear = (clear ? 1 : 0); array->elt_size = elt_size; if (array->zero_terminated || reserved_size != 0) { g_array_maybe_expand (array, reserved_size); g_array_zero_terminate(array); } return (GArray*) array; }
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_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_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; }
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; if (G_UNLIKELY (g_mem_gc_friendly)) g_array_elt_zero (array, array->len, 1); else g_array_zero_terminate (array); return farray; }