blob: 301815a003d9b472e492bbdc2861f9ca129ed821 [file] [log] [blame]
#include <assert.h>
#include <stdlib.h>
#include <j_queue.h>
int j_queue_is_empty(JQueue* queue)
{
assert (queue);
assert((((queue->tail + queue->room_size) - queue->head) % queue->room_size)
== queue->element_count);
return (queue->element_count == 0);
}
void* j_queue_pop_head(JQueue* queue)
{
void *ret;
assert (queue);
assert((((queue->tail + queue->room_size) - queue->head) % queue->room_size)
== queue->element_count);
if (queue->element_count == 0) return NULL;
ret = queue->rooms[queue->head];
queue->head = (queue->head + 1) % queue->room_size;
queue->element_count --;
if (queue->element_count == 0) {
queue->head = queue->tail = 0;
}
return ret;
}
void *j_queue_peek_head(JQueue* queue)
{
void *ret;
assert (queue);
assert((((queue->tail + queue->room_size) - queue->head) % queue->room_size)
== queue->element_count);
if (queue->element_count == 0) return NULL;
ret = queue->rooms[queue->head];
return ret;
}
void j_queue_free(JQueue* queue)
{
assert (queue);
assert (queue->rooms);
assert((((queue->tail + queue->room_size) - queue->head) % queue->room_size)
== queue->element_count);
free(queue->rooms);
queue->rooms = NULL;
free(queue);
}
JQueue* j_queue_new()
{
JQueue *queue = (JQueue*) malloc(sizeof(JQueue));
assert (queue != NULL);
queue->room_size = INIT_ROOM_SIZE;
queue->rooms = (void**) malloc(sizeof(void*) * queue->room_size);
assert (queue->rooms);
queue->head = queue->tail = 0;
queue->element_count = 0;
return queue;
}
void j_queue_push_tail(JQueue *queue, void *data)
{
assert((((queue->tail + queue->room_size) - queue->head) % queue->room_size)
== queue->element_count);
if (queue->element_count == (queue->room_size -1)) {
queue->rooms = (void**) realloc(queue->rooms, sizeof(void*) * queue->room_size * 2);
if (queue->head > queue->tail) {
memcpy(&queue->rooms[0], &queue->rooms[queue->element_count], queue->tail);
queue->tail = queue->head + queue->element_count;
}
queue->room_size = queue->room_size * 2;
assert(queue->rooms);
}
queue->rooms[queue->tail] = data;
queue->element_count ++;
queue->tail = (queue->tail + 1 + queue->room_size) % queue->room_size;
}
#ifdef _J_QUEUE_UT_
#include <stdio.h>
int main() {
JQueue *pQueue = j_queue_new();
int i;
void *data;
int *p;
#define ELEM_TABLE_SIZE (INIT_ROOM_SIZE * 2 - 1)
for (i = 0; i < ELEM_TABLE_SIZE; i ++) {
j_queue_push_tail(pQueue, i);
}
printf("queue is empty(%d)\n", j_queue_is_empty(pQueue));
for (i = 0; i < ELEM_TABLE_SIZE; i ++) {
data = j_queue_pop_head(pQueue);
printf("elements(%d) poped %d\n", i, (int)data);
}
printf("queue is empty(%d)\n", j_queue_is_empty(pQueue));
int j;
for (j = 0; j < ELEM_TABLE_SIZE; j ++) {
for (i = 0; i < 5; i ++) {
j_queue_push_tail(pQueue, i);
}
for (i = 0; i < 4; i ++) {
data = j_queue_pop_head(pQueue);
printf("elements(%d) poped %d\n", i, (int)data);
}
}
j_queue_free(pQueue);
return 0;
}
#endif