C Fundamentals
Algorithms · data structures · cryptography · systems — pure C11, zero deps
Loading...
Searching...
No Matches
queue.c
Go to the documentation of this file.
1/**
2 * @file queue.c
3 *
4 * Circular buffer with head + size. We use head + size (not head + tail)
5 * so an empty queue and a full queue are distinguishable without
6 * sacrificing one slot.
7 */
8
9#include "queue.h"
10#include <stdlib.h>
11#include <string.h>
12
13#define QUEUE_INITIAL_CAP 16
14
15struct queue {
16 int *data;
17 size_t head;
18 size_t size;
19 size_t capacity;
20};
21
23 queue_t *q = malloc(sizeof(*q));
24 if (!q) return NULL;
25 q->data = malloc(QUEUE_INITIAL_CAP * sizeof(int));
26 if (!q->data) { free(q); return NULL; }
27 q->head = 0;
28 q->size = 0;
30 return q;
31}
32
34 if (!q) return;
35 free(q->data);
36 free(q);
37}
38
39static bool queue_grow(queue_t *q) {
40 size_t new_cap = q->capacity * 2;
41 int *grown = malloc(new_cap * sizeof(int));
42 if (!grown) return false;
43 /* Linearise: copy head..end then 0..head into the new buffer. */
44 for (size_t i = 0; i < q->size; i++) {
45 grown[i] = q->data[(q->head + i) % q->capacity];
46 }
47 free(q->data);
48 q->data = grown;
49 q->head = 0;
50 q->capacity = new_cap;
51 return true;
52}
53
54bool queue_enqueue(queue_t *q, int value) {
55 if (!q) return false;
56 if (q->size == q->capacity && !queue_grow(q)) return false;
57 size_t tail = (q->head + q->size) % q->capacity;
58 q->data[tail] = value;
59 q->size++;
60 return true;
61}
62
63bool queue_dequeue(queue_t *q, int *out_value) {
64 if (!q || q->size == 0) return false;
65 if (out_value) *out_value = q->data[q->head];
66 q->head = (q->head + 1) % q->capacity;
67 q->size--;
68 return true;
69}
70
71bool queue_peek(const queue_t *q, int *out_value) {
72 if (!q || q->size == 0) return false;
73 if (out_value) *out_value = q->data[q->head];
74 return true;
75}
76
77size_t queue_size(const queue_t *q) { return q ? q->size : 0; }
78bool queue_is_empty(const queue_t *q) { return !q || q->size == 0; }
void queue_destroy(queue_t *q)
Definition queue.c:33
static bool queue_grow(queue_t *q)
Definition queue.c:39
size_t queue_size(const queue_t *q)
Definition queue.c:77
bool queue_enqueue(queue_t *q, int value)
Definition queue.c:54
queue_t * queue_create(void)
Definition queue.c:22
bool queue_peek(const queue_t *q, int *out_value)
Definition queue.c:71
bool queue_is_empty(const queue_t *q)
Definition queue.c:78
bool queue_dequeue(queue_t *q, int *out_value)
Definition queue.c:63
#define QUEUE_INITIAL_CAP
Definition queue.c:13
FIFO queue of int, backed by a circular buffer.
Definition queue.c:15
size_t capacity
Definition queue.c:19
size_t head
Definition queue.c:17
size_t size
Definition queue.c:18
int * data
Definition queue.c:16