鉴于前辈代码使用的队列函数仅对单字节数据结构进行操作,效率、复用性太差,遂完成如下函数,对自定义字节长度的数据结构进行储存操作;
#include "Queue.h"
/**
* @Name :
* @Descriptions: 静态队列初始化:初始化配置及信息检查
* @Input :
* @Return :
**/
bool st_queue_init(st_queue* queue,unsigned short member_size,unsigned short member_num,void* queue_buffer)
{
bool val = false;
if((queue_buffer != NULL) && (queue != NULL))
{
queue->head_index = 0;
queue->tail_index = 0;
queue->member_num = member_num;
queue->member_size = member_size;
queue->queue_buffer = queue_buffer;
val = true;
}
return val;
}
/**
* @Name :
* @Descriptions: 静态队列空检查
* @Input :
* @Return :
**/
bool st_queue_is_empty(st_queue* queue)
{
bool val = false;
if(queue->head_index == queue->tail_index)
{
val = true;
}
return val;
}
/**
* @Name :
* @Descriptions: 静态队列满检查
* @Input :
* @Return :
**/
bool st_queue_is_full(st_queue* queue)
{
bool val = false;
if(queue->head_index == (queue->tail_index + 1) % queue->member_num)
{
val = true;
}
return val;
}
/**
* @Name :
* @Descriptions: 静态队列入队(队尾)
* @Input :
* @Return :
**/
bool st_queue_in_tail(st_queue* queue,void* vdata)
{
bool val = false;
void* memgo = NULL;
char* memto = NULL;
unsigned short memsize = 0;
if((queue != NULL) && (vdata != NULL))
{
if(!st_queue_is_full(queue))
{
memgo = vdata;
memto = (char*)queue->queue_buffer + (queue->tail_index * queue->member_size);
memsize = queue->member_size;
memcpy(memto,memgo,memsize);
queue->tail_index = (queue->tail_index + 1) % queue->member_num;
val = true;
}
}
return val;
}
/**
* @Name :
* @Descriptions: 静态队列出队(队头)
* @Input :
* @Return :
**/
bool st_queue_out_head(st_queue* queue,void* vdata)
{
bool val = false;
void* vmem = NULL;
if(queue != NULL)
{
if(!st_queue_is_empty(queue))
{
vmem = (char*)queue->queue_buffer + (queue->head_index * queue->member_size);
if(vdata != NULL)
{
memcpy(vdata,vmem,queue->member_size);
}
queue->head_index = (queue->head_index + 1) % queue->member_num;
val = true;
}
}
return val;
}
/**
* @Name :
* @Descriptions: 静态队列入队(循环队列)
* @Input :
* @Return :
**/
bool st_queue_in_tail_loop(st_queue* queue,void* vdata)
{
bool val = false;
void* memgo = NULL;
char* memto = NULL;
unsigned short memsize = 0;
if((queue != NULL) && (vdata != NULL))
{
if(st_queue_is_full(queue))
{
st_queue_out_head(queue,NULL);
}
memgo = vdata;
memto = (char*)queue->queue_buffer + (queue->tail_index * queue->member_size);
memsize = queue->member_size;
memcpy(memto,memgo,memsize);
queue->tail_index = (queue->tail_index + 1) % queue->member_num;
val = true;
}
return val;
}
/**
* @Name :
* @Descriptions: 获取当前队列成员数量
* @Input :
* @Return :
**/
unsigned short st_queue_get_num(st_queue* queue)
{
unsigned short val = 0;
if(queue != NULL)
{
val = (queue->tail_index + queue->member_num - queue->head_index) % queue->member_num;
}
return val;
}
/**
* @Name :
* @Descriptions: 获取当前队列对应ID成员数据(仅读取)
* @Input :
* @Return :
**/
bool st_queue_get_id(st_queue* queue,unsigned short id,void* vdata)
{
bool val = false;
unsigned short num = 0;
unsigned short memsize = 0;
void* memgo = NULL;
char* memto = NULL;
if(queue != NULL)
{
num = st_queue_get_num(queue);
if(id < num)
{
memgo = (char*)queue->queue_buffer + (((queue->tail_index + num) % queue->member_num) * queue->member_size);
memto = vdata;
memsize = queue->member_size;
memcpy(memto,memgo,memsize);
val = true;
}
}
}
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include "stdbool.h"
#include "string.h"
typedef struct{
unsigned int head_index; //出队偏移地址
unsigned int tail_index; //入队偏移地址
unsigned short member_size; //成员大小
unsigned short member_num; //数量
void* queue_buffer; //静态信息池
}st_queue;
bool st_queue_init(st_queue* queue,unsigned short member_size,unsigned short member_num,void* queue_buffer);
bool st_queue_in_tail(st_queue* queue,void* vdata);
bool st_queue_out_head(st_queue* queue,void* vdata);
bool st_queue_is_empty(st_queue* queue);
bool st_queue_in_tail_loop(st_queue* queue,void* vdata);
unsigned short st_queue_get_num(st_queue* queue);
bool st_queue_get_id(st_queue* queue,unsigned short id,void* vdata);
#endif