@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++类模版实现相关推荐

  1. 环形缓冲区ringbuffer

    环形缓冲区是生产者和消费者模型中常用的数据结构.生产者将数据放入数组的尾端,而消费者从数组的另一端移走数据,当达到数组的尾部时,生产者绕回到数组的头部. 如果只有一个生产者和一个消费者,那么就可以做到 ...

  2. 环形缓冲区的实现原理(ring buffer)

    消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了.频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,非常不利于我们的服务器长期稳定运行.也许我们可以 ...

  3. 环形缓冲区实现类(Delphi)

    环形缓冲区的用途及原理可以去百度资料狠多的,这里就不介绍了.直接贴代码.代码分别用D7,XE2编译测试 源码下载 http://files.cnblogs.com/lwm8246/uCircleBuf ...

  4. 环形缓冲区(ringbuffer)

    环形缓冲区(ringbuffer) 环形缓冲区是嵌入式系统中十分重要的一种数据结构,比如在串口处理中,串口中断接收数据直接往环形缓冲区丢数据,而应用可以从环形缓冲区取数据进行处理,这样数据在读取和写入 ...

  5. 线程安全的量化时间帧环形缓冲区

    目录 介绍 环形缓冲区代码 初始化 一个真实的例子 一个简单的页面 单元测试 Q测试中的事件 两个连续Q检验中的事件 清除Frame测试 结论 在本文中,您将了解一个环形缓冲区,该缓冲区跟踪一个时间帧 ...

  6. Ring Buffer (circular Buffer)环形缓冲区简介

    https://blog.csdn.net/langeldep/article/details/8888582 关于环形缓冲区的知识,请看这里 http://en.wikipedia.org/wiki ...

  7. 环形缓冲区RingBuff的代码实现

    ~今天我们一起来聊一下环形缓冲区RingBuff又叫LoopBuff等等,都是相同的东西,只是一个名字不同罢了. ~我们在编写代码的时候缓冲区是几乎每个代码都必不可少的东西,比如存放串口接收的数据.做 ...

  8. GD32F303RET6 串口空闲中断+DMA数据发送接收+环形缓冲区方式保存数据

    GD32F303RET6 DMA 通道映射关系 串口 源文件 #include "uart.h" #include "stdio.h" #include &qu ...

  9. Hadoop重点难点:Shuffle过程中的环形缓冲区

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 这篇文章来自一个读者在面试过程中的一个问题,Hadoop在shuffle过程中使用了一个数据结构- ...

最新文章

  1. Java随笔--分布式
  2. 五分钟DBA:浅谈伪分布式数据库架构
  3. php 编译安装 png.h,PHP编译安装时常见错误解决办法【大全】
  4. CSS中content和attr的用法
  5. PHP和MySQL入门(8)
  6. RabbitMQ延迟消费和重复消费
  7. 实力剖析一个经典笔试题
  8. Linux无线网卡的工作模式
  9. HTML 网页页面切换的各种变换效果
  10. 能帮你找到网页设计灵感的16个网站
  11. Sprin boot 加载位置顺序
  12. 阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制
  13. 应用窗口置顶工具 DeskPins
  14. BNUOJ-4049-四叉树
  15. PlaySound函数用法
  16. 到底什么是dp思想(内含大量经典例题,附带详细解析)
  17. html markdown插件,MarkDown编辑必备插件
  18. OSS报表系统实训笔记
  19. 将数字转化为拼音(1000内)
  20. ML:从工程化思维分析—机器学习团队十大角色的简介(背景/职责/产出物):产品经理、项目经理、业务咨询顾问、数据科学家、ML研究员、数据工程师、ML工程师、DevOps/软件开发/交付工程师

热门文章

  1. 【看了10年前我为本单位写的此篇文章,感慨万分】此文章题目为:为关于“执行力”相关要素的方案设想
  2. Module not found: Error: Can‘t resolve ‘path‘
  3. 【三维目标检测】VoxelNet(三):模型详解
  4. 知识管理在企业业务中如何体现其价值
  5. Vue3响应式API ref和reactive
  6. stata:应用stata学习计量经济学原理 practice 6 边际效用 Marginal effect
  7. Spark SQL函数总结
  8. 计算机专业英语电池,“七号电池”英语不是 No.7 battery,而是这个!超有趣!...
  9. 【漫漫长征路】hihocoder #1082 然而沼跃鱼早就看穿了一切
  10. Elasticsearch 中的 Guice