commit - ef56551877144c333eb315c393d159d2414ae0f3
commit + b7a1d3fcb52c4517db8f3bd9fe6c242078e4bd24
blob - c24d9315fdc198311dd387eec1a0fe4f21aae62c
blob + c26da16ce4292aed9068c75fc09281101633362a
--- CMakeLists.txt
+++ CMakeLists.txt
src/linkedlist.c
src/set.c
src/stack.c
+ src/queue.c
src/binarytree.c
src/input.c
src/math.c
linkedlist
set
stack
+ queue
binarytree
math
vector
blob - /dev/null
blob + 2cda586c07b5cccd7e27814fc6002bef118f21f3 (mode 644)
--- /dev/null
+++ include/lfqueue.h
+#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
+#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
+#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();
+}