BrainBlast/_software_lib/nanomq-0.22.10/include/nng/supplemental/nanolib/queue.h

87 lines
2.4 KiB
C

#ifndef QUEUE_H
#define QUEUE_H
#include <stdio.h>
#include <stdlib.h>
#define INITIAL_SIZE 5
typedef struct {
void** array;
int front;
int rear;
int size;
int capacity;
} CircularQueue;
#define INIT_QUEUE(queue) \
do { \
(queue).array = (void**)malloc(INITIAL_SIZE * sizeof(void*)); \
(queue).front = -1; \
(queue).rear = -1; \
(queue).size = 0; \
(queue).capacity = INITIAL_SIZE; \
} while(0)
#define NEXT_INDEX(index, size) (((index) + 1) % (size))
#define IS_EMPTY(queue) ((queue).size == 0)
#define QUEUE_SIZE(queue) ((queue).size)
#define ENQUEUE(queue, element) \
do { \
if ((queue).size == (queue).capacity) { \
int new_capacity = (queue).capacity * 2; \
void** new_array = (void**)malloc(new_capacity * sizeof(void*)); \
int i = 0; \
int j = (queue).front; \
while (i < (queue).size) { \
new_array[i] = (queue).array[j]; \
i++; \
j = NEXT_INDEX(j, (queue).capacity); \
} \
free((queue).array); \
(queue).array = new_array; \
(queue).front = 0; \
(queue).rear = (queue).size - 1; \
(queue).capacity = new_capacity; \
} \
if (IS_EMPTY(queue)) { \
(queue).front = 0; \
} \
(queue).rear = NEXT_INDEX((queue).rear, (queue).capacity); \
(queue).array[(queue).rear] = (element); \
(queue).size++; \
} while(0)
#define DEQUEUE(queue) \
({ \
void* dequeued_element = NULL; \
if (IS_EMPTY(queue)) { \
printf("Queue is empty. Cannot dequeue.\n"); \
} else { \
dequeued_element = (queue).array[(queue).front]; \
(queue).front = NEXT_INDEX((queue).front, (queue).capacity); \
(queue).size--; \
if (IS_EMPTY(queue)) { \
(queue).front = -1; \
(queue).rear = -1; \
} \
} \
dequeued_element; \
})
#define FOREACH_QUEUE(queue, elem) \
for (int i = (queue).front, _count = 0; \
(queue).size != 0 && _count < (queue).size; \
i = NEXT_INDEX(i, (queue).capacity), _count++) \
\
for (elem = (queue).array[i]; \
elem != NULL; \
elem = NULL)
#define DESTROY_QUEUE(queue) free((queue).array)
#endif