10-10-2019, 05:44 PM
Sorry for the late reply, only now I noticed your post had another question in it.
The Buffer class can be pretty much substituted by a std::string - it has the append and erase operations, you just need to add a "read position" and possibly some helper functions to read individual data types. So something like this:
The Buffer class can be pretty much substituted by a std::string - it has the append and erase operations, you just need to add a "read position" and possibly some helper functions to read individual data types. So something like this:
class Buffer
{
public:
Buffer():
mReadPos(0)
{
}
void restartRead()
{
mReadPos = 0;
}
void append(const char * aData, size_t aSize)
{
mData.append(aData, aSize);
}
void erase(size_t aNumBytes)
{
mData.erase(0, aNumBytes);
if (mReadPos > aNumBytes)
{
mReadPos -= aNumBytes;
}
else
{
mReadPos = 0;
}
}
UInt8 readByte()
{
if (mReadPos + 1 >= mData.size())
{
// TODO: Not enough bytes in the buffer, throw exception?
}
return static_cast<UInt8>(mData[mReadPos++]);
}
UInt16 readShort()
{
if (mReadPos + 2 >= mData.size()
{
// TODO: Not enough bytes in the buffer, throw exception?
}
auto oldReadPos = mReadPos;
mReadPos += 2;
return static_cast<UInt16>((mData[oldReadPos] << 8) | mData[oldReadPos + 1];
}
...
private:
/** The bytes in the buffer, including those already read for the current packet. */
std::string mData;
/** The position in mData where the next Read operation will start. */
size_t mReadPos;
}

