2024-02-08 03:12:37 -07:00
|
|
|
#include "arc/std/queue.h"
|
|
|
|
|
|
|
|
|
|
#include "arc/std/errno.h"
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
|
|
typedef struct ARC_QueueNode ARC_QueueNode;
|
|
|
|
|
|
|
|
|
|
struct ARC_QueueNode {
|
|
|
|
|
ARC_QueueNode *next;
|
|
|
|
|
void *data;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ARC_Queue {
|
|
|
|
|
uint32_t currentSize;
|
|
|
|
|
ARC_QueueNode *node;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void ARC_Queue_Create(ARC_Queue **queue){
|
|
|
|
|
*queue = (ARC_Queue *)malloc(sizeof(ARC_Queue));
|
|
|
|
|
(*queue)->currentSize = 0;
|
|
|
|
|
(*queue)->node = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ARC_Queue_Destroy(ARC_Queue *queue){
|
|
|
|
|
if(queue->currentSize != 0 || queue->node != NULL){
|
|
|
|
|
arc_errno = ARC_ERRNO_DATA;
|
|
|
|
|
ARC_DEBUG_ERR("ARC_Queue_Destroy(queue) called, but queue was not empty");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(queue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ARC_Queue_Push(ARC_Queue *queue, void *data){
|
|
|
|
|
//TODO: check if size exceeds uint32_t
|
|
|
|
|
ARC_QueueNode *end = queue->node;
|
|
|
|
|
for(uint32_t i = 0; i < queue->currentSize; i++){
|
|
|
|
|
//TODO: check if end->next exists
|
|
|
|
|
end = end->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ARC_QueueNode *node = (ARC_QueueNode *)malloc(sizeof(ARC_QueueNode));
|
|
|
|
|
node->data = data;
|
|
|
|
|
node->next = NULL;
|
|
|
|
|
|
|
|
|
|
end->next = node;
|
|
|
|
|
|
|
|
|
|
queue->currentSize++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void *ARC_Queue_Pop(ARC_Queue *queue){
|
|
|
|
|
if(queue->currentSize == 0){
|
|
|
|
|
arc_errno = ARC_ERRNO_DATA;
|
|
|
|
|
ARC_DEBUG_ERR("ARC_Queue_Pop(queue) called, but queue was not empty");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ARC_QueueNode *node = queue->node;
|
|
|
|
|
if(node == NULL){
|
|
|
|
|
arc_errno = ARC_ERRNO_NULL;
|
|
|
|
|
ARC_DEBUG_ERR("ARC_Queue_Pop(queue) called, but node was NULL");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
queue->node = node->next;
|
|
|
|
|
void *nodeData = node->data;
|
|
|
|
|
free(node);
|
|
|
|
|
|
|
|
|
|
queue->currentSize--;
|
|
|
|
|
|
|
|
|
|
return nodeData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t ARC_Queue_Size(ARC_Queue *queue){
|
|
|
|
|
return queue->currentSize;
|
|
|
|
|
}
|