#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, const TOption& a_Option); static DataBuffer Decapsulate(DataBuffer& a_Data, const TOption& a_Option); }; template class Stream { protected: MessageDispatcher m_Dispatcher; IOInterface m_Interface; std::tuple m_Options; using MessageBase = typename MessageDispatcher::MessageBaseType; public: Stream() {} Stream(IOInterface&& a_Interface, TOptions&&... a_Options); Stream(Stream&& a_Stream); void RecieveMessages(); void SendMessage(const MessageBase& a_Message); template TOption& GetOption() { return std::get(m_Options); } MessageDispatcher& GetDispatcher() { return m_Dispatcher; } private: static DataBuffer Encapsulate(const DataBuffer& a_Data, const TOptions&... a_Options); static DataBuffer Decapsulate(DataBuffer& a_Data, const TOptions&... a_Options); }; } // namespace io } // namespace sp #include