#pragma once #include #include #include #include "Write.hpp" namespace tw::net { template class BufferWriter : public Write { private: Write* m_writeable; std::vector m_buffer; uint32_t m_head; public: size_t remaining_size() { return m_buffer.size() - m_head; } BufferWriter(Write* writeable, size_t buffer_size) : m_writeable(writeable), m_buffer(buffer_size), m_head(0) { } virtual size_t write(std::span data) override { if(remaining_size() < data.size()) { size_t write_size = flush(); write_size += m_writeable->write_into(data); m_head = 0; return write_size; } std::copy(data.begin(), data.end(), m_buffer.begin() + m_head); size_t write_size = data.size(); m_head += data.size(); return write_size; } virtual size_t flush() override { m_writeable->write_into(std::span(m_buffer.begin(), m_buffer.begin() + m_head)); size_t write_size = m_head; m_head = 0; return write_size; } }; }