X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fqueue.h;h=7e5603520e01eb98d5ace2f830e98c1f5f6f72fa;hb=0e46e80434781d1acbc4f5716827bf8688450a30;hp=7066820b377a2be2f14c4d5229d3e507e1d5b182;hpb=13127796e4361ad8c74701736692b4ef159ec317;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/queue.h b/src/queue.h index 7066820..7e56035 100644 --- a/src/queue.h +++ b/src/queue.h @@ -7,25 +7,30 @@ /* * queue.h - * + * */ -#ifndef QUEUE_H -#define QUEUE_H +#ifndef LIBSOLV_QUEUE_H +#define LIBSOLV_QUEUE_H #include "pooltypes.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef struct _Queue { - Id *elements; // current elements - int count; // current number of elements (minimal size for elements pointer) - Id *alloc; // this is whats actually allocated, elements > alloc if shifted - int left; // space left in alloc *after* elements+count + Id *elements; /* pointer to elements */ + int count; /* current number of elements in queue */ + Id *alloc; /* this is whats actually allocated, elements > alloc if shifted */ + int left; /* space left in alloc *after* elements+count */ } Queue; -extern void queue_alloc_one(Queue *q); +extern void queue_alloc_one(Queue *q); /* internal */ +extern void queue_alloc_one_head(Queue *q); /* internal */ -// clear queue +/* clear queue */ static inline void queue_empty(Queue *q) { @@ -48,6 +53,24 @@ queue_shift(Queue *q) return *q->elements++; } +static inline Id +queue_pop(Queue *q) +{ + if (!q->count) + return 0; + q->left++; + return q->elements[--q->count]; +} + +static inline void +queue_unshift(Queue *q, Id id) +{ + if (!q->alloc || q->alloc == q->elements) + queue_alloc_one_head(q); + *--q->elements = id; + q->count++; +} + static inline void queue_push(Queue *q, Id id) { @@ -67,9 +90,38 @@ queue_pushunique(Queue *q, Id id) queue_push(q, id); } -extern void queue_clone(Queue *t, Queue *s); +static inline void +queue_push2(Queue *q, Id id1, Id id2) +{ + queue_push(q, id1); + queue_push(q, id2); +} + +static inline void +queue_truncate(Queue *q, int n) +{ + if (q->count > n) + { + q->left += q->count - n; + q->count = n; + } +} + extern void queue_init(Queue *q); extern void queue_init_buffer(Queue *q, Id *buf, int size); +extern void queue_init_clone(Queue *target, const Queue *source); extern void queue_free(Queue *q); -#endif /* QUEUE_H */ +extern void queue_insert(Queue *q, int pos, Id id); +extern void queue_insert2(Queue *q, int pos, Id id1, Id id2); +extern void queue_insertn(Queue *q, int pos, int n, const Id *elements); +extern void queue_delete(Queue *q, int pos); +extern void queue_delete2(Queue *q, int pos); +extern void queue_deleten(Queue *q, int pos, int n); +extern void queue_prealloc(Queue *q, int n); + +#ifdef __cplusplus +} +#endif + +#endif /* LIBSOLV_QUEUE_H */