2017-11-23 17:22:36 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <skipstone/queue.h>
|
|
|
|
|
|
|
|
struct entry {
|
|
|
|
void *value;
|
|
|
|
struct entry *next, *prev;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct _skipstone_queue {
|
|
|
|
size_t count;
|
2017-11-24 12:18:02 -06:00
|
|
|
struct entry *first, *last;
|
2017-11-23 17:22:36 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
skipstone_queue *skipstone_queue_new() {
|
|
|
|
skipstone_queue *queue;
|
|
|
|
|
|
|
|
if ((queue = malloc(sizeof(*queue))) == NULL) {
|
|
|
|
goto error_malloc_queue;
|
|
|
|
}
|
|
|
|
|
|
|
|
queue->count = 0;
|
2017-11-24 12:18:02 -06:00
|
|
|
queue->first = NULL;
|
2017-11-23 17:22:36 +00:00
|
|
|
queue->last = NULL;
|
|
|
|
|
|
|
|
return queue;
|
|
|
|
|
|
|
|
error_malloc_queue:
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2017-11-23 18:57:33 +00:00
|
|
|
void skipstone_queue_destroy(skipstone_queue *queue) {
|
2017-11-24 12:19:24 -06:00
|
|
|
while (queue->first) {
|
|
|
|
struct entry *entry = queue->first;
|
2017-11-23 18:57:33 +00:00
|
|
|
|
2017-11-24 12:19:24 -06:00
|
|
|
queue->first = entry->next;
|
2017-11-23 18:57:33 +00:00
|
|
|
|
|
|
|
free(entry);
|
|
|
|
}
|
|
|
|
|
|
|
|
free(queue);
|
|
|
|
}
|
|
|
|
|
2017-11-23 17:22:36 +00:00
|
|
|
size_t skipstone_queue_count(skipstone_queue *queue) {
|
|
|
|
return queue->count;
|
|
|
|
}
|
|
|
|
|
2017-11-24 12:18:02 -06:00
|
|
|
int skipstone_queue_add(skipstone_queue *queue, void *value) {
|
2017-11-23 17:22:36 +00:00
|
|
|
struct entry *next;
|
|
|
|
|
2017-11-23 18:24:16 +00:00
|
|
|
if ((next = malloc(sizeof(*next))) == NULL) {
|
2017-11-23 17:22:36 +00:00
|
|
|
goto error_malloc_next;
|
|
|
|
}
|
|
|
|
|
|
|
|
next->value = value;
|
|
|
|
next->next = NULL;
|
2017-11-23 18:57:33 +00:00
|
|
|
next->prev = queue->last;
|
|
|
|
|
2017-11-24 12:18:02 -06:00
|
|
|
if (queue->first == NULL) {
|
|
|
|
queue->first = next;
|
|
|
|
}
|
|
|
|
|
2017-11-23 18:57:33 +00:00
|
|
|
if (queue->last) {
|
|
|
|
next->prev = queue->last;
|
|
|
|
queue->last->next = next;
|
|
|
|
}
|
2017-11-23 17:22:36 +00:00
|
|
|
|
2017-11-23 18:57:33 +00:00
|
|
|
queue->last = next;
|
2017-11-24 02:27:57 +00:00
|
|
|
queue->count++;
|
2017-11-23 17:22:36 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
error_malloc_next:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2017-11-24 12:18:02 -06:00
|
|
|
int skipstone_queue_remove(skipstone_queue *queue, void **value) {
|
|
|
|
struct entry *first = queue->first;
|
2017-11-23 17:22:36 +00:00
|
|
|
|
2017-11-24 02:27:57 +00:00
|
|
|
if (queue->count == 0) {
|
2017-11-23 17:22:36 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-11-24 12:18:02 -06:00
|
|
|
*value = first->value;
|
|
|
|
queue->first = first->next;
|
2017-11-24 02:27:57 +00:00
|
|
|
queue->count--;
|
2017-11-23 17:22:36 +00:00
|
|
|
|
2017-11-24 12:18:02 -06:00
|
|
|
free(first);
|
2017-11-23 17:22:36 +00:00
|
|
|
|
2017-11-23 18:02:38 +00:00
|
|
|
return 1;
|
2017-11-23 17:22:36 +00:00
|
|
|
}
|