#pragma once #include "IBinaryStream.h" template> class CBufferWrapper_impl : public IBinaryStream { public: CBufferWrapper_impl() = delete; CBufferWrapper_impl(Container& cont) : m_buffer(cont) {} void RawWrite(const void* data, size_t size) override { //10 size //15 data size //seek 5 //would be end at 20 //10 written //5 + 15 = 20 //end = 5 + 15 if(m_seek >= m_buffer.size() || (m_seek + size) > m_buffer.size()) { m_buffer.resize(m_seek + size); } memcpy(&m_buffer[m_seek], data, size); if (m_movingSeek) { m_seek += size; } } void RawRead(void* data, size_t size) override { //seek = 1 //bufsize = 33 //size = 32 //seek + size = 33 if(m_seek >= m_buffer.size() || (m_seek + size) > m_buffer.size()) { return; } memcpy(data, &m_buffer[m_seek], size); if (m_movingSeek) { m_seek += size; } } bool is_eof() override { return m_seek >= m_buffer.size(); } void SetSeek(size_t seek) { m_seek = seek; } size_t GetSeek() { return m_seek; } size_t GetSize() { return m_buffer.size(); } void SetAutoSeek(bool enable = true) { m_movingSeek = enable; } bool GetAutoSeek() { return m_movingSeek; } Container& GetBuffer() { return m_buffer; } private: size_t m_seek = 0; bool m_movingSeek = true; Container& m_buffer; }; using CBufferWrapper = CBufferWrapper_impl>;