【C语言】缓存队列的实现

版权声明:本文为博主原创文章,可以转载但是请注明出处。 https://blog.csdn.net/qq153471503/article/details/82352271

《缓存循环队列的实现》


头文件

/*
 * LanJian_Queue.h
 *
 *  Created on: 2018年9月3日
 *      Author: AnKun
 */

#ifndef SRC_LANJIAN_QUEUE_H_
#define SRC_LANJIAN_QUEUE_H_

#include "stdint.h"
#include "string.h"
#include "stdlib.h"

typedef struct
{
    uint32_t maxsize;           // 队列大小
    uint32_t read;              // 读指针
    uint32_t write;             // 写指针
    uint8_t* payload;           // 指向数据缓存
} Queue_t, *QueuePtr_t;

uint32_t Queue_GetUsed(const QueuePtr_t queue);
uint32_t Queue_GetFree(const QueuePtr_t queue);
int Queue_isFull(const QueuePtr_t queue);
int Queue_isEmpty(const QueuePtr_t queue);
int Queue_Enqueue(QueuePtr_t queue, const void* buf, uint32_t length);
int Queue_Dequeue(QueuePtr_t queue, void* buf, uint32_t len);
void Queue_Init(QueuePtr_t queue, uint32_t maxsize, void* payload);
void Queue_Clear(QueuePtr_t queue);
QueuePtr_t Queue_Create(uint32_t size);
void Queue_Destory(QueuePtr_t queue);

uint32_t Queue_GetUsedEx(uint32_t read, uint32_t write, uint32_t size);
uint32_t Queue_GetFreeEx(uint32_t read, uint32_t write, uint32_t size);
int Queue_EnqueueEx(uint32_t read, uint32_t *write, uint32_t size, void* dst, const void* src, uint32_t length);
int Queue_DequeueEx(uint32_t *read, uint32_t write, uint32_t size, void* dst, const void* src, uint32_t length);

#endif /* SRC_LANJIAN_QUEUE_H_ */

源文件

#include "LanJian_Queue.h"

/**
 * 获得队列使用量
 * @param  queue
 * @return       返回已使用量
 */
uint32_t Queue_GetUsed(const QueuePtr_t queue)
{
    int len = -1;
    len =  queue->write - queue->read;
    if(len >= 0) return len;
    else
        return queue->maxsize + len;
}

uint32_t Queue_GetUsedEx(uint32_t read, uint32_t write, uint32_t size)
{
    int len = -1;
    len =  write - read;
    if(len >= 0) return len;
    else
        return size + len;
}


/**
 * 获得队列空余空间
 * @param  queue
 * @return       队列空余数
 */
uint32_t Queue_GetFree(const QueuePtr_t queue)
{
    return queue->maxsize - Queue_GetUsed(queue) - 1;
}

uint32_t Queue_GetFreeEx(uint32_t read, uint32_t write, uint32_t size)
{
    return size - Queue_GetUsedEx(read, write, size) - 1;
}


/**
 * 检测队列是否满
 * @param  queue
 * @return       1:满    0:不满
 */
int Queue_isFull(const QueuePtr_t queue)
{
    if(queue->read==(queue->write+1)%queue->maxsize)
        return 1;
    else
        return 0;
}

/**
 * 检测队列是否为空
 * @param  queue
 * @return       1:空    0:非空
 */
int Queue_isEmpty(const QueuePtr_t queue)
{
    if(queue->read==queue->write)
        return 1;
    else
        return 0;
}

/**
 * 数据入队
 * @param  queue
 * @param  buf    要入队的数据
 * @param  length 数据长度
 * @return        失败-1, 成功返回入队成功的数量
 */
int Queue_Enqueue(QueuePtr_t queue, const void* buf, uint32_t length)
{
    uint8_t* dataptr = (uint8_t *)buf;
    uint32_t offset = 0;

    if(Queue_GetFree(queue) < length)
        return -1;

    offset = queue->maxsize - queue->write;
    if (offset >= length)
    {
        memcpy(queue->payload + queue->write, dataptr, length);
        queue->write += length;
    }else
    {
        memcpy(queue->payload + queue->write, dataptr, offset);
        memcpy(queue->payload, dataptr + offset, length - offset);
        queue->write = length - offset;
    }
    return length;
}

int Queue_EnqueueEx(uint32_t read, uint32_t *write, uint32_t size, void* dst, const void* src, uint32_t length)
{
    uint8_t* dstptr = (uint8_t *)dst;
    const uint8_t* srcptr = (const uint8_t*)src;
    uint32_t offset = 0;

    if(Queue_GetFreeEx(read, *write, size) < length)
        return -1;

    offset = size - *write;
    if (offset >= length)
    {
        memcpy(dstptr + *write, srcptr, length);
        *write += length;
    }else
    {
        memcpy(dstptr + *write, srcptr, offset);
        memcpy(dstptr, srcptr + offset, length - offset);
        *write = length - offset;
    }
    return length;
}

/**
 * 数据出兑
 * @param  queue
 * @param  buf   存放出队数据的缓存
 * @param  len   出队数据长度
 * @return       失败-1, 成功返回出队字节数
 */
int Queue_Dequeue(QueuePtr_t queue, void* buf, uint32_t len)
{
    uint8_t* dataptr = (uint8_t *)buf;
    uint32_t offset = 0;

    if(Queue_GetUsed(queue) < len)
        return -1;

    offset = queue->maxsize - queue->read;

    if( offset >= len)
    {
        memcpy(dataptr, queue->payload + queue->read, len);
        queue->read += len;
    }else
    {
        memcpy(dataptr, queue->payload + queue->read, offset);
        memcpy(dataptr + offset, queue->payload, len - offset);
        queue->read = len - offset;
    }

    return len;
}

int Queue_DequeueEx(uint32_t *read, uint32_t write, uint32_t size, void* dst, const void* src, uint32_t length)
{
    uint8_t* dstptr = (uint8_t *)dst;
    const uint8_t* srcptr = (const uint8_t *)src;
    uint32_t offset = 0;

    if(Queue_GetUsedEx(*read, write, size) < length)
        return -1;

    offset = size - *read;

    if( offset >= length)
    {
        memcpy(dstptr, srcptr + *read, length);
        *read += length;
    }else
    {
        memcpy(dstptr, srcptr + *read, offset);
        memcpy(dstptr + offset, srcptr, length - offset);
        *read = length - offset;
    }

    return length;
}

/**
 * 初始化一个队列
 * @param queue
 * @param maxsize 队列大小
 * @param payload 队列缓存地址
 */
void Queue_Init(QueuePtr_t queue, uint32_t maxsize, void* payload)
{
    queue->read = 0;
    queue->write = 0;
    queue->payload = (uint8_t* )payload;
    queue->maxsize = maxsize;
}

/**
 * 清理缓存
 * @param queue
 */
void Queue_Clear(QueuePtr_t queue)
{
    queue->read = queue->write;
}

/**
 * 动态创建一个队列
 * @param  size 队列大小
 * @return      成功返回队列对象指针, 失败返回NULL
 */
QueuePtr_t Queue_Create(uint32_t size)
{
    QueuePtr_t queue = NULL;

    queue = (QueuePtr_t)malloc(sizeof(Queue_t));
    if (queue == NULL)
        return NULL;

    queue->maxsize = size;
    queue->read = 0;
    queue->write = 0;

    queue->payload = (uint8_t *)malloc(size);
    if (queue->payload == NULL)
    {
        free(queue);
        return NULL;
    }

    return queue;
}

/**
 * 对于动态创建的队列进行清理工作
 * @param queue
 */
void Queue_Destory(QueuePtr_t queue)
{
    free(queue->payload);
    free(queue);
    queue = NULL;
}

ends…

猜你喜欢

转载自blog.csdn.net/qq153471503/article/details/82352271