libcute 0.1
Loading...
Searching...
No Matches
dlist.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
15struct cu_DList_Node {
16 struct cu_DList_Node *prev;
17 struct cu_DList_Node *next;
18 unsigned char data[];
19};
22typedef struct {
23 struct cu_DList_Node *head;
24 struct cu_DList_Node *tail;
25 size_t length;
26 cu_Layout layout;
27 cu_Allocator allocator;
28 cu_Destructor_Optional destructor;
29} cu_DList;
30
31typedef enum {
32 CU_DLIST_ERROR_NONE = 0,
33 CU_DLIST_ERROR_OOM,
34 CU_DLIST_ERROR_INVALID_LAYOUT,
35 CU_DLIST_ERROR_INVALID,
36 CU_DLIST_ERROR_EMPTY,
37} cu_DList_Error;
38
39CU_RESULT_DECL(cu_DList, cu_DList, cu_DList_Error)
40CU_OPTIONAL_DECL(cu_DList_Error, cu_DList_Error)
41
42cu_DList_Result cu_DList_create(
43 cu_Allocator allocator, cu_Layout layout, cu_Destructor_Optional destructor);
44void cu_DList_destroy(cu_DList *list);
45
46static inline size_t cu_DList_size(const cu_DList *list) {
47 CU_IF_NULL(list) { return 0; }
48 return list->length;
49}
50
51static inline bool cu_DList_is_empty(const cu_DList *list) {
52 CU_IF_NULL(list) { return true; }
53 return list->length == 0;
54}
55
56cu_DList_Error_Optional cu_DList_push_front(cu_DList *list, void *elem);
57cu_DList_Error_Optional cu_DList_push_back(cu_DList *list, void *elem);
58cu_DList_Error_Optional cu_DList_pop_front(cu_DList *list, void *out_elem);
59cu_DList_Error_Optional cu_DList_pop_back(cu_DList *list, void *out_elem);
60cu_DList_Error_Optional cu_DList_insert_after(
61 cu_DList *list, struct cu_DList_Node *pos, void *elem);
62cu_DList_Error_Optional cu_DList_insert_before(
63 cu_DList *list, struct cu_DList_Node *pos, void *elem);
64
65bool cu_DList_iter(
66 const cu_DList *list, struct cu_DList_Node **node, void **out_elem);
#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 dlist.h:22
Definition utility.h:22