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 |