环形缓冲区ringbuffer c++类模版实现
@ringbuffer
环形缓冲区ringbuffer c++类模版实现
使用方法:
1、将ringBuffer.h文件拷贝到开发工程中,添加相应的头文件
2、需要g++编译器(开发的项目工程需要支持),编译此类模版
3、支持int、char、bool等类型
#pragma once#include "stdlib.h"
#include <string>#define MAX_ASK_FOR_CAP (1 << 16) // 64Kstruct BufferInfo{BufferInfo(unsigned int r = 0, unsigned int w = 0, unsigned int c = 0): read(r), write(w), capacity(c), mask(c - 1){}unsigned int read; // read index in bufferunsigned int write; // write index in bufferunsigned int capacity; // capacity of the bufferunsigned int mask; // mask of the capacity
};template <typename T>
class RingBuffer
{public:RingBuffer(unsigned int bufCap = 0): buffer(NULL){create(bufCap);}~RingBuffer(){destroy();}/*** @brief create create one buffer* @param bufCap buffer capacity* @return return true if successful*/bool create(unsigned int bufCap){if (bufCap == 0){return false;}if (buffer != NULL){delete buffer;buffer = NULL;}unsigned int length = bufCap;unsigned int n = 1;while (length > n){n *= 2;if (n > MAX_ASK_FOR_CAP){return false;}}length = n;buffer = new T[length];bufferInfo.read = 0;bufferInfo.write = 0;bufferInfo.capacity = length;bufferInfo.mask = bufferInfo.capacity - 1;return true;}/*** @brief push write one data of T type into the buffer* @param data one data of T type* @return return true if successful*/bool push(const T &data){if (isFull() == true){return false;}int num = memcpy((buffer + bufferInfo.write * sizeof(T)),reinterpret_cast<void*>(&data), sizeof(T));if (num == sizeof(T)){bufferInfo.write += 1;return true;}return false;}/*** @brief push write serival data of T type into the buffer* @param data serival data of T type* @param len length of data* @return num of writing to buffer successfully*/unsigned int push(const T *data, unsigned int len){if (isFull() == true){return 0;}unsigned int space = availableToWrite();if (len > space){len = space;}int num = memcpy((buffer + bufferInfo.write * sizeof(T)),reinterpret_cast<void*>(data), len * sizeof(T));bufferInfo.write += num;return num;}/*** @brief pop remove oldest data of the buffer* @param num num of the removed data* @return num of the successful removed data*/unsigned int pop(unsigned int num){if (isEmpty() == true){return 0;}unsigned int count = availableToRead();if (num < count){bufferInfo.read += num;return num;}bufferInfo.read = bufferInfo.write = 0;return count;}/*** @brief takeTail get oldest data of the buffer and remove it* @return the data of T type*/T takeTail(){if (isEmpty() == true){return;}T data = buffer[bufferInfo.read * sizeof(T)];pop(1);return data;}/*** @brief read read some oldest data of the buffer and remove them* @param buf read the data to this buf.* @param len read length* @return read legth successfully*/unsigned int read(T &buf, unsigned int len){if (sizeof(buf) < len){len = sizeof(buf);}unsigned int count = 0;while (isEmpty() == false){buf[count++] = this->buffer[bufferInfo.read * sizeof(T)];pop(1);if (count >= len){break;}}return count;}private:/*** @brief destroy destroy the buffer created*/void destroy(){if (buffer == NULL){return;}delete buffer;buffer = NULL;}/*** @brief isFull if be full of the buffer* @return return true if successful*/inline bool isFull() const{if (0 == availableToWrite()){return true;}return false;}/*** @brief isEmpty if be empty of the buffer* @return return true if successful*/inline bool isEmpty() const{if (0 == availableToRead()){return true;}return false;}/*** @brief availableToRead available buffer to read* @return num of available buffer to read*/inline unsigned int availableToRead() const{return (bufferInfo.write & bufferInfo.mask) - (bufferInfo.read & bufferInfo.mask);}/*** @brief availableToWrite available buffer to write* @return num of available buffer to write*/inline unsigned int availableToWrite() const{return bufferInfo.mask - bufferInfo.mask & bufferInfo.write;}T *buffer;BufferInfo bufferInfo;
};
- 适用于小型数据量的通信缓冲区建立,例如嵌入式中usart、spi、iic、can等通信缓冲区。
环形缓冲区ringbuffer c++类模版实现相关推荐
- 环形缓冲区ringbuffer
环形缓冲区是生产者和消费者模型中常用的数据结构.生产者将数据放入数组的尾端,而消费者从数组的另一端移走数据,当达到数组的尾部时,生产者绕回到数组的头部. 如果只有一个生产者和一个消费者,那么就可以做到 ...
- 环形缓冲区的实现原理(ring buffer)
消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了.频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,非常不利于我们的服务器长期稳定运行.也许我们可以 ...
- 环形缓冲区实现类(Delphi)
环形缓冲区的用途及原理可以去百度资料狠多的,这里就不介绍了.直接贴代码.代码分别用D7,XE2编译测试 源码下载 http://files.cnblogs.com/lwm8246/uCircleBuf ...
- 环形缓冲区(ringbuffer)
环形缓冲区(ringbuffer) 环形缓冲区是嵌入式系统中十分重要的一种数据结构,比如在串口处理中,串口中断接收数据直接往环形缓冲区丢数据,而应用可以从环形缓冲区取数据进行处理,这样数据在读取和写入 ...
- 线程安全的量化时间帧环形缓冲区
目录 介绍 环形缓冲区代码 初始化 一个真实的例子 一个简单的页面 单元测试 Q测试中的事件 两个连续Q检验中的事件 清除Frame测试 结论 在本文中,您将了解一个环形缓冲区,该缓冲区跟踪一个时间帧 ...
- Ring Buffer (circular Buffer)环形缓冲区简介
https://blog.csdn.net/langeldep/article/details/8888582 关于环形缓冲区的知识,请看这里 http://en.wikipedia.org/wiki ...
- 环形缓冲区RingBuff的代码实现
~今天我们一起来聊一下环形缓冲区RingBuff又叫LoopBuff等等,都是相同的东西,只是一个名字不同罢了. ~我们在编写代码的时候缓冲区是几乎每个代码都必不可少的东西,比如存放串口接收的数据.做 ...
- GD32F303RET6 串口空闲中断+DMA数据发送接收+环形缓冲区方式保存数据
GD32F303RET6 DMA 通道映射关系 串口 源文件 #include "uart.h" #include "stdio.h" #include &qu ...
- Hadoop重点难点:Shuffle过程中的环形缓冲区
点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 这篇文章来自一个读者在面试过程中的一个问题,Hadoop在shuffle过程中使用了一个数据结构- ...
最新文章
- Java随笔--分布式
- 五分钟DBA:浅谈伪分布式数据库架构
- php 编译安装 png.h,PHP编译安装时常见错误解决办法【大全】
- CSS中content和attr的用法
- PHP和MySQL入门(8)
- RabbitMQ延迟消费和重复消费
- 实力剖析一个经典笔试题
- Linux无线网卡的工作模式
- HTML 网页页面切换的各种变换效果
- 能帮你找到网页设计灵感的16个网站
- Sprin boot 加载位置顺序
- 阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制
- 应用窗口置顶工具 DeskPins
- BNUOJ-4049-四叉树
- PlaySound函数用法
- 到底什么是dp思想(内含大量经典例题,附带详细解析)
- html markdown插件,MarkDown编辑必备插件
- OSS报表系统实训笔记
- 将数字转化为拼音(1000内)
- ML:从工程化思维分析—机器学习团队十大角色的简介(背景/职责/产出物):产品经理、项目经理、业务咨询顾问、数据科学家、ML研究员、数据工程师、ML工程师、DevOps/软件开发/交付工程师
热门文章
- 【看了10年前我为本单位写的此篇文章,感慨万分】此文章题目为:为关于“执行力”相关要素的方案设想
- Module not found: Error: Can‘t resolve ‘path‘
- 【三维目标检测】VoxelNet(三):模型详解
- 知识管理在企业业务中如何体现其价值
- Vue3响应式API ref和reactive
- stata:应用stata学习计量经济学原理 practice 6 边际效用 Marginal effect
- Spark SQL函数总结
- 计算机专业英语电池,“七号电池”英语不是 No.7 battery,而是这个!超有趣!...
- 【漫漫长征路】hihocoder #1082 然而沼跃鱼早就看穿了一切
- Elasticsearch 中的 Guice