首先要说的是,该类在 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;
};
构造函数传入的参数对应的就是 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);
}
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
-