typedef void (*refqDel)(void *); extern void refqInit(refqDel d,long unsigned *q,int n,unsigned s); extern void refqSorting(long unsigned *q,unsigned s); extern void refqSync(long unsigned *q); #define refqDEL (0) #define refqSRT (1) #define refqEND (2) #define refqNXT (3) #define refq1ST (4) #define refqTAG(a) ((a) | 1lu) #define refqTAGP(a) (((a) & 1lu) != 0) #define refqDETAG(a) ((a) &~ 1lu) #define refqTAGGEDINC 0 #if (refqTAGGEDINC) # define refqTAGINC(a) refqTAG(a) # define refqTAGDEC(a) (a) #else # define refqTAGINC(a) (a) # define refqTAGDEC(a) refqTAG(a) #endif #if (1) # define refqINC_(q,o) \ (((q)[refqNXT] < (q)[refqEND]) ? 0 : refqSync(q), \ (*(long unsigned *) (q)[refqNXT]) = refqTAGINC((long unsigned) (o)), \ (q)[refqNXT] += sizeof (long unsigned)) # define refqDEC_(q,o) \ (((q)[refqNXT] < (q)[refqEND]) ? 0 : refqSync(q), \ (*(long unsigned *) (q)[refqNXT]) = refqTAGDEC((long unsigned) (o)), \ (q)[refqNXT] += sizeof (long unsigned)) #else static inline void refqINC_(long unsigned *const q,void *const o) { register long unsigned *const np = &q[refqNXT]; register const long unsigned n = *np; if (n >= q[refqEND]) refqSync(q); (*(long unsigned *) n) = refqTAGINC((long unsigned) o); *np += sizeof (long unsigned); } static inline void refqDEC_(long unsigned *const q,void *const o) { register long unsigned *np = &q[refqNXT]; register const long unsigned const n = *np; if (n >= q[refqEND]) refqSync(q); (*(long unsigned *) n) = refqTAGDEC((long unsigned) o); *np += sizeof (long unsigned); } #endif #ifdef NDEBUG # define refqINC(q,o) refqINC_(q,o) # define refqDEC(q,o) refqDEC_(q,o) #else extern void refqINC(long unsigned *q,void *o); extern void refqDEC(long unsigned *q,void *o); #endif