|
发表于 2008-12-31 19:32:21
|
显示全部楼层
给你一个新的模板RD_TPL_QUEUE.h
#ifndef _USE_TPL_QUEUE_H_
#define _USE_TPL_QUEUE_H_
/***********************************************************
* 模板库说明:环形队列模板 *
* 版本: v1.10 *
* 作者: 王卓然 *
* 创建日期: 2008年1月19日 *
* -------------------------------------------------------- *
* [支 持 库] *
* 支持库名称:RD_MacroAndConst.h *
* 需要版本: v0.04 &abv *
* 支持库说明:系统常用宏定义库 *
* -------------------------------------------------------- *
* [版本更新] *
* 修改: 王卓然 *
* 修改日期: 2008年3月8日 *
* 版本: v1.10 *
* -------------------------------------------------------- *
* [版本历史] *
* v1.00 提供了基本的代码模板和基本的队列操作函数。 *
* v1.10 增加了一个扩展的Peek函数,可以连续的向后预 *
* 读队列中的内容。并增加了队列清空的函数。 *
* -------------------------------------------------------- *
* [使用说明] *
***********************************************************/
/********************
* 头 文 件 配 置 区 *
********************/
# include "RD_MacroAndConst.h"
/********************
* 系 统 宏 定 义 *
********************/
/*------------------*
* 常 数 宏 定 义 *
*------------------*/
/*------------------*
* 动 作 宏 定 义 *
*------------------*/
# define START_DEFINE_QUEUE(__NAME,__SIZE,__TYPE,__POS_TYPE) \
__TYPE s_Queue##__NAME##Buffer[(__SIZE)] = {0};\
__POS_TYPE s_Queue##__NAME##Tail = 0;\
__POS_TYPE s_Queue##__NAME##Head = 0;\
__POS_TYPE s_Queue##__NAME##Counter = 0;\
__POS_TYPE s_Queue##__NAME##PeekCounter = 0;\
\
BOOL Queue_##__NAME##_Add_Data(__TYPE Data)\
{\
SAFE_CODE_PERFORMANCE\
(\
if ((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\
&& (s_Queue##__NAME##Counter != 0))\
{\
EXIT_SAFE_CODE\
return FALSE;\
}\
\
s_Queue##__NAME##Buffer[s_Queue##__NAME##Tail] = Data;\
s_Queue##__NAME##Tail = (s_Queue##__NAME##Tail == (__SIZE - 1)) ? \
0 : (s_Queue##__NAME##Tail + 1);\
s_Queue##__NAME##Counter++;\
)\
\
return TRUE;\
}\
\
BOOL Queue_##__NAME##_Get_Data(__TYPE *pData)\
{\
SAFE_CODE_PERFORMANCE\
(\
if (((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\
&& (s_Queue##__NAME##Counter == 0))\
|| (pData == NULL))\
{\
EXIT_SAFE_CODE\
return FALSE;\
}\
\
(*pData) = s_Queue##__NAME##Buffer[s_Queue##__NAME##Head];\
s_Queue##__NAME##Head = (s_Queue##__NAME##Head == (__SIZE - 1)) ? \
0 : (s_Queue##__NAME##Head + 1);\
s_Queue##__NAME##Counter--;\
s_Queue##__NAME##PeekCounter = s_Queue##__NAME##Head;\
)\
\
return TRUE;\
}\
\
BOOL Queue_##__NAME##_Peek_Data(__TYPE *pData)\
{\
SAFE_CODE_PERFORMANCE\
(\
if (((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\
&& (s_Queue##__NAME##Counter == 0))\
|| (pData == NULL))\
{\
EXIT_SAFE_CODE\
return FALSE;\
}\
\
(*pData) = s_Queue##__NAME##Buffer[s_Queue##__NAME##Head];\
)\
\
return TRUE;\
}\
\
BOOL Queue_##__NAME##_Check_Empty(void)\
{\
SAFE_CODE_PERFORMANCE\
(\
if ((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\
&& (s_Queue##__NAME##Counter == 0))\
{\
EXIT_SAFE_CODE\
return TRUE;\
}\
)\
return FALSE;\
}\
\
__POS_TYPE Queue_##__NAME##_Get_Count(void)\
{\
return s_Queue##__NAME##Counter;\
}\
BOOL Queue_##__NAME##_Peek_Extend(__TYPE *pData)\
{\
SAFE_CODE_PERFORMANCE\
(\
if ((s_Queue##__NAME##PeekCounter == s_Queue##__NAME##Tail)\
|| (pData == NULL))\
{\
EXIT_SAFE_CODE\
return FALSE;\
}\
\
(*pData) = s_Queue##__NAME##Buffer[s_Queue##__NAME##PeekCounter];\
s_Queue##__NAME##PeekCounter++;\
s_Queue##__NAME##PeekCounter = (s_Queue##__NAME##PeekCounter == (__SIZE - 1)) ? \
0 : (s_Queue##__NAME##PeekCounter + 1);\
)\
\
return TRUE;\
}\
void Queue_##__NAME##_Reset_Peek_Counter(void)\
{\
SAFE_CODE_PERFORMANCE\
(\
s_Queue##__NAME##PeekCounter = s_Queue##__NAME##Head;\
)\
}\
void Queue_##__NAME##_Clear(void)\
{\
SAFE_CODE_PERFORMANCE\
(\
s_Queue##__NAME##Tail = s_Queue##__NAME##Head;\
s_Queue##__NAME##Counter = 0;\
s_Queue##__NAME##PeekCounter = s_Queue##__NAME##Head;\
)\
}
# define END_DEFINE_QUEUE
# define GET_QUEUE_DATA(__NAME,__ADDR) Queue_##__NAME##_Get_Data(__ADDR)
# define PEEK_QUEUE_DATA(__NAME,__ADDR) Queue_##__NAME##_Peek_Data(__ADDR)
# define ADD_QUEUE_DATA(__NAME,__VAR) Queue_##__NAME##_Add_Data(__VAR)
# define GET_QUEUE_COUNT(__NAME) Queue_##__NAME##_Get_Count()
# define CHECK_QUEUE_EMPTY(__NAME) Queue_##__NAME##_Check_Empty()
# define PEEK_QUEUE_DATA_EXTEND(__NAME,__ADDR) Queue_##__NAME##_Peek_Extend(__ADDR)
# define RESET_PEEK_COUNTER(__NAME) Queue_##__NAME##_Reset_Peek_Counter();
# define CLEAR_QUEUE(__NAME) Queue_##__NAME##_Clear();
# define EXTERN_REFERENCE_QUEUE(__NAME,__TYPE,__POS_TYPE) \
extern BOOL Queue_##__NAME##_Add_Data(__TYPE Data);\
extern BOOL Queue_##__NAME##_Get_Data(__TYPE *pData);\
extern BOOL Queue_##__NAME##_Peek_Data(__TYPE *pData);\
extern BOOL Queue_##__NAME##_Check_Empty(void);\
extern __POS_TYPE Queue_##__NAME##_Get_Count(void);\
extern BOOL Queue_##__NAME##_Peek_Extend(__TYPE *pData);\
extern void Queue_##__NAME##_Reset_Peek_Counter(void);\
extern void Queue_##__NAME##_Clear(void);
/********************
* 用户变量类型定义 *
********************/
/********************
* 结构体定义区 *
********************/
/********************
* 函 数 引 用 区 *
********************/
/********************
* 全局变量引用区 *
********************/
#endif |
|