#include <stdlib.h>
#ifndef QUEUE_H
#define QUEUE_H
struct queue_entry
{
void *elem;
struct queue_entry *next,*prev;
};
//a queue of queue_entries
struct generic_queue
{
size_t size;
struct queue_entry *head,*tail;
};
void queue_init(struct generic_queue *queue);
void queue_push_front(struct generic_queue *queue,void *elem);
void queue_push_back(struct generic_queue *queue,void *elem);
//ownership transfers
void* queue_pop_front(struct generic_queue *queue);
//ownership transfers
void* queue_pop_back(struct generic_queue *queue);
void* queue_remove(struct generic_queue *queue, struct queue_entry *entry);
//for complex objects
int queue_find(struct generic_queue *queue, void *elem,
int (*cmpfunc)(void *elem1,void *elem2));
void queue_clear(struct generic_queue *queue);
//pretty much queue clear
void queue_destroy(struct generic_queue *queue);
//copy one queue to another
void queue_cpy(struct generic_queue *dst,struct generic_queue *src);
void queue_push_back_entry(struct generic_queue *queue, struct queue_entry *entry);
//get a specific element
void* queue_get_idx(struct generic_queue *queue, size_t idx);
//convenience comparators
int str_cmp(void *str_a,void *str_b);
#endif