Commit Diff


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 <stdio.h>
+#include <stdlib.h>
+#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();
+}