一个简单高效的循环缓冲区的管理代码
2014-04-19 20:09
561 查看
一个简单高效的循环缓冲区的管理代码,与平台无关,可以方便在各种场合使用。
-A simple and efficient management of the cycle of the buffer zone code, and platform-independent, it will be convenient to use on various occasions.
-A simple and efficient management of the cycle of the buffer zone code, and platform-independent, it will be convenient to use on various occasions.
#ifndef LOOP_INCLUDED #define LOOP_INCLUDED #ifdef __cplusplus extern "C" { #endif struct LoopBuffCtl{ unsigned char * buffer; unsigned int size; unsigned int reader; unsigned int writer; }; void LoopBuffInit( struct LoopBuffCtl * pLoopCtl, unsigned int size, unsigned char * buffer ); unsigned short LoopBuffDataLength( struct LoopBuffCtl * pLoopCtl ); unsigned short LoopBuffFreeSpace( struct LoopBuffCtl * pLoopCtl ); unsigned short LoopBuffWrite( struct LoopBuffCtl *, unsigned char * , unsigned short ); unsigned short LoopBuffRead( struct LoopBuffCtl *, unsigned char *, unsigned short ); #ifdef __cplusplus } #endif #endif
#include "LoopBuff.h" #define min(a,b) ((a)>(b)) ? (b) : (a) unsigned short LoopBuffFreeSpace( struct LoopBuffCtl * pLoopCtl ) { return ( pLoopCtl->reader + pLoopCtl->size - pLoopCtl->writer - 1 ) & ( pLoopCtl->size - 1 ); } unsigned short LoopBuffDataLength( struct LoopBuffCtl * pLoopCtl ) { return ( pLoopCtl->writer + pLoopCtl->size - pLoopCtl->reader ) & ( pLoopCtl->size - 1 ); } void LoopBuffInit( struct LoopBuffCtl * pLoopCtl, unsigned int size, unsigned char * buffer ) { pLoopCtl->reader = pLoopCtl->writer = 0; pLoopCtl->size = size; pLoopCtl->buffer = buffer; } unsigned short LoopBuffWrite( struct LoopBuffCtl * pLoopCtl, unsigned char * buffer , unsigned short len ) { unsigned short l; len = min( len, pLoopCtl->size - ( pLoopCtl->writer - pLoopCtl->reader )); l = min( len, pLoopCtl->size - ( pLoopCtl->writer & ( pLoopCtl->size - 1 ))); memcpy( pLoopCtl->buffer + ( pLoopCtl->writer & ( pLoopCtl->size - 1 )), buffer, l ); memcpy( pLoopCtl->buffer, buffer + l, len - l ); pLoopCtl->writer += len; return len; } unsigned short LoopBuffRead( struct LoopBuffCtl * pLoopCtl, unsigned char * buffer , unsigned short len ) { unsigned short l; len = min( len, pLoopCtl->reader - pLoopCtl->writer ); l = min( len, pLoopCtl->size - ( pLoopCtl->reader & ( pLoopCtl->size - 1 ))); if( buffer != 0 ) { memcpy( buffer, pLoopCtl->buffer + ( pLoopCtl->reader & ( pLoopCtl->size - 1 )), l ); memcpy( buffer + l, pLoopCtl->buffer, len - l ); } pLoopCtl->reader += len; return len; }
相关文章推荐
- 一个简单的循环多道程序内核代码 实现
- 示例 - 17行代码实现一个简单高效的多线程蜘蛛程序
- 一个简单的学生信息管理系统(循环双向链表)
- 经典导航栏03,一个代码简单的后台管理界面
- 一个代码简单的后台管理界面
- 一个简单的层循环的js代码
- 一个简单关于学生成绩管理的C++程序代码,但是对于拷贝析构函数目前还是不知其作用何在
- 一个简单的层循环的js代码
- 客户关系管理的迭代特质:一个简单的CRM循环
- 创建一个简单的Ajax组建(Component)的代码的理解
- Access创建一个简单MIS管理系统
- GridView其实是一个table,这里使用js循环table,代码如下:
- 一个简单的在线 SQL Server 管理工具
- 如何让研发工作的管理更加简单高效
- SpringMvc+Mybatis实现一个简单人事管理系统(一)
- 一个简单的学生管理系统
- 一个极其简单的CMS(内容管理系统)PHP+MySQL技术解析
- 一个简单的AJAX实现,基于C#的ASP.Net,包括服务器端的程序代码
- 一个简单的java学生管理界面
- 用C#代码生成一个简单的PDF文件