profuse/Endian/IOBuffer.cpp.h

103 lines
2.4 KiB
C++

class IOBuffer {
public:
IOBuffer(void *vp, unsigned size)
{
_buffer = vp;
_size = size;
_offset = 0;
}
void write8(uint8_t value)
{
Write8(_buffer, _offset, value);
_offset += 1;
}
void write16(uint16_t value)
{
Write16(_buffer, _offset, value);
_offset += 2;
}
void write24(uint32_t value)
{
Write24(_buffer, _offset, value);
_offset += 3;
}
void write32(uint32_t value)
{
Write32(_buffer, _offset, value);
_offset += 4;
}
void writeBytes(const void *src, unsigned count)
{
std::memcpy(_offset + (uint8_t *)_buffer, src, count);
_offset += count;
}
void writeZero(unsigned count)
{
std::memset(_offset + (uint8_t *)_buffer, 0, count);
_offset += count;
}
uint8_t read8()
{
uint8_t x = Read8(_buffer, _offset);
_offset += 1;
return x;
}
uint16_t read16()
{
uint16_t x = Read16(_buffer, _offset);
_offset += 2;
return x;
}
uint32_t read24()
{
uint32_t x = Read24(_buffer, _offset);
_offset += 3;
return x;
}
uint32_t read32()
{
uint32_t x = Read32(_buffer, _offset);
_offset += 4;
return x;
}
void readBytes(void *dest, unsigned count)
{
std::memcpy(dest, _offset + (uint8_t *)_buffer, count);
_offset += count;
}
unsigned offset() const { return _offset; }
void setOffset(unsigned offset) { _offset = offset; }
void setOffset(unsigned offset, bool zero)
{
if (zero && offset > _offset)
{
writeZero(offset - _offset);
}
else setOffset(offset);
}
unsigned size() const { return _size; }
void *buffer() const { return _buffer; }
private:
void *_buffer;
unsigned _size;
unsigned _offset;
};