Zephyr API Documentation  3.5.0
A Scalable Open Source RTOS
3.5.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sflist.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
25#ifndef ZEPHYR_INCLUDE_SYS_SFLIST_H_
26#define ZEPHYR_INCLUDE_SYS_SFLIST_H_
27
28#include <stddef.h>
29#include <stdbool.h>
30#include <zephyr/sys/__assert.h>
31#include "list_gen.h"
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37#ifdef __LP64__
38typedef uint64_t unative_t;
39#else
41#endif
42
44struct _sfnode {
45 unative_t next_and_flags;
46};
50typedef struct _sfnode sys_sfnode_t;
51
53struct _sflist {
54 sys_sfnode_t *head;
55 sys_sfnode_t *tail;
56};
60typedef struct _sflist sys_sflist_t;
61
77#define SYS_SFLIST_FOR_EACH_NODE(__sl, __sn) \
78 Z_GENLIST_FOR_EACH_NODE(sflist, __sl, __sn)
79
100#define SYS_SFLIST_ITERATE_FROM_NODE(__sl, __sn) \
101 Z_GENLIST_ITERATE_FROM_NODE(sflist, __sl, __sn)
102
119#define SYS_SFLIST_FOR_EACH_NODE_SAFE(__sl, __sn, __sns) \
120 Z_GENLIST_FOR_EACH_NODE_SAFE(sflist, __sl, __sn, __sns)
121
130#define SYS_SFLIST_CONTAINER(__ln, __cn, __n) \
131 Z_GENLIST_CONTAINER(__ln, __cn, __n)
132
140#define SYS_SFLIST_PEEK_HEAD_CONTAINER(__sl, __cn, __n) \
141 Z_GENLIST_PEEK_HEAD_CONTAINER(sflist, __sl, __cn, __n)
142
150#define SYS_SFLIST_PEEK_TAIL_CONTAINER(__sl, __cn, __n) \
151 Z_GENLIST_PEEK_TAIL_CONTAINER(sflist, __sl, __cn, __n)
152
159#define SYS_SFLIST_PEEK_NEXT_CONTAINER(__cn, __n) \
160 Z_GENLIST_PEEK_NEXT_CONTAINER(sflist, __cn, __n)
161
176#define SYS_SFLIST_FOR_EACH_CONTAINER(__sl, __cn, __n) \
177 Z_GENLIST_FOR_EACH_CONTAINER(sflist, __sl, __cn, __n)
178
194#define SYS_SFLIST_FOR_EACH_CONTAINER_SAFE(__sl, __cn, __cns, __n) \
195 Z_GENLIST_FOR_EACH_CONTAINER_SAFE(sflist, __sl, __cn, __cns, __n)
196
197
198/*
199 * Required function definitions for the list_gen.h interface
200 *
201 * These are the only functions that do not treat the list/node pointers
202 * as completely opaque types.
203 */
204
210static inline void sys_sflist_init(sys_sflist_t *list)
211{
212 list->head = NULL;
213 list->tail = NULL;
214}
215
220#define SYS_SFLIST_STATIC_INIT(ptr_to_list) {NULL, NULL}
221#define SYS_SFLIST_FLAGS_MASK 0x3UL
222
223static inline sys_sfnode_t *z_sfnode_next_peek(sys_sfnode_t *node)
224{
225 return (sys_sfnode_t *)(node->next_and_flags & ~SYS_SFLIST_FLAGS_MASK);
226}
227
228static inline uint8_t sys_sfnode_flags_get(sys_sfnode_t *node);
229
230static inline void z_sfnode_next_set(sys_sfnode_t *parent,
231 sys_sfnode_t *child)
232{
233 uint8_t cur_flags = sys_sfnode_flags_get(parent);
234
235 parent->next_and_flags = cur_flags | (unative_t)child;
236}
237
238static inline void z_sflist_head_set(sys_sflist_t *list, sys_sfnode_t *node)
239{
240 list->head = node;
241}
242
243static inline void z_sflist_tail_set(sys_sflist_t *list, sys_sfnode_t *node)
244{
245 list->tail = node;
246}
247
256{
257 return list->head;
258}
259
268{
269 return list->tail;
270}
271
272/*
273 * APIs specific to sflist type
274 */
275
283{
284 return node->next_and_flags & SYS_SFLIST_FLAGS_MASK;
285}
286
300static inline void sys_sfnode_init(sys_sfnode_t *node, uint8_t flags)
301{
302 __ASSERT((flags & ~SYS_SFLIST_FLAGS_MASK) == 0UL, "flags too large");
303 node->next_and_flags = flags;
304}
305
317{
318 __ASSERT((flags & ~SYS_SFLIST_FLAGS_MASK) == 0UL, "flags too large");
319 node->next_and_flags = (unative_t)(z_sfnode_next_peek(node)) | flags;
320}
321
322/*
323 * Derived, generated APIs
324 */
325
333static inline bool sys_sflist_is_empty(sys_sflist_t *list);
334
335Z_GENLIST_IS_EMPTY(sflist)
336
337
347
348Z_GENLIST_PEEK_NEXT_NO_CHECK(sflist, sfnode)
349
350
358
359Z_GENLIST_PEEK_NEXT(sflist, sfnode)
360
361
369static inline void sys_sflist_prepend(sys_sflist_t *list,
370 sys_sfnode_t *node);
371
372Z_GENLIST_PREPEND(sflist, sfnode)
373
374
382static inline void sys_sflist_append(sys_sflist_t *list,
383 sys_sfnode_t *node);
384
385Z_GENLIST_APPEND(sflist, sfnode)
386
387
400static inline void sys_sflist_append_list(sys_sflist_t *list,
401 void *head, void *tail);
402
403Z_GENLIST_APPEND_LIST(sflist, sfnode)
404
405
414static inline void sys_sflist_merge_sflist(sys_sflist_t *list,
415 sys_sflist_t *list_to_append);
416
417Z_GENLIST_MERGE_LIST(sflist, sfnode)
418
419
428static inline void sys_sflist_insert(sys_sflist_t *list,
429 sys_sfnode_t *prev,
430 sys_sfnode_t *node);
431
432Z_GENLIST_INSERT(sflist, sfnode)
433
434
445
446Z_GENLIST_GET_NOT_EMPTY(sflist, sfnode)
447
448
457static inline sys_sfnode_t *sys_sflist_get(sys_sflist_t *list);
458
459Z_GENLIST_GET(sflist, sfnode)
460
461
471static inline void sys_sflist_remove(sys_sflist_t *list,
472 sys_sfnode_t *prev_node,
473 sys_sfnode_t *node);
474
475Z_GENLIST_REMOVE(sflist, sfnode)
476
477
487static inline bool sys_sflist_find_and_remove(sys_sflist_t *list,
488 sys_sfnode_t *node);
489
490Z_GENLIST_FIND_AND_REMOVE(sflist, sfnode)
491
492
499static inline size_t sys_sflist_len(sys_sflist_t *list);
500
501Z_GENLIST_LEN(sflist, sfnode)
502
503
505#ifdef __cplusplus
506}
507#endif
508
509#endif /* ZEPHYR_INCLUDE_SYS_SFLIST_H_ */
struct _sfnode sys_sfnode_t
Flagged single-linked list node structure.
Definition: sflist.h:50
static sys_sfnode_t * sys_sflist_get_not_empty(sys_sflist_t *list)
Fetch and remove the first node of the given list.
Definition: sflist.h:446
static uint8_t sys_sfnode_flags_get(sys_sfnode_t *node)
Fetch flags value for a particular sfnode.
Definition: sflist.h:282
static sys_sfnode_t * sys_sflist_get(sys_sflist_t *list)
Fetch and remove the first node of the given list.
Definition: sflist.h:459
#define SYS_SFLIST_FLAGS_MASK
Definition: sflist.h:221
static sys_sfnode_t * sys_sflist_peek_next(sys_sfnode_t *node)
Peek the next node from current node.
Definition: sflist.h:359
uint32_t unative_t
Definition: sflist.h:40
static void sys_sflist_remove(sys_sflist_t *list, sys_sfnode_t *prev_node, sys_sfnode_t *node)
Remove a node.
Definition: sflist.h:475
static void sys_sflist_merge_sflist(sys_sflist_t *list, sys_sflist_t *list_to_append)
merge two sflists, appending the second one to the first
Definition: sflist.h:417
static sys_sfnode_t * sys_sflist_peek_head(sys_sflist_t *list)
Peek the first node from the list.
Definition: sflist.h:255
static void sys_sflist_append(sys_sflist_t *list, sys_sfnode_t *node)
Append a node to the given list.
Definition: sflist.h:385
static void sys_sflist_prepend(sys_sflist_t *list, sys_sfnode_t *node)
Prepend a node to the given list.
Definition: sflist.h:372
static void sys_sfnode_flags_set(sys_sfnode_t *node, uint8_t flags)
Set flags value for an sflist node.
Definition: sflist.h:316
static void sys_sflist_insert(sys_sflist_t *list, sys_sfnode_t *prev, sys_sfnode_t *node)
Insert a node to the given list.
Definition: sflist.h:432
static void sys_sflist_init(sys_sflist_t *list)
Initialize a list.
Definition: sflist.h:210
struct _sflist sys_sflist_t
Flagged single-linked list structure.
Definition: sflist.h:60
static size_t sys_sflist_len(sys_sflist_t *list)
Compute the size of the given list in O(n) time.
Definition: sflist.h:501
static sys_sfnode_t * sys_sflist_peek_next_no_check(sys_sfnode_t *node)
Peek the next node from current node, node is not NULL.
Definition: sflist.h:348
static void sys_sflist_append_list(sys_sflist_t *list, void *head, void *tail)
Append a list to the given list.
Definition: sflist.h:403
static sys_sfnode_t * sys_sflist_peek_tail(sys_sflist_t *list)
Peek the last node from the list.
Definition: sflist.h:267
static bool sys_sflist_is_empty(sys_sflist_t *list)
Test if the given list is empty.
Definition: sflist.h:335
static bool sys_sflist_find_and_remove(sys_sflist_t *list, sys_sfnode_t *node)
Find and remove a node from a list.
Definition: sflist.h:490
static void sys_sfnode_init(sys_sfnode_t *node, uint8_t flags)
Initialize an sflist node.
Definition: sflist.h:300
flags
Definition: parser.h:96
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT64_TYPE__ uint64_t
Definition: stdint.h:91
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88