📄 buffer(1).h
字号:
#ifndef _PYOS_BUFFER_H_
#define _PYOS_BUFFER_H_
/* 定义缓冲区队列 */
/* 由于没有内存分配函数,因此不能使用 new */
template< typename T >
class class_template_pyos_Buffer{
protected:
T* Buffer ; // 缓冲区的指针
unsigned int BufferMaxLength ; // 缓冲区的大小
volatile int BufferHead ; // 缓冲区头位置
volatile int BufferTail ; // 缓冲区尾位置
public:
/* 缓冲区初始化 */
void Init( T* buffer_addr , unsigned int buffer_max_length ) ;
/* 从缓冲区中读数据,存放在 save_into_data 中,返回读出个数,如缓冲区为空,则返回零
** move_it_out如为true 则表示把此数据移出缓冲区
*/
unsigned int ReadData( T& save_into_data , bool move_it_out = true ) ;
/* 把数据放入缓冲区,如果缓冲区满则直接返回零,否则返回放入个数
** force_put_and_put_at_first 如果为直表示此数据非常重要,需要强行放入且放入第一个位置,
** 则不论此缓冲区是否满,都会将数据放入缓冲区,且放入第一个位置,如果缓冲区满,则最后一个数据
** 被缓冲区丢弃
*/
unsigned int PutData( T data , bool froce_put_and_put_at_first = false ) ;
} ;
/* 缓冲区初始化 */
template< typename T >
void class_template_pyos_Buffer< T >::Init( T* buffer_addr , unsigned int buffer_max_length )
{
Buffer = buffer_addr ;
BufferMaxLength = buffer_max_length ;
/* 初始化缓冲区队列队头及队尾参数,
** 队头 == 队尾 : 缓冲区为空
** ( 队尾 + 1 ) % 队长度 == 队头 : 队满
** 存放时,先队尾 + 1,再存放于队尾所指处,队头所指处永远是无效数据
*/
BufferHead = 0 ;
BufferTail = BufferHead ; // 队头 == 队尾,缓冲区为空
}
/* 从缓冲区读数据 */
template< typename T >
unsigned int class_template_pyos_Buffer< T >::ReadData( T& save_into_data , bool move_it_out )
{
int count = 0 ;
int pos ;
if( BufferHead != BufferTail ){
// 缓冲区不为空
pos = ( BufferHead + 1 ) % BufferMaxLength ;
save_into_data = Buffer[ pos ] ;
++count ;
if( move_it_out ){
// 需要将读过的数据移出缓冲区
BufferHead = pos ;
}
}
return count ;
}
/* 在缓冲区中放入数据 */
template< typename T >
unsigned int class_template_pyos_Buffer< T >::PutData( T data , bool force_put_and_put_at_first )
{
int count = 0 ;
if( force_put_and_put_at_first ){
// 强行放入队头
Buffer[ BufferHead ] = data ;
++count ;
/* 队头前移一个位置 */
--BufferHead ;
if( BufferHead < 0 ){
BufferHead += BufferMaxLength ;
}
if( BufferHead == BufferTail ){
// 表示在放入数据前,队列已满了,因此需要放弃队列的最后一个元素,移动队尾位置
--BufferTail ;
if( BufferTail < 0 ){
BufferTail += BufferMaxLength ;
}
}
}
else{
// 不需要强行放入
/* 测试缓冲区是否已满 */
if( ( BufferTail + 1 ) % BufferMaxLength != BufferHead ){
// 缓冲区未满,放入数据
BufferTail = ( BufferTail + 1 ) % BufferMaxLength ;
Buffer[ BufferTail ] = data ;
++count ;
}
}
return count ;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -