2 /* -----------------------------------------------------------------------------
3 * $Id: QueueTemplate.h,v 1.5 1999/12/07 11:15:02 sewardj Exp $
5 * (c) The GHC Team, 1998
7 * Template for generating queues of various types
9 * #define Queue and Type before #including this file
10 * to define the following:
12 * typedef { Type* elems; nat used; nat size } Queue;
13 * static void insertQueue( Queue* q, Type i );
14 * static void initQueue ( Queue* q );
15 * static void setQueue ( Queue* q, nat i, Type x );
16 * static void freeQueue ( Queue* q );
18 * $RCSfile: QueueTemplate.h,v $
20 * $Date: 1999/12/07 11:15:02 $
22 * ------------------------------------------------------------------------*/
24 /* These macros are rather delicate - read a good ANSI C book carefully
28 #define mycat(x,y) x##y
29 #define mycat2(x,y) mycat(x,y)
30 #define mycat3(x,y,z) mycat2(x,mycat2(y,z))
35 nat len; /* always <= size */
41 static int mycat2(findIn,Queue)( Queue* q, Type x )
44 for (i = 0; i < q->len; i++)
45 if (q->elems[i] == x) return i;
50 static void mycat2(init,Queue)( Queue* q )
54 q->elems = malloc(q->size * sizeof(Type));
55 if (q->elems == NULL) {
56 barf("Out of memory: can't allocate initial " mystr(Queue) " space");
61 static void mycat2(free,Queue)( Queue* q )
68 static void mycat2(insert,Queue)( Queue* q, Type x )
71 if (q->len == q->size) {
72 Type* elems2 = malloc(2 * q->size * sizeof(Type));
74 barf("Out of memory: can't resize " mystr(Queue) " space");
76 for (i = 0; i < q->len; i++)
77 elems2[i] = q->elems[i];
87 void mycat2(set,Queue)( Queue* q, nat i, Type x )
95 /* evaluate a statement s once for every element in a queue q.
96 * i and x are usually free in s
97 * queueTy and eltTy are the types of the container and element respectively
99 #define mapQueue(queueTy,eltTy,q,s) \
103 while( i < (q).len ) { \
110 /* --------------------------------------------------------------------------
111 * End of Queue template
112 * ------------------------------------------------------------------------*/