环缓冲托管实现
来源:互联网 发布:美拍软件下载 编辑:程序博客网 时间:2024/05/13 20:29
// 这个缓冲将被用作ring_buffer测试class x_buffer{private:#pragma pack(1)typedef struct {volatile size_t _rd;volatile size_t _wd;volatile size_t _size;volatile bool _empty;char _data[1];}x_buffer_data, *x_buffer_data_ptr;x_buffer_data_ptr _buffer_data;public:x_buffer():_buffer_data(nullptr){}x_buffer(size_t size){_buffer_data = (x_buffer_data_ptr)( new char(size + sizeof(x_buffer_data)) );_buffer_data->_size = size;_buffer_data._rd = _buffer_data._wd = 0;_buffer_data._empty = true;memset(_buffer_data->_data, 0, _buffer_data->_size);}char* base(){return _buffer_data._data;}const char* base(){return _buffer_data._data;}size_t capacity(){return _buffer_data._size();}size_t rd(){return _buffer_data._rd;}char* rd_ptr(){return base() + _buffer_data._rd;}void set_rd(size_t rd_){_buffer_data._rd = rd_;}size_t wd(){return _buffer_data._wd;}char* wd_ptr(){return base() + _buffer_data._wd;}void set_wd(size_t wd_){_buffer_data._wd = wd_;}bool empty(){return _buffer_data._empty;}void set_empty(bool empty_){_buffer_data._empty = empty_;}};// ring托管类template<class _Buffer>class ring_buffer{private:_Buffer _buffer;public:ring_buffer(){}ring_buffer(const _Buffer& buffer):_buffer(buffer){}~ring_buffer(){}void assign(_Buffer&& buffer){_buffer = std::forward<_Buffer>(buffer);}// 写入内容size_t write(const char* value, size_t len){if (_buffer.wd() == _buffer.rd() && !_buffer.empty())return -1;if (_buffer.wd() > _buffer.rd() && _buffer.capacity() + 1 - _buffer.wd() < len && _buffer.capacity() + 1 - _buffer.wd() + _buffer.rd() <= len)return -1;else if (_buffer.wd() < _buffer.rd() && _buffer.rd() <= _buffer.wd() + len)return -1;if (_buffer.capacity() >= _buffer.wd() + len){memcpy(_buffer.wd_ptr(), value, len);_buffer.set_wd(_buffer.wd() + len);}else{size_t sublen = _buffer.capacity() - _buffer.wd();memcpy(_buffer.wd_ptr(), value, sublen);memcpy(_buffer.base(), value + sublen, len - sublen);_Buffer.set_wd(len - sublen);}if (_buffer.wd() == _buffer.rd())_buffer.set_empty(false);return len;}size_t write(const char* value){return write(value, strlen(value));}// 读取指定长度size_t read(const char* value, size_t len){if (_buffer.wd() == _buffer.rd() && _buffer.empty())return -1;else if (_buffer.wd() > _buffer.rd() && _buffer.wd() < len + _buffer.rd())return -1;else if (_buffer.capacity() - _buffer.rd() < len && _buffer.wd() + (_buffer.capacity() - _buffer.rd()) < len)return -1;if (_buffer.capacity() >= _buffer.rd() + len){memcpy(value, _buffer.rd_ptr(), len);_buffer.set_rd(_buffer.rd() + len);}else{size_t sublen = _buffer.capacity() - _buffer.rd();memcpy(value, _buffer.rd_ptr(), sublen);memcpy(value + sublen, _buffer.base(), len - sublen);_buffer.set_rd(len - sublen);}if (_buffer.wd() == _buffer.rd())_buffer.set_empty(true);return len;}// 读取全部size_t read(const char* value){if (_buffer.wd() == _buffer.rd() && _buffer.empty())return -1;size_t len = 0;if (_buffer.wd() > _buffer.rd()){memcpy(value, _buffer.rd_ptr(), _buffer.wd() - _buffer.rd());len = _buffer.wd() - _buffer.rd();}else{size_t sublen = _buffer.capacity() - _buffer.rd();memcpy(value, _buffer.rd_ptr(), sublen);memcpy(value + sublen, _buffer.base(), _buffer.wd());len = sublen + _buffer.wd();}_buffer.set_rd(_buffer.wd());_buffer.set_empty(true);return len;}};
解释:期望实现一个环形缓冲托管方法,可以托管任何buffer(主要用作共享内存,所以类型用了char)
除了托管上面的测试buff,还可以用在一些static_buffer上面。譬如:template<size_t size>class static_buffer{char _data[size];.....}。
规定了被托管对象一定要有的一些函数成员。
0 0
- 环缓冲托管实现
- 环缓冲模拟实现
- 如何实现双缓冲、vc双缓冲
- 如何实现双缓冲
- j2me实现双缓冲
- Linux循环缓冲实现
- 画图实现双缓冲
- 循环缓冲的实现
- 如何实现双缓冲
- MFC 双缓冲实现
- 画图实现双缓冲
- GDI+ 双缓冲实现
- GDI+ 双缓冲实现
- 如何实现双缓冲
- 如何实现双缓冲
- 模态框缓冲效果实现
- 操作GitHub实现代码托管
- GDI双缓冲实现与GDI+双缓冲实现
- iOS 7 present/dismiss自定义转场动画
- [leetcode] 37. Sudoku Solver 解题报告
- 深入剖析Yarn的源码(一) 协议签名
- iOS: TableView如何刷新指定的cell 或section
- 读书笔记 --《数学之美》_信息的度量和作用
- 环缓冲托管实现
- 好用的文本编缉主题
- 用sqoop导入大表的问题
- Android应用实现微信登录与分享
- 如何给UIViewController瘦身
- hive.Hadoop入门
- POJ 3126 Prime Path (换门牌)
- 前后端分离的一点实践
- 如何删除xshell端口转发规则