#include "terasic_includes.h"
#include "queue.h"




QUEUE_STRUCT* QUEUE_New(int nQueueNum){
    int nSize;
    QUEUE_STRUCT *pQueue;
    nSize = sizeof(QUEUE_STRUCT)+nQueueNum*sizeof(alt_u32);
    pQueue = (QUEUE_STRUCT *)malloc(nSize);
    memset((void *)pQueue, 0, nSize);
    pQueue->num = nQueueNum;
    return pQueue;
}

void QUEUE_Delete(QUEUE_STRUCT *pQueue){
    free(pQueue);
}

bool QUEUE_IsEmpty(QUEUE_STRUCT *pQueue){
    if (pQueue->front == pQueue->rear)
        return TRUE;
    return FALSE;
}

bool QUEUE_IsFull(QUEUE_STRUCT *pQueue){
    if (((pQueue->front+1)%pQueue->num) == pQueue->rear)
        return TRUE;
    return FALSE;
}

bool QUEUE_Push(QUEUE_STRUCT *pQueue, alt_u32 data32){
    if (QUEUE_IsFull(pQueue))
        return FALSE;
    pQueue->data[pQueue->front] = data32;
    pQueue->front = (pQueue->front+1)%pQueue->num;        
    return TRUE;
}

alt_u32 QUEUE_Pop(QUEUE_STRUCT *pQueue){
    alt_u32 data32;
    if (QUEUE_IsEmpty(pQueue))
        return 0;
    data32 = pQueue->data[pQueue->rear];
    pQueue->rear = (pQueue->rear+1)%pQueue->num;        
    return data32;
}

void QUEUE_Empty(QUEUE_STRUCT *pQueue){
    pQueue->front = 0;
    pQueue->rear = 0;
}

