libcute 0.1
Loading...
Searching...
No Matches
list.h
Go to the documentation of this file.
1#pragma once
2
5#include "macro.h"
6#include "memory/allocator.h"
7#include "object/optional.h"
8#include "object/result.h"
9#include "object/destructor.h"
10#include "utility.h"
11#include <nostd.h>
12#include <stddef.h>
13
17typedef struct cu_List_Node {
19 unsigned char data[];
21
25typedef struct {
27 size_t length;
30 cu_Destructor_Optional destructor;
31} cu_List;
32
43
46
47
55cu_List_Result cu_List_create(
56 cu_Allocator allocator, cu_Layout layout,
57 cu_Destructor_Optional destructor);
58
62void cu_List_destroy(cu_List *list);
63
64static inline size_t cu_List_size(const cu_List *list) {
65 CU_IF_NULL(list) { return 0; }
66 return list->length;
67}
68
69static inline bool cu_List_is_empty(const cu_List *list) {
70 CU_IF_NULL(list) { return true; }
71 return list->length == 0;
72}
73
75cu_List_Error_Optional cu_List_push_front(cu_List *list, void *elem);
77cu_List_Error_Optional cu_List_pop_front(cu_List *list, void *out_elem);
79cu_List_Error_Optional cu_List_insert_after(
80 cu_List *list, cu_List_Node *node, void *elem);
82cu_List_Error_Optional cu_List_insert_before(
83 cu_List *list, struct cu_List_Node *node, void *elem);
84
94bool cu_List_iter(const cu_List *list, cu_List_Node **node, void **out_elem);
cu_List_Error_Optional cu_List_push_front(cu_List *list, void *elem)
Definition list.c:43
bool cu_List_iter(const cu_List *list, cu_List_Node **node, void **out_elem)
Iterate over the list.
Definition list.c:148
cu_List_Error_Optional cu_List_pop_front(cu_List *list, void *out_elem)
Definition list.c:65
void cu_List_destroy(cu_List *list)
Destroy a list and free all nodes.
Definition list.c:23
cu_List_Error_Optional cu_List_insert_after(cu_List *list, cu_List_Node *node, void *elem)
Definition list.c:90
cu_List_Error
Error codes returned by list operations.
Definition list.h:36
@ CU_LIST_ERROR_INVALID
Definition list.h:40
@ CU_LIST_ERROR_NONE
Definition list.h:37
@ CU_LIST_ERROR_OOM
Definition list.h:38
@ CU_LIST_ERROR_EMPTY
Definition list.h:41
@ CU_LIST_ERROR_INVALID_LAYOUT
Definition list.h:39
cu_List_Result cu_List_create(cu_Allocator allocator, cu_Layout layout, cu_Destructor_Optional destructor)
Create an empty list.
Definition list.c:8
cu_List_Error_Optional cu_List_insert_before(cu_List *list, struct cu_List_Node *node, void *elem)
Definition list.c:122
#define CU_IF_NULL(expr)
Definition macro.h:6
#define CU_OPTIONAL_DECL(NAME, T)
Definition optional.h:25
#define CU_RESULT_DECL(NAME, T, E)
Definition result.h:23
Definition allocator.h:24
Definition utility.h:22
Node within a singly linked list.
Definition list.h:17
struct cu_List_Node * next
Definition list.h:18
unsigned char data[]
Definition list.h:19
Singly linked list container.
Definition list.h:25
size_t length
Definition list.h:27
cu_List_Node * head
Definition list.h:26
cu_Allocator allocator
Definition list.h:29
cu_Destructor_Optional destructor
Definition list.h:30
cu_Layout layout
Definition list.h:28