#include #include struct entry { void *value; struct entry *next, *prev; }; struct _skipstone_queue { size_t count; struct entry *first, *last; }; skipstone_queue *skipstone_queue_new() { skipstone_queue *queue; if ((queue = malloc(sizeof(*queue))) == NULL) { goto error_malloc_queue; } queue->count = 0; queue->first = NULL; queue->last = NULL; return queue; error_malloc_queue: return NULL; } void skipstone_queue_destroy(skipstone_queue *queue) { while (queue->first) { struct entry *entry = queue->first; queue->first = entry->next; free(entry); } free(queue); } size_t skipstone_queue_count(skipstone_queue *queue) { return queue->count; } int skipstone_queue_add(skipstone_queue *queue, void *value) { struct entry *next; if ((next = malloc(sizeof(*next))) == NULL) { goto error_malloc_next; } next->value = value; next->next = NULL; next->prev = queue->last; if (queue->first == NULL) { queue->first = next; } if (queue->last) { next->prev = queue->last; queue->last->next = next; } queue->last = next; queue->count++; return 0; error_malloc_next: return -1; } int skipstone_queue_remove(skipstone_queue *queue, void **value) { struct entry *first = queue->first; if (queue->count == 0) { return 0; } *value = first->value; queue->first = first->next; queue->count--; if (queue->count == 0) { queue->last = NULL; } free(first); return 1; }