/* ARISA - data queue wrapper */ /* Copyright (C) 2004 Carl Ritson */ #define _ARISA_DQ_H #define DQ_MAGIC 0xbaadf00d typedef struct dq_t dq_t; typedef struct dq_ops_t dq_ops_t; /* Structures */ struct dq_ops_t { uint32_t magic; void (*pushf) (dq_t *, void *); void (*pushb) (dq_t *, void *); void *(*popf) (dq_t *); void *(*popb) (dq_t *); int (*length) (dq_t *); void (*clear) (dq_t *, void (*ffunc)(void*)); void (*free) (dq_t *, void (*ffunc)(void*)); }; struct dq_t { dq_ops_t *ops; void *data; }; /* Functions */ #define VALIDATE_DQ(dq,op) \ do { \ assert(dq->ops != NULL && dq->ops->magic == DQ_MAGIC); \ assert(dq->ops->op != NULL); \ } while(0) static inline void dq_push_front(dq_t *dq, void *ptr) { VALIDATE_DQ(dq,pushf); dq->ops->pushf(dq,ptr); } static inline void dq_push_back(dq_t *dq, void *ptr) { VALIDATE_DQ(dq,pushb); dq->ops->pushb(dq,ptr); } static inline void *dq_pop_front(dq_t *dq) { VALIDATE_DQ(dq,popf); return dq->ops->popf(dq); } static inline void *dq_pop_back(dq_t *dq) { VALIDATE_DQ(dq,popb); return dq->ops->popb(dq); } static inline int dq_length(dq_t *dq) { VALIDATE_DQ(dq,length); return dq->ops->length(dq); } static inline void dq_clear(dq_t *dq, void (*ffunc)) { VALIDATE_DQ(dq,clear); dq->ops->clear(dq,ffunc); } static inline void dq_free(dq_t *dq, void (*ffunc)) { VALIDATE_DQ(dq,free); dq->ops->free(dq,ffunc); } #undef VALIDATE_DQ dq_t *dq_alloc_simple(void); dq_t *dq_alloc_advanced(int notify_fd);