xref: /haiku/src/libs/libsolv/solv/queue.h (revision f491972ca97c30b7b4ff6cf072de7bb345d58a69)
1*f491972cSAugustin Cavalier /*
2*f491972cSAugustin Cavalier  * Copyright (c) 2007, Novell Inc.
3*f491972cSAugustin Cavalier  *
4*f491972cSAugustin Cavalier  * This program is licensed under the BSD license, read LICENSE.BSD
5*f491972cSAugustin Cavalier  * for further information
6*f491972cSAugustin Cavalier  */
7*f491972cSAugustin Cavalier 
8*f491972cSAugustin Cavalier /*
9*f491972cSAugustin Cavalier  * queue.h
10*f491972cSAugustin Cavalier  *
11*f491972cSAugustin Cavalier  */
12*f491972cSAugustin Cavalier 
13*f491972cSAugustin Cavalier #ifndef LIBSOLV_QUEUE_H
14*f491972cSAugustin Cavalier #define LIBSOLV_QUEUE_H
15*f491972cSAugustin Cavalier 
16*f491972cSAugustin Cavalier #include "pooltypes.h"
17*f491972cSAugustin Cavalier 
18*f491972cSAugustin Cavalier #ifdef __cplusplus
19*f491972cSAugustin Cavalier extern "C" {
20*f491972cSAugustin Cavalier #endif
21*f491972cSAugustin Cavalier 
22*f491972cSAugustin Cavalier typedef struct _Queue {
23*f491972cSAugustin Cavalier   Id *elements;		/* pointer to elements */
24*f491972cSAugustin Cavalier   int count;		/* current number of elements in queue */
25*f491972cSAugustin Cavalier   Id *alloc;		/* this is whats actually allocated, elements > alloc if shifted */
26*f491972cSAugustin Cavalier   int left;		/* space left in alloc *after* elements+count */
27*f491972cSAugustin Cavalier } Queue;
28*f491972cSAugustin Cavalier 
29*f491972cSAugustin Cavalier 
30*f491972cSAugustin Cavalier extern void queue_alloc_one(Queue *q);		/* internal */
31*f491972cSAugustin Cavalier extern void queue_alloc_one_head(Queue *q);	/* internal */
32*f491972cSAugustin Cavalier 
33*f491972cSAugustin Cavalier /* clear queue */
34*f491972cSAugustin Cavalier static inline void
queue_empty(Queue * q)35*f491972cSAugustin Cavalier queue_empty(Queue *q)
36*f491972cSAugustin Cavalier {
37*f491972cSAugustin Cavalier   if (q->alloc)
38*f491972cSAugustin Cavalier     {
39*f491972cSAugustin Cavalier       q->left += (q->elements - q->alloc) + q->count;
40*f491972cSAugustin Cavalier       q->elements = q->alloc;
41*f491972cSAugustin Cavalier     }
42*f491972cSAugustin Cavalier   else
43*f491972cSAugustin Cavalier     q->left += q->count;
44*f491972cSAugustin Cavalier   q->count = 0;
45*f491972cSAugustin Cavalier }
46*f491972cSAugustin Cavalier 
47*f491972cSAugustin Cavalier static inline Id
queue_shift(Queue * q)48*f491972cSAugustin Cavalier queue_shift(Queue *q)
49*f491972cSAugustin Cavalier {
50*f491972cSAugustin Cavalier   if (!q->count)
51*f491972cSAugustin Cavalier     return 0;
52*f491972cSAugustin Cavalier   q->count--;
53*f491972cSAugustin Cavalier   return *q->elements++;
54*f491972cSAugustin Cavalier }
55*f491972cSAugustin Cavalier 
56*f491972cSAugustin Cavalier static inline Id
queue_pop(Queue * q)57*f491972cSAugustin Cavalier queue_pop(Queue *q)
58*f491972cSAugustin Cavalier {
59*f491972cSAugustin Cavalier   if (!q->count)
60*f491972cSAugustin Cavalier     return 0;
61*f491972cSAugustin Cavalier   q->left++;
62*f491972cSAugustin Cavalier   return q->elements[--q->count];
63*f491972cSAugustin Cavalier }
64*f491972cSAugustin Cavalier 
65*f491972cSAugustin Cavalier static inline void
queue_unshift(Queue * q,Id id)66*f491972cSAugustin Cavalier queue_unshift(Queue *q, Id id)
67*f491972cSAugustin Cavalier {
68*f491972cSAugustin Cavalier   if (!q->alloc || q->alloc == q->elements)
69*f491972cSAugustin Cavalier     queue_alloc_one_head(q);
70*f491972cSAugustin Cavalier   *--q->elements = id;
71*f491972cSAugustin Cavalier   q->count++;
72*f491972cSAugustin Cavalier }
73*f491972cSAugustin Cavalier 
74*f491972cSAugustin Cavalier static inline void
queue_push(Queue * q,Id id)75*f491972cSAugustin Cavalier queue_push(Queue *q, Id id)
76*f491972cSAugustin Cavalier {
77*f491972cSAugustin Cavalier   if (!q->left)
78*f491972cSAugustin Cavalier     queue_alloc_one(q);
79*f491972cSAugustin Cavalier   q->elements[q->count++] = id;
80*f491972cSAugustin Cavalier   q->left--;
81*f491972cSAugustin Cavalier }
82*f491972cSAugustin Cavalier 
83*f491972cSAugustin Cavalier static inline void
queue_pushunique(Queue * q,Id id)84*f491972cSAugustin Cavalier queue_pushunique(Queue *q, Id id)
85*f491972cSAugustin Cavalier {
86*f491972cSAugustin Cavalier   int i;
87*f491972cSAugustin Cavalier   for (i = q->count; i > 0; )
88*f491972cSAugustin Cavalier     if (q->elements[--i] == id)
89*f491972cSAugustin Cavalier       return;
90*f491972cSAugustin Cavalier   queue_push(q, id);
91*f491972cSAugustin Cavalier }
92*f491972cSAugustin Cavalier 
93*f491972cSAugustin Cavalier static inline void
queue_push2(Queue * q,Id id1,Id id2)94*f491972cSAugustin Cavalier queue_push2(Queue *q, Id id1, Id id2)
95*f491972cSAugustin Cavalier {
96*f491972cSAugustin Cavalier   queue_push(q, id1);
97*f491972cSAugustin Cavalier   queue_push(q, id2);
98*f491972cSAugustin Cavalier }
99*f491972cSAugustin Cavalier 
100*f491972cSAugustin Cavalier static inline void
queue_truncate(Queue * q,int n)101*f491972cSAugustin Cavalier queue_truncate(Queue *q, int n)
102*f491972cSAugustin Cavalier {
103*f491972cSAugustin Cavalier   if (q->count > n)
104*f491972cSAugustin Cavalier     {
105*f491972cSAugustin Cavalier       q->left += q->count - n;
106*f491972cSAugustin Cavalier       q->count = n;
107*f491972cSAugustin Cavalier     }
108*f491972cSAugustin Cavalier }
109*f491972cSAugustin Cavalier 
110*f491972cSAugustin Cavalier extern void queue_init(Queue *q);
111*f491972cSAugustin Cavalier extern void queue_init_buffer(Queue *q, Id *buf, int size);
112*f491972cSAugustin Cavalier extern void queue_init_clone(Queue *t, Queue *s);
113*f491972cSAugustin Cavalier extern void queue_free(Queue *q);
114*f491972cSAugustin Cavalier 
115*f491972cSAugustin Cavalier extern void queue_insert(Queue *q, int pos, Id id);
116*f491972cSAugustin Cavalier extern void queue_insert2(Queue *q, int pos, Id id1, Id id2);
117*f491972cSAugustin Cavalier extern void queue_insertn(Queue *q, int pos, int n, Id *elements);
118*f491972cSAugustin Cavalier extern void queue_delete(Queue *q, int pos);
119*f491972cSAugustin Cavalier extern void queue_delete2(Queue *q, int pos);
120*f491972cSAugustin Cavalier extern void queue_deleten(Queue *q, int pos, int n);
121*f491972cSAugustin Cavalier extern void queue_prealloc(Queue *q, int n);
122*f491972cSAugustin Cavalier 
123*f491972cSAugustin Cavalier #ifdef __cplusplus
124*f491972cSAugustin Cavalier }
125*f491972cSAugustin Cavalier #endif
126*f491972cSAugustin Cavalier 
127*f491972cSAugustin Cavalier #endif /* LIBSOLV_QUEUE_H */
128