#pragma once #include "ByteBuffer.hpp" namespace tw::net { template struct ByteBufferCodec { static T bytes(RingByteBuffer&, size_t) { static_assert(sizeof(T) == 0, "No decoder for this type"); } }; /** * Default implementation for trivially copyable types */ template struct ByteBufferCodec>> { static std::optional encoding(RingByteBuffer& buf, size_t offset = 0) { T value; size_t r = buf.peek_bytes(&value, sizeof(T), offset); if(r < sizeof(T)) { return {}; } return value; } }; struct ByteBufferDecoder { ByteBufferDecoder(RingByteBuffer& buf) : m_buf(buf) {} template std::optional pop(size_t offset = 0) { std::optional s = ByteBufferCodec::bytes(m_buf, offset); m_buf.skip(sizeof(T)); return s; } template std::optional peek(size_t offset = 0) { return ByteBufferCodec::bytes(m_buf, offset); } private: RingByteBuffer& m_buf; }; }