]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/linklist.h
bgpd, lib: Use bool instead of uint8_t for community/prefix-list "any"
[mirror_frr.git] / lib / linklist.h
index dd90608bcb5d87852a8daecb7719c93b6e2a287e..00cb9f871460be3105b5d31700fc96f6e0cbbf59 100644 (file)
@@ -180,7 +180,7 @@ extern void listnode_move_to_tail(struct list *list, struct listnode *node);
  * data
  *    data to insert into list
  */
-extern void listnode_delete(struct list *list, void *data);
+extern void listnode_delete(struct list *list, const void *data);
 
 /*
  * Find the listnode corresponding to an element in a list.
@@ -194,7 +194,7 @@ extern void listnode_delete(struct list *list, void *data);
  * Returns:
  *    pointer to listnode storing the given data if found, NULL otherwise
  */
-extern struct listnode *listnode_lookup(struct list *list, void *data);
+extern struct listnode *listnode_lookup(struct list *list, const void *data);
 
 /*
  * Retrieve the element at the head of a list.
@@ -207,17 +207,6 @@ extern struct listnode *listnode_lookup(struct list *list, void *data);
  */
 extern void *listnode_head(struct list *list);
 
-/*
- * Duplicate a list.
- *
- * list
- *    list to duplicate
- *
- * Returns:
- *    copy of the list
- */
-extern struct list *list_dup(struct list *l);
-
 /*
  * Sort a list in place.
  *
@@ -239,6 +228,26 @@ extern struct list *list_dup(struct list *l);
 extern void list_sort(struct list *list,
                      int (*cmp)(const void **, const void **));
 
+/*
+ * Convert a list to an array of void pointers.
+ *
+ * Starts from the list head and ends either on the last node of the list or
+ * when the provided array cannot store any more elements.
+ *
+ * list
+ *    list to convert
+ *
+ * arr
+ *    Pre-allocated array of void *
+ *
+ * arrlen
+ *    Number of elements in arr
+ *
+ * Returns:
+ *    arr
+ */
+void **list_to_array(struct list *list, void **arr, size_t arrlen);
+
 /*
  * Delete a list and NULL its pointer.
  *
@@ -276,18 +285,38 @@ extern void list_delete_all_node(struct list *list);
 extern void list_delete_node(struct list *list, struct listnode *node);
 
 /*
- * Append a list to an existing list.
+ * Delete all nodes which satisfy a condition from a list.
+ * Deletes the node if cond function returns true for the node.
+ * If function ptr passed is NULL, it deletes all nodes
  *
- * Runtime is O(N) where N = listcount(add).
+ * list
+ *    list to operate on
+ * cond
+ *    function pointer which takes node data as input and return true or false
+ */
+
+extern void list_filter_out_nodes(struct list *list, bool (*cond)(void *data));
+
+/*
+ * Insert a new element into a list with insertion sort if there is no
+ * duplicate element present in the list. This assumes the input list is
+ * sorted. If unsorted, it will check for duplicate until it finds out
+ * the position to do insertion sort with the unsorted list.
+ *
+ * If list->cmp is set, this function is used to determine the position to
+ * insert the new element. If it is not set, this function is equivalent to
+ * listnode_add. duplicate element is determined by cmp function returning 0.
+ *
+ * Runtime is O(N).
  *
  * list
- *    list to append to
+ *    list to operate on
  *
- * add
- *    list to append
+ * val
+ *    element to add
  */
-extern void list_add_list(struct list *list, struct list *add);
 
+extern bool listnode_add_sort_nodup(struct list *list, void *val);
 /* List iteration macro.
  * Usage: for (ALL_LIST_ELEMENTS (...) { ... }
  * It is safe to delete the listnode using this macro.
@@ -343,7 +372,13 @@ extern void list_add_list(struct list *list, struct list *add);
 
 extern struct listnode *listnode_lookup_nocheck(struct list *list, void *data);
 
-extern void listnode_add_force(struct list **list, void *val);
+/*
+ * Add a node to *list, if non-NULL. Otherwise, allocate a new list, mail
+ * it back in *list, and add a new node.
+ *
+ * Return: the new node.
+ */
+extern struct listnode *listnode_add_force(struct list **list, void *val);
 
 #ifdef __cplusplus
 }