/** * g_list_copy_deep: * @list: a #GList, this must point to the top of the list * @func: a copy function used to copy every element in the list * @user_data: user data passed to the copy function @func, or %NULL * * Makes a full (deep) copy of a #GList. * * In contrast with g_list_copy(), this function uses @func to make * a copy of each list element, in addition to copying the list * container itself. * * @func, as a #GCopyFunc, takes two arguments, the data to be copied * and a @user_data pointer. It's safe to pass %NULL as user_data, * if the copy function takes only one argument. * * For instance, if @list holds a list of GObjects, you can do: * |[<!-- language="C" --> * another_list = g_list_copy_deep (list, (GCopyFunc) g_object_ref, NULL); * ]| * * And, to entirely free the new list, you could do: * |[<!-- language="C" --> * g_list_free_full (another_list, g_object_unref); * ]| * * Returns: the start of the new list that holds a full copy of @list, * use g_list_free_full() to free it * * Since: 2.34 */ GList * g_list_copy_deep (GList *list, GCopyFunc func, gpointer user_data) { GList *new_list = NULL; if (list) { GList *last; new_list = _g_list_alloc (); if (func) new_list->data = func (list->data, user_data); else new_list->data = list->data; new_list->prev = NULL; last = new_list; list = list->next; while (list) { last->next = _g_list_alloc (); last->next->prev = last; last = last->next; if (func) last->data = func (list->data, user_data); else last->data = list->data; list = list->next; } last->next = NULL; } return new_list; }
/** * g_list_copy: * @list: a #GList * * Copies a #GList. * * <note><para> * Note that this is a "shallow" copy. If the list elements * consist of pointers to data, the pointers are copied but * the actual data is not. * </para></note> * * Returns: a copy of @list */ GList* g_list_copy (GList *list) { GList *new_list = NULL; if (list) { GList *last; new_list = _g_list_alloc (); new_list->data = list->data; new_list->prev = NULL; last = new_list; list = list->next; while (list) { last->next = _g_list_alloc (); last->next->prev = last; last = last->next; last->data = list->data; list = list->next; } last->next = NULL; } return new_list; }
/** * g_list_insert_before: * @list: a pointer to a #GList, this must point to the top of the list * @sibling: the list element before which the new element * is inserted or %NULL to insert at the end of the list * @data: the data for the new element * * Inserts a new element into the list before the given position. * * Returns: the (possibly changed) start of the #GList */ GList * g_list_insert_before (GList *list, GList *sibling, gpointer data) { if (!list) { list = g_list_alloc (); list->data = data; g_return_val_if_fail (sibling == NULL, list); return list; } else if (sibling) { GList *node; node = _g_list_alloc (); #ifdef GSTREAMER_LITE if (node == NULL) { return NULL; } #endif // GSTREAMER_LITE node->data = data; node->prev = sibling->prev; node->next = sibling; sibling->prev = node; if (node->prev) { node->prev->next = node; return list; } else { g_return_val_if_fail (sibling == list, node); return node; } } else { GList *last; last = list; while (last->next) last = last->next; last->next = _g_list_alloc (); #ifdef GSTREAMER_LITE if (last->next == NULL) { return NULL; } #endif // GSTREAMER_LITE last->next->data = data; last->next->prev = last; last->next->next = NULL; return list; } }
/** * g_list_insert: * @list: a pointer to a #GList, this must point to the top of the list * @data: the data for the new element * @position: the position to insert the element. If this is * negative, or is larger than the number of elements in the * list, the new element is added on to the end of the list. * * Inserts a new element into the list at the given position. * * Returns: the (possibly changed) start of the #GList */ GList * g_list_insert (GList *list, gpointer data, gint position) { GList *new_list; GList *tmp_list; if (position < 0) return g_list_append (list, data); else if (position == 0) return g_list_prepend (list, data); tmp_list = g_list_nth (list, position); if (!tmp_list) return g_list_append (list, data); new_list = _g_list_alloc (); #ifdef GSTREAMER_LITE if (new_list == NULL) { return NULL; } #endif // GSTREAMER_LITE new_list->data = data; new_list->prev = tmp_list->prev; tmp_list->prev->next = new_list; new_list->next = tmp_list; tmp_list->prev = new_list; return list; }
/** * g_list_prepend: * @list: a pointer to a #GList, this must point to the top of the list * @data: the data for the new element * * Prepends a new element on to the start of the list. * * Note that the return value is the new start of the list, * which will have changed, so make sure you store the new value. * * |[<!-- language="C" --> * // Notice that it is initialized to the empty list. * GList *list = NULL; * * list = g_list_prepend (list, "last"); * list = g_list_prepend (list, "first"); * ]| * * Do not use this function to prepend a new element to a different * element than the start of the list. Use g_list_insert_before() instead. * * Returns: a pointer to the newly prepended element, which is the new * start of the #GList */ GList * g_list_prepend (GList *list, gpointer data) { GList *new_list; new_list = _g_list_alloc (); #ifdef GSTREAMER_LITE if (new_list == NULL) { return NULL; } #endif // GSTREAMER_LITE new_list->data = data; new_list->next = list; if (list) { new_list->prev = list->prev; if (list->prev) list->prev->next = new_list; list->prev = new_list; } else new_list->prev = NULL; return new_list; }
/** * g_list_append: * @list: a pointer to a #GList * @data: the data for the new element * * Adds a new element on to the end of the list. * * Note that the return value is the new start of the list, * if @list was empty; make sure you store the new value. * * g_list_append() has to traverse the entire list to find the end, * which is inefficient when adding multiple elements. A common idiom * to avoid the inefficiency is to use g_list_prepend() and reverse * the list with g_list_reverse() when all elements have been added. * * |[<!-- language="C" --> * // Notice that these are initialized to the empty list. * GList *string_list = NULL, *number_list = NULL; * * // This is a list of strings. * string_list = g_list_append (string_list, "first"); * string_list = g_list_append (string_list, "second"); * * // This is a list of integers. * number_list = g_list_append (number_list, GINT_TO_POINTER (27)); * number_list = g_list_append (number_list, GINT_TO_POINTER (14)); * ]| * * Returns: either @list or the new start of the #GList if @list was %NULL */ GList * g_list_append (GList *list, gpointer data) { GList *new_list; GList *last; new_list = _g_list_alloc (); #ifdef GSTREAMER_LITE if (new_list == NULL) { return NULL; } #endif // GSTREAMER_LITE new_list->data = data; new_list->next = NULL; if (list) { last = g_list_last (list); /* g_assert (last != NULL); */ last->next = new_list; new_list->prev = last; return list; } else { new_list->prev = NULL; return new_list; } }
/** * g_list_insert: * @list: a pointer to a #GList, this must point to the top of the list * @data: the data for the new element * @position: the position to insert the element. If this is * negative, or is larger than the number of elements in the * list, the new element is added on to the end of the list. * * Inserts a new element into the list at the given position. * * Returns: the (possibly changed) start of the #GList */ GList * g_list_insert (GList *list, gpointer data, gint position) { GList *new_list; GList *tmp_list; if (position < 0) return g_list_append (list, data); else if (position == 0) return g_list_prepend (list, data); tmp_list = g_list_nth (list, position); if (!tmp_list) return g_list_append (list, data); new_list = _g_list_alloc (); new_list->data = data; new_list->prev = tmp_list->prev; tmp_list->prev->next = new_list; new_list->next = tmp_list; tmp_list->prev = new_list; return list; }
/** * g_list_append: * @list: a pointer to a #GList * @data: the data for the new element * * Adds a new element on to the end of the list. * * Note that the return value is the new start of the list, * if @list was empty; make sure you store the new value. * * g_list_append() has to traverse the entire list to find the end, * which is inefficient when adding multiple elements. A common idiom * to avoid the inefficiency is to use g_list_prepend() and reverse * the list with g_list_reverse() when all elements have been added. * * |[<!-- language="C" --> * // Notice that these are initialized to the empty list. * GList *string_list = NULL, *number_list = NULL; * * // This is a list of strings. * string_list = g_list_append (string_list, "first"); * string_list = g_list_append (string_list, "second"); * * // This is a list of integers. * number_list = g_list_append (number_list, GINT_TO_POINTER (27)); * number_list = g_list_append (number_list, GINT_TO_POINTER (14)); * ]| * * Returns: either @list or the new start of the #GList if @list was %NULL */ GList * g_list_append (GList *list, gpointer data) { GList *new_list; GList *last; new_list = _g_list_alloc (); new_list->data = data; new_list->next = NULL; if (list) { last = g_list_last (list); /* g_assert (last != NULL); */ last->next = new_list; new_list->prev = last; return list; } else { new_list->prev = NULL; return new_list; } }
/** * g_list_copy_deep: * @list: a #GList, this must point to the top of the list * @func: a copy function used to copy every element in the list * @user_data: user data passed to the copy function @func, or %NULL * * Makes a full (deep) copy of a #GList. * * In contrast with g_list_copy(), this function uses @func to make * a copy of each list element, in addition to copying the list * container itself. * * @func, as a #GCopyFunc, takes two arguments, the data to be copied * and a @user_data pointer. It's safe to pass %NULL as user_data, * if the copy function takes only one argument. * * For instance, if @list holds a list of GObjects, you can do: * |[<!-- language="C" --> * another_list = g_list_copy_deep (list, (GCopyFunc) g_object_ref, NULL); * ]| * * And, to entirely free the new list, you could do: * |[<!-- language="C" --> * g_list_free_full (another_list, g_object_unref); * ]| * * Returns: the start of the new list that holds a full copy of @list, * use g_list_free_full() to free it * * Since: 2.34 */ GList * g_list_copy_deep (GList *list, GCopyFunc func, gpointer user_data) { GList *new_list = NULL; if (list) { GList *last; new_list = _g_list_alloc (); #ifdef GSTREAMER_LITE if (new_list == NULL) { return NULL; } #endif // GSTREAMER_LITE if (func) new_list->data = func (list->data, user_data); else new_list->data = list->data; new_list->prev = NULL; last = new_list; list = list->next; while (list) { last->next = _g_list_alloc (); #ifdef GSTREAMER_LITE if (last->next == NULL) { return NULL; } #endif // GSTREAMER_LITE last->next->prev = last; last = last->next; if (func) last->data = func (list->data, user_data); else last->data = list->data; list = list->next; } last->next = NULL; } return new_list; }
GList *g_list_append(GList *list, void *data) { GList *new_list; GList *last; new_list = _g_list_alloc (); new_list->data = data; if (list) { last = g_list_last (list); /* g_assert (last != NULL); */ last->next = new_list; return list; } else return new_list; }
/** * g_list_prepend: * @list: a pointer to a #GList, this must point to the top of the list * @data: the data for the new element * * Prepends a new element on to the start of the list. * * Note that the return value is the new start of the list, * which will have changed, so make sure you store the new value. * * |[<!-- language="C" --> * // Notice that it is initialized to the empty list. * GList *list = NULL; * * list = g_list_prepend (list, "last"); * list = g_list_prepend (list, "first"); * ]| * * Do not use this function to prepend a new element to a different * element than the start of the list. Use g_list_insert_before() instead. * * Returns: a pointer to the newly prepended element, which is the new * start of the #GList */ GList * g_list_prepend (GList *list, gpointer data) { GList *new_list; new_list = _g_list_alloc (); new_list->data = data; new_list->next = list; if (list) { new_list->prev = list->prev; if (list->prev) list->prev->next = new_list; list->prev = new_list; } else new_list->prev = NULL; return new_list; }