1 /* Steven Andrews, 4/16/95. 2 See documentation called queue_doc.doc. 3 Copyright 2003-2007 by Steven Andrews. This work is distributed under the terms 4 of the Gnu Lesser General Public License (LGPL). */ 5 6 #ifndef __queue_h 7 #define __queue_h 8 9 #include <limits.h> 10 #if !defined(LLONG_MAX) || defined(WIN32) 11 typedef long int Q_LONGLONG; 12 #define Q_LLONG_MAX LONG_MAX 13 #define Q_LLI "%li" 14 #else 15 typedef long long int Q_LONGLONG; 16 #define Q_LLONG_MAX LLONG_MAX 17 #define Q_LLI "%lli" 18 #endif 19 20 21 enum Q_types {Qusort,Qvoid,Qint,Qdouble,Qlong}; 22 23 typedef struct qstruct{ 24 enum Q_types type; 25 void **kv; 26 int *ki; 27 double *kd; 28 Q_LONGLONG *kl; 29 int (*keycmp)(void *,void *); 30 void **x; 31 int n; 32 int f; 33 int b; } *queue; 34 35 #define q_frontkeyV(q) ((q)->b==(q)->f?NULL:(q)->kv[(q)->f]) 36 #define q_frontkeyI(q) ((q)->b==(q)->f?0:(q)->ki[(q)->f]) 37 #define q_frontkeyD(q) ((q)->b==(q)->f?0:(q)->kd[(q)->f]) 38 #define q_frontkeyL(q) ((q)->b==(q)->f?0:(q)->kl[(q)->f]) 39 40 queue q_alloc(int n,enum Q_types type,int (*keycmp)(void *,void *)); 41 int q_expand(queue q,int addspace); 42 void q_free(queue q,int freek,int freex); 43 void q_null(queue q); 44 int q_enqueue(void *kv,int ki,double kd,Q_LONGLONG kl,void *x,queue q); 45 int q_push(void *kv,int ki,double kd,Q_LONGLONG kl,void *x,queue q); 46 int q_insert(void *kv,int ki,double kd,Q_LONGLONG kl,void *x,queue q); 47 void q_front(queue q,void **kvptr,int *kiptr,double *kdptr,Q_LONGLONG *klptr,void **xptr); 48 int q_pop(queue q,void **kvptr,int *kiptr,double *kdptr,Q_LONGLONG *klptr,void **xptr); 49 int q_length(queue q); 50 int q_maxlength(queue q); 51 int q_next(int i,void **kvptr,int *kiptr,double *kdptr,Q_LONGLONG *klptr,void **xptr,queue q); 52 53 #endif 54 55