turbonss/src/vqueue.c

52 lines
1.1 KiB
C
Raw Normal View History

2004-12-23 15:16:30 +02:00
#include "vqueue.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
struct __vqueue_t
2004-12-23 15:16:30 +02:00
{
2005-01-18 23:06:08 +02:00
cmph_uint32 * values;
cmph_uint32 beg, end, capacity;
2004-12-23 15:16:30 +02:00
};
vqueue_t * vqueue_new(cmph_uint32 capacity)
2004-12-23 15:16:30 +02:00
{
2008-04-12 09:17:21 +03:00
size_t capacity_plus_one = capacity + 1;
vqueue_t *q = (vqueue_t *)malloc(sizeof(vqueue_t));
2004-12-23 15:16:30 +02:00
assert(q);
2008-04-12 09:17:21 +03:00
q->values = (cmph_uint32 *)calloc(capacity_plus_one, sizeof(cmph_uint32));
2004-12-23 15:16:30 +02:00
q->beg = q->end = 0;
2008-04-12 09:17:21 +03:00
q->capacity = capacity_plus_one;
2004-12-23 15:16:30 +02:00
return q;
}
cmph_uint8 vqueue_is_empty(vqueue_t * q)
2004-12-23 15:16:30 +02:00
{
return (q->beg == q->end);
}
void vqueue_insert(vqueue_t * q, cmph_uint32 val)
2004-12-23 15:16:30 +02:00
{
assert((q->end + 1)%q->capacity != q->beg); // Is queue full?
q->end = (q->end + 1)%q->capacity;
q->values[q->end] = val;
}
cmph_uint32 vqueue_remove(vqueue_t * q)
2004-12-23 15:16:30 +02:00
{
assert(!vqueue_is_empty(q)); // Is queue empty?
2004-12-23 15:16:30 +02:00
q->beg = (q->beg + 1)%q->capacity;
return q->values[q->beg];
}
void vqueue_print(vqueue_t * q)
2004-12-23 15:16:30 +02:00
{
2005-01-18 23:06:08 +02:00
cmph_uint32 i;
2004-12-23 15:16:30 +02:00
for (i = q->beg; i != q->end; i = (i + 1)%q->capacity)
fprintf(stderr, "%u\n", q->values[(i + 1)%q->capacity]);
}
void vqueue_destroy(vqueue_t *q)
2004-12-23 15:16:30 +02:00
{
free(q->values); q->values = NULL; free(q);
2004-12-23 15:16:30 +02:00
}