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