Contiki-NG
circular-list.h
1 /*
2  * Copyright (c) 2017, George Oikonomou - http://www.spd.gr
3  * Copyright (c) 2017, James Pope
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the copyright holder nor the names of its
16  * contributors may be used to endorse or promote products derived
17  * from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
30  * OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 /*---------------------------------------------------------------------------*/
33 /** \addtogroup data
34  * @{
35  *
36  * \defgroup circular-singly-linked-list Circular, singly-linked list
37  *
38  * This library provides functions for the creation and manipulation of
39  * circular, singly-linked lists.
40  *
41  * A circular, singly-linked list is declared using the CIRCULAR_LIST macro.
42  * Elements must be allocated by the calling code and must be of a C struct
43  * datatype. In this struct, the first field must be a pointer called \e next.
44  * This field will be used by the library to maintain the list. Application
45  * code must not modify this field directly.
46  *
47  * Functions that modify the list (add / remove) will, in the general case,
48  * update the list's head and item order. If you call one of these functions
49  * as part of a list traversal, it is advised to stop / restart traversing
50  * after the respective function returns.
51  * @{
52  */
53 /*---------------------------------------------------------------------------*/
54 #ifndef CIRCULAR_LIST_H_
55 #define CIRCULAR_LIST_H_
56 /*---------------------------------------------------------------------------*/
57 #include "contiki.h"
58 
59 #include <stdint.h>
60 #include <stdbool.h>
61 #include <string.h>
62 /*---------------------------------------------------------------------------*/
63 /**
64  * \brief Define a circular, singly-linked list.
65  *
66  * This macro defines a circular, singly-linked list.
67  *
68  * The datatype for elements must be a C struct. The struct's first member must
69  * be a pointer called \e next. This is used internally by the library to
70  * maintain data structure integrity and must not be modified directly by
71  * application code.
72  *
73  * \param name The name of the circular, singly-linked list.
74  */
75 #define CIRCULAR_LIST(name) \
76  static void *name##_circular_list = NULL; \
77  static circular_list_t name = (circular_list_t)&name##_circular_list
78 /*---------------------------------------------------------------------------*/
79 /**
80  * \brief The circular, singly-linked list datatype
81  */
82 typedef void **circular_list_t;
83 /*---------------------------------------------------------------------------*/
84 /**
85  * \brief Initialise a circular, singly-linked list.
86  * \param cl The circular, singly-linked list.
87  */
89 
90 /**
91  * \brief Return the tail of a circular, singly-linked list.
92  * \param cl The circular, singly-linked list.
93  * \return A pointer to the list's head, or NULL if the list is empty
94  */
96 
97 /**
98  * \brief Return the tail of a circular, singly-linked list.
99  * \param cl The circular, singly-linked list.
100  * \return A pointer to the list's tail, or NULL if the list is empty
101  */
103 
104 /**
105  * \brief Add an element to a circular, singly-linked list.
106  * \param cl The circular, singly-linked list.
107  * \param element A pointer to the element to be added.
108  *
109  * The caller should make no assumptions as to the position in the list of the
110  * new element.
111  *
112  * After this function returns, the list's head is not guaranteed to be the
113  * same as it was before the addition.
114  *
115  * Calling this function will update the list's head and item order. If you
116  * call this function as part of a list traversal, it is advised to stop
117  * traversing after this function returns.
118  */
119 void circular_list_add(circular_list_t cl, void *element);
120 
121 /**
122  * \brief Remove an element from a circular, singly-linked list.
123  * \param cl The circular, singly-linked list.
124  * \param element A pointer to the element to be removed.
125  *
126  * After this function returns, the list's head is not guaranteed to be the
127  * same as it was before the addition.
128  *
129  * Calling this function will update the list's head and item order. If you
130  * call this function as part of a list traversal, it is advised to stop
131  * traversing after this function returns.
132  */
133 void circular_list_remove(circular_list_t cl, void *element);
134 
135 /**
136  * \brief Get the length of a circular, singly-linked list.
137  * \param cl The circular, singly-linked list.
138  * \return The number of elements in the list
139  */
140 unsigned long circular_list_length(circular_list_t cl);
141 
142 /**
143  * \brief Determine whether a circular, singly-linked list is empty.
144  * \param cl The circular, singly-linked list.
145  * \retval true The list is empty
146  * \retval false The list is not empty
147  */
149 /*---------------------------------------------------------------------------*/
150 #endif /* CIRCULAR_LIST_H_ */
151 /*---------------------------------------------------------------------------*/
152 /**
153  * @}
154  * @}
155  */
void circular_list_init(circular_list_t cl)
Initialise a circular, singly-linked list.
Definition: circular-list.c:53
unsigned long circular_list_length(circular_list_t cl)
Get the length of a circular, singly-linked list.
void * circular_list_head(circular_list_t cl)
Return the tail of a circular, singly-linked list.
Definition: circular-list.c:59
void circular_list_add(circular_list_t cl, void *element)
Add an element to a circular, singly-linked list.
void * circular_list_tail(circular_list_t cl)
Return the tail of a circular, singly-linked list.
Definition: circular-list.c:65
bool circular_list_is_empty(circular_list_t cl)
Determine whether a circular, singly-linked list is empty.
void ** circular_list_t
The circular, singly-linked list datatype.
Definition: circular-list.h:82
void circular_list_remove(circular_list_t cl, void *element)
Remove an element from a circular, singly-linked list.
Definition: circular-list.c:79