/* ****************************************************************************** Project: OWA EPANET Version: 2.2 Module: util/list.h Description: Generic list https://gist.github.com/pseudomuto/6334796#file-list-h Accessed: April 9, 2019 Authors: David Muto, Michael Tryby Copyright: see AUTHORS License: see LICENSE Last Updated: 04/09/2019 ****************************************************************************** */ #ifndef LIST_H #define LIST_H #include #if defined(__cplusplus) extern "C" { #endif // Forward declarations typedef struct list_node_s list_node_t; typedef struct list_s list_t; typedef void(*freeFunction)(void *); typedef bool(*listIterator)(list_node_t *); /** @brief Initializes a linked list to store elements of elementSize and to call freeFunction for each element when destroying a list. */ list_t *create_list(size_t elementSize, freeFunction freeFn); /** @brief Frees dynamically allocated nodes and optionally calls freeFunction with each node’s data pointer. */ void delete_list(list_t *list); /** @brief Adds a node to the head of the list. */ void prepend_list(list_t *list, void *element); /** @brief Adds a node to the tail of the list. */ void append_list(list_t *list, void *element); /** @brief Returns the number of items in the list. */ int size_list(list_t *list); /** @brief Returns pointer to list node's data. */ void *get_data(list_node_t *lnode); /** @brief Calls the supplied iterator function with the data element of each node (iterates over the list). */ void for_each_list(list_t *list, listIterator iterator); /** @brief Returns the head of the list (optionally removing it at the same time). */ void *head_list(list_t *list, bool removeFromList); /** @brief Returns the tail of the list. */ void *tail_list(list_t *list); /** @brief Returns list head node. */ list_node_t *first_list(list_t *list); /** @brief Returns true if end of list false otherwise. */ bool done_list(list_node_t *lnode); /** @brief Returns next node in the list. */ list_node_t *next_list(list_node_t *lnode); #if defined(__cplusplus) } #endif #endif /* LIST_H */