OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片
OpenRTMFP/Cumulus Primer(13)IO管理之局部内存片- Author: 柳大Poechant(钟超)
- Email: zhongchao.ustc#gmail.com (#->@)
- Blog:?Blog.CSDN.net/Poechant
- Date: April 24th, 2012
首先要说的是,该类在 OpenRTMFP/Cumulus 中目前还没有用到 :( 所以您可以关闭您浏览器当前标签,以免浪费时间 :)
在《OpenRTMFP/Cumulus Primer(10)IO 管理之流缓冲区》一文中介绍的 MemoryStreamBuf 时,其中有一个名为 ScopedMemoryClip 的友元,它就是本文所要介绍的
首先,最重要的是,ScopedMemoryClip 中有一个 MemoryStreamBuf 成员。
class ScopedMemoryClip {public: ScopedMemoryClip(MemoryStreamBuf& buffer,Poco::UInt32 offset); ~ScopedMemoryClip();private: void clip(Poco::Int32 offset); Poco::UInt32 _offset; MemoryStreamBuf& _buffer;};
1 构造函数
构造函数传入的参数对应的就是 ScopedMemoryClip 的两个成员值。其中偏移量不能超过 MemoryStremamBuf 的缓冲区上线值。
ScopedMemoryClip::ScopedMemoryClip(MemoryStreamBuf& buffer, UInt32 offset) : _offset(offset), _buffer(buffer) { if (_offset >= _buffer._bufferSize) _offset = _buffer._bufferSize - 1; if (_offset < 0) _offset = 0; clip(_offset);}
2 析构函数ScopedMemoryClip::~ScopedMemoryClip() { clip(-(Int32)_offset);}
3 缓冲区切割
可以看到构造函数和析构函数中都调用了 clip 函数,该函数切割完缓冲区,形成局部内存片:
- 如果传入的偏移量参数为正,则仅保留切割之后的后一部分。
- 如果传入的参数为负,则相当于向前扩充缓冲区。(只发生于析构函数中)
其源码如下。
void ScopedMemoryClip::clip(Int32 offset) { // 获取到 gptr char* gpos = _buffer.gCurrent(); // 偏移缓冲区地址,并修改缓冲区大小 _buffer._pBuffer += offset; _buffer._bufferSize -= offset; // pptr 的位置减去缓冲区新地址,作为 pptr 的新位置 int ppos = _buffer.pCurrent() - _buffer._pBuffer; // 设置 gptr 可达区域和位置 _buffer.setg(_buffer._pBuffer, gpos, _buffer._pBuffer + _buffer._bufferSize); // 设置 pptr 可达区域和位置 _buffer.setp(_buffer._pBuffer, _buffer._pBuffer + _buffer._bufferSize); _buffer.pbump(ppos); // 如果已写数据数小于偏移量,则可以将已写数据数设置为零 if (_buffer._written < offset) _buffer._written = 0; // 如果已写数据数大于等于偏移量,则减去 offset else _buffer._written -= offset; // 若已写字节数大于缓冲区容量,则设定为缓冲区容量 if (_buffer._written > _buffer._bufferSize) _buffer._written = _buffer._bufferSize;}
-
转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant
-
首先要说的是,该类在 OpenRTMFP/Cumulus 中目前还没有用到 :( 所以您可以关闭您浏览器当前标签,以免浪费时间 :)
在《OpenRTMFP/Cumulus Primer(10)IO 管理之流缓冲区》一文中介绍的 MemoryStreamBuf 时,其中有一个名为 ScopedMemoryClip 的友元,它就是本文所要介绍的
首先,最重要的是,ScopedMemoryClip 中有一个 MemoryStreamBuf 成员。
class ScopedMemoryClip {public: ScopedMemoryClip(MemoryStreamBuf& buffer,Poco::UInt32 offset); ~ScopedMemoryClip();private: void clip(Poco::Int32 offset); Poco::UInt32 _offset; MemoryStreamBuf& _buffer;};
1 构造函数
构造函数传入的参数对应的就是 ScopedMemoryClip 的两个成员值。其中偏移量不能超过 MemoryStremamBuf 的缓冲区上线值。
ScopedMemoryClip::ScopedMemoryClip(MemoryStreamBuf& buffer, UInt32 offset) : _offset(offset), _buffer(buffer) { if (_offset >= _buffer._bufferSize) _offset = _buffer._bufferSize - 1; if (_offset < 0) _offset = 0; clip(_offset);}
2 析构函数ScopedMemoryClip::~ScopedMemoryClip() { clip(-(Int32)_offset);}
3 缓冲区切割
ScopedMemoryClip::~ScopedMemoryClip() { clip(-(Int32)_offset);}
可以看到构造函数和析构函数中都调用了 clip 函数,该函数切割完缓冲区,形成局部内存片:
- 如果传入的偏移量参数为正,则仅保留切割之后的后一部分。
- 如果传入的参数为负,则相当于向前扩充缓冲区。(只发生于析构函数中)
其源码如下。
void ScopedMemoryClip::clip(Int32 offset) { // 获取到 gptr char* gpos = _buffer.gCurrent(); // 偏移缓冲区地址,并修改缓冲区大小 _buffer._pBuffer += offset; _buffer._bufferSize -= offset; // pptr 的位置减去缓冲区新地址,作为 pptr 的新位置 int ppos = _buffer.pCurrent() - _buffer._pBuffer; // 设置 gptr 可达区域和位置 _buffer.setg(_buffer._pBuffer, gpos, _buffer._pBuffer + _buffer._bufferSize); // 设置 pptr 可达区域和位置 _buffer.setp(_buffer._pBuffer, _buffer._pBuffer + _buffer._bufferSize); _buffer.pbump(ppos); // 如果已写数据数小于偏移量,则可以将已写数据数设置为零 if (_buffer._written < offset) _buffer._written = 0; // 如果已写数据数大于等于偏移量,则减去 offset else _buffer._written -= offset; // 若已写字节数大于缓冲区容量,则设定为缓冲区容量 if (_buffer._written > _buffer._bufferSize) _buffer._written = _buffer._bufferSize;}
-
转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant
-