#pragma once #include #include namespace sp { namespace io { template class IOInterface { public: DataBuffer Read(std::size_t a_Amount); void Write(const DataBuffer& a_Data); }; template class MessageEncapsulator { public: static DataBuffer Encapsulate(const DataBuffer& a_Data); static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length); }; template class Stream { protected: MessageDispatcher m_Dispatcher; IOInterface m_Interface; using MessageBase = typename MessageDispatcher::MessageBaseType; public: Stream() {} Stream(IOInterface&& a_Interface); Stream(Stream&& a_Stream); void RecieveMessages(); void SendMessage(const MessageBase& a_Message); MessageDispatcher& GetDispatcher() { return m_Dispatcher; } private: static DataBuffer Encapsulate(const DataBuffer& a_Data); static DataBuffer Decapsulate(DataBuffer& a_Data, std::size_t a_Length); }; } // namespace io } // namespace sp #include