src/cx/linked_list.h

changeset 453
bb144d08cd44
parent 438
cd3069757010
child 456
227c2eabbef8
equal deleted inserted replaced
452:a10c3e127050 453:bb144d08cd44
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE. 26 * POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 /**
29 * \file linked_list.h
30 * \brief Linked list implementation.
31 * \details Also provides several low-level functions for custom linked list implementations.
32 * \author Mike Becker
33 * \author Olaf Wintermann
34 * \version 3.0
35 * \copyright 2-Clause BSD License
36 */
28 37
29 #ifndef UCX_LINKED_LIST_H 38 #ifndef UCX_LINKED_LIST_H
30 #define UCX_LINKED_LIST_H 39 #define UCX_LINKED_LIST_H
31 40
32 #include <stddef.h> 41 #include <stddef.h>
33 #include "list.h" 42 #include "list.h"
34 43
35 #ifdef __cplusplus 44 #ifdef __cplusplus
36 extern "C" { 45 extern "C" {
37 #endif 46 #endif
47
48 CxList cxLinkedListCreate(CxAllocator allocator, CxListComparator comparator, size_t item_size);
49
50 void cxLinkedListDestroy(CxList list);
51
52 size_t cxLinkedListRecalculateSize(CxList list);
53
38 54
39 /** 55 /**
40 * Finds the node at a certain index. 56 * Finds the node at a certain index.
41 * 57 *
42 * This function can be used to start at an arbitrary position within the list. 58 * This function can be used to start at an arbitrary position within the list.
53 * @param index the search index 69 * @param index the search index
54 * @return the node found at the specified index 70 * @return the node found at the specified index
55 */ 71 */
56 void *cx_linked_list_at(void *start, size_t start_index, ptrdiff_t loc_advance, size_t index); 72 void *cx_linked_list_at(void *start, size_t start_index, ptrdiff_t loc_advance, size_t index);
57 73
74 /**
75 * Finds the last node in a linked list.
76 *
77 * If a pointer to \p end is provided, the result is just \c *end.
78 * Otherwise, this function starts with the pointer denoted by \c *begin and
79 * traverses the list along a next pointer whose location within the node struct is
80 * denoted by \p loc_next.
81 *
82 * If both \p begin and \p end are \c NULL, an empty list is assumed and this function returns \c NULL.
83 *
84 * @param begin a pointer to the begin node pointer (optional)
85 * @param end a pointer to the end node pointer (optional)
86 * @param loc_next the location of the \c next pointer (only required when \p end is \c NULL)
87 * @return a pointer to the last node or \c NULL if the list is empty
88 */
58 void *cx_linked_list_last(void **begin, void **end, ptrdiff_t loc_next); 89 void *cx_linked_list_last(void **begin, void **end, ptrdiff_t loc_next);
59 90
60 int cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node); 91 /**
61 92 * Adds a new node to a linked list.
62 extern cx_list_class cx_linked_list_class; 93 *
63 94 * \remark One of the pointers \p begin and \p end may be \c NULL, but not both.
64 CxList cxLinkedListCreate(CxAllocator allocator, CxListComparator comparator, size_t item_size); 95 *
65 96 * @param begin a pointer to the begin node pointer (if your list has one)
66 void cxLinkedListDestroy(CxList list); 97 * @param end a pointer to the end node pointer (if your list has one)
67 98 * @param loc_prev the location of a \c prev pointer within your node struct (negative if your struct does not have one)
68 size_t cxLinkedListRecalculateSize(CxList list); 99 * @param loc_next the location of a \c next pointer within your node struct (negative if your struct does not have one)
100 * @param new_node a pointer to the node that shall be appended
101 */
102 void cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *new_node);
69 103
70 #ifdef __cplusplus 104 #ifdef __cplusplus
71 } /* extern "C" */ 105 } /* extern "C" */
72 #endif 106 #endif
73 107

mercurial