Derive-C
Loading...
Searching...
No Matches
queue.c
Go to the documentation of this file.
1
4
6#include <derive-c/prelude.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10
11#define ITEM int
12#define NAME int_queue
14
15static void example_queue(DC_LOGGER* parent) {
16 DC_SCOPED(DC_LOGGER) log = DC_LOGGER_NEW(parent, "%s", __func__);
17 DC_SCOPED(int_queue) queue = int_queue_new(stdalloc_get_ref());
18
19 DC_LOG(log, DC_INFO, "pushing 1-5 to queue");
20 for (int i = 1; i <= 5; i++) {
21 int_queue_push_back(&queue, i);
22 }
23
24 DC_LOG(log, DC_INFO, "queue: %s", DC_DEBUG(int_queue_debug, &queue));
25
26 while (int_queue_size(&queue) > 0) {
27 int value = int_queue_pop_front(&queue);
28 DC_LOG(log, DC_INFO, "popped: %d", value);
29 }
30
31 DC_LOG(log, DC_INFO, "queue after pops: %s", DC_DEBUG(int_queue_debug, &queue));
32}
33
34#define ITEM int
35#define NAME int_deque
37
38static void example_deque(DC_LOGGER* parent) {
39 DC_SCOPED(DC_LOGGER) log = DC_LOGGER_NEW(parent, "%s", __func__);
40 DC_SCOPED(int_deque) deque = int_deque_new(stdalloc_get_ref());
41
42 DC_LOG(log, DC_INFO, "push_back 10, push_back 20, pop_front");
43 int_deque_push_back(&deque, 10);
44 int_deque_push_back(&deque, 20);
45 int_deque_pop_front(&deque);
46}
47
48struct message {
49 char* data;
50 int length;
51};
52
53static void message_delete(struct message* self) { free(self->data); }
54
55static struct message message_clone(struct message const* self) {
56 char* cloned_data = (char*)malloc((size_t)self->length);
57 memcpy(cloned_data, self->data, (size_t)self->length);
58 return (struct message){.data = cloned_data, .length = self->length};
59}
60
61static void message_debug(struct message const* self, dc_debug_fmt fmt, FILE* stream) {
62 (void)fmt;
63 fprintf(stream, "message@%p { data: \"%.*s\", length: %d }", (void*)self, self->length,
64 self->data, self->length);
65}
66
67#define ITEM struct message
68#define ITEM_DELETE message_delete
69#define ITEM_CLONE message_clone
70#define ITEM_DEBUG message_debug
71#define NAME message_queue
73
74static void example_custom(DC_LOGGER* parent) {
75 DC_SCOPED(DC_LOGGER) log = DC_LOGGER_NEW(parent, "%s", __func__);
76 DC_SCOPED(message_queue) queue = message_queue_new(stdalloc_get_ref());
77
78 DC_LOG(log, DC_INFO, "pushing two messages");
79 char* data1 = (char*)malloc(5);
80 memcpy(data1, "hello", 5); // NOLINT(bugprone-not-null-terminated-result)
81 struct message msg1 = {.data = data1, .length = 5};
82 message_queue_push_back(&queue, msg1);
83
84 char* data2 = (char*)malloc(5);
85 memcpy(data2, "world", 5); // NOLINT(bugprone-not-null-terminated-result)
86 struct message msg2 = {.data = data2, .length = 5};
87 message_queue_push_back(&queue, msg2);
88
89 DC_LOG(log, DC_INFO, "queue: %s", DC_DEBUG(message_queue_debug, &queue));
90}
91
92int main() {
94 root = NS(DC_LOGGER,
95 new_global)((NS(DC_LOGGER, global_config)){.stream = stdout, .ansi_colours = true},
96 (dc_log_id){"queue"});
97
98 example_queue(&root);
99 example_deque(&root);
100 example_custom(&root);
101 return 0;
102}
#define DC_DEBUG(DEBUG_FN, DEBUG_PTR)
Definition dump.h:92
#define DC_LOGGER
Definition file.h:168
#define NS(pre, post)
Definition namespace.h:14
static void example_custom(DC_LOGGER *parent)
Definition queue.c:74
static void message_debug(struct message const *self, dc_debug_fmt fmt, FILE *stream)
Definition queue.c:61
static void example_queue(DC_LOGGER *parent)
Definition queue.c:15
static struct message message_clone(struct message const *self)
Definition queue.c:55
static void message_delete(struct message *self)
Definition queue.c:53
int main()
Definition queue.c:92
static void example_deque(DC_LOGGER *parent)
Definition queue.c:38
#define DC_SCOPED(type,...)
RAII in C. Call the destructor when the variable goes out of scope.
Definition scope.h:5
Debug format helpers for debug printin data structures.
Definition fmt.h:11
char * data
Definition queue.c:49
int length
Definition queue.c:50
#define DC_LOGGER_NEW(...)
Definition prelude.h:21
#define DC_LOG(...)
Definition prelude.h:20
@ DC_INFO
Definition trait.h:8
static DC_PUBLIC FILE * stream(SELF *self)
Definition template.h:108