commit b7a1d3fcb52c4517db8f3bd9fe6c242078e4bd24 from: Evan Burkey date: Sat Mar 14 06:13:56 2026 UTC add lfqueue module wrapping linked list as FIFO queue commit - ef56551877144c333eb315c393d159d2414ae0f3 commit + b7a1d3fcb52c4517db8f3bd9fe6c242078e4bd24 blob - c24d9315fdc198311dd387eec1a0fe4f21aae62c blob + c26da16ce4292aed9068c75fc09281101633362a --- CMakeLists.txt +++ CMakeLists.txt @@ -13,6 +13,7 @@ set(SOURCES src/linkedlist.c src/set.c src/stack.c + src/queue.c src/binarytree.c src/input.c src/math.c @@ -48,6 +49,7 @@ if(${CMAKE_PROJECT_NAME} STREQUAL flint) linkedlist set stack + queue binarytree math vector blob - /dev/null blob + 2cda586c07b5cccd7e27814fc6002bef118f21f3 (mode 644) --- /dev/null +++ include/lfqueue.h @@ -0,0 +1,18 @@ +#ifndef LIBFLINT_QUEUE_H +#define LIBFLINT_QUEUE_H + +#include "lflinkedlist.h" + +#define Queue List + +void queue_init(Queue *queue, void (*destroy)(void *data)); + +void queue_destroy(Queue *queue); + +int queue_enqueue(Queue *queue, void *data); + +int queue_dequeue(Queue *queue, void **data); + +void *queue_peek(Queue *queue); + +#endif blob - /dev/null blob + c591d62d376d9c307faf43a8ab13cdf29fe75098 (mode 644) --- /dev/null +++ src/queue.c @@ -0,0 +1,24 @@ +#include "lfqueue.h" + +void queue_init(Queue *queue, void (*destroy)(void *data)) { + ll_init(queue, destroy); +} + +void queue_destroy(Queue *queue) { + ll_destroy(queue); +} + +int queue_enqueue(Queue *queue, void *data) { + if (queue->size == 0) { + return ll_ins_next(queue, NULL, data); + } + return ll_ins_next(queue, queue->tail, data); +} + +int queue_dequeue(Queue *queue, void **data) { + return ll_remove(queue, queue->head, data); +} + +void *queue_peek(Queue *queue) { + return queue->head == NULL ? NULL : queue->head->data; +} blob - /dev/null blob + 89facce7f60029c4e811cf64a51698d0f9ac07fc (mode 644) --- /dev/null +++ tests/test_queue.c @@ -0,0 +1,42 @@ +#include +#include +#include "lftest.h" +#include "lfqueue.h" + +int main() { + Queue *q = malloc(sizeof(Queue)); + queue_init(q, NULL); + + int a = 1, b = 2, c = 3; + queue_enqueue(q, &a); + queue_enqueue(q, &b); + queue_enqueue(q, &c); + ASSERT_EQ(q->size, 3); + + /* peek returns front without removing */ + int *p = queue_peek(q); + ASSERT_EQ(*p, 1); + ASSERT_EQ(q->size, 3); + + /* FIFO order */ + queue_dequeue(q, (void **)&p); + ASSERT_EQ(*p, 1); + queue_dequeue(q, (void **)&p); + ASSERT_EQ(*p, 2); + queue_dequeue(q, (void **)&p); + ASSERT_EQ(*p, 3); + ASSERT_EQ(q->size, 0); + + /* peek on empty queue */ + p = queue_peek(q); + ASSERT_NULL(p); + + /* dequeue on empty queue */ + int ret = queue_dequeue(q, (void **)&p); + ASSERT_EQ(ret, -1); + + queue_destroy(q); + free(q); + + TEST_REPORT(); +}