diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-04-07 20:29:35 -0600 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-04-07 20:29:35 -0600 |
commit | d053a0f6dffc575611324b81acaef0d1554bda6c (patch) | |
tree | 3eb702a06625ef1f6be0648f7fec311b628808e9 /libcr_ipc/_linkedlist.h | |
parent | 33b7cf675238367db2fc0528dea103d7792eaa0e (diff) | |
parent | 062e063f76c5937be4dc8465f6471ff9b5eb7be9 (diff) |
Merge branch 'lukeshu/ipc'
Diffstat (limited to 'libcr_ipc/_linkedlist.h')
-rw-r--r-- | libcr_ipc/_linkedlist.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/libcr_ipc/_linkedlist.h b/libcr_ipc/_linkedlist.h new file mode 100644 index 0000000..ab6d89e --- /dev/null +++ b/libcr_ipc/_linkedlist.h @@ -0,0 +1,51 @@ +/* libcr_ipc/_linkedlist.h - Common low-level linked lists for use in libcr_ipc + * + * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com> + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#ifndef _LIBCR_IPC__LINKEDLIST_H_ +#define _LIBCR_IPC__LINKEDLIST_H_ + +#include <libmisc/assert.h> + +#include <libcr_ipc/_linkedlist_pub.h> + +/* singly linked list *********************************************************/ + +typedef struct _cr_ipc_sll_node { + struct _cr_ipc_sll_node *rear; +} cr_ipc_sll_node; + +#define cr_ipc_sll_node_cast(node_typ, node_ptr) \ + ({ \ + static_assert(_Generic(node_ptr, cr_ipc_sll_node *: 1, default: 0), \ + "typeof("#node_ptr") != cr_ipc_sll_node *"); \ + assert(node_ptr); \ + static_assert(offsetof(node_typ, cr_ipc_sll_node) == 0); \ + ((node_typ*)(node_ptr)); \ + }) + +void cr_ipc_sll_push_to_rear(_cr_ipc_sll_root *root, cr_ipc_sll_node *node); +void cr_ipc_sll_pop_from_front(_cr_ipc_sll_root *root); + +/* doubly linked list *********************************************************/ + +typedef struct _cr_ipc_dll_node { + struct _cr_ipc_dll_node *front, *rear; +} cr_ipc_dll_node; + +#define cr_ipc_dll_node_cast(node_typ, node_ptr) \ + ({ \ + static_assert(_Generic(node_ptr, cr_ipc_dll_node *: 1, default: 0), \ + "typeof("#node_ptr") != cr_ipc_dll_node *"); \ + assert(node_ptr); \ + static_assert(offsetof(node_typ, cr_ipc_dll_node) == 0); \ + ((node_typ*)(node_ptr)); \ + }) + +void cr_ipc_dll_push_to_rear(_cr_ipc_dll_root *root, cr_ipc_dll_node *node); +void cr_ipc_dll_remove(_cr_ipc_dll_root *root, cr_ipc_dll_node *node); +void cr_ipc_dll_pop_from_front(_cr_ipc_dll_root *root); + +#endif /* _LIBCR_IPC__LINKEDLIST_H_ */ |