#pragma once #include #include #include #include #include namespace sp { template class MessageStream { protected: std::vector> m_Encapsulators; std::shared_ptr m_Stream; using MessageBaseType = typename TMessageFactory::MessageBaseType; using MessageIdType = typename MessageBaseType::MessageIdType; public: MessageStream(std::shared_ptr&& a_Stream) : m_Stream(std::move(a_Stream)) {} template MessageStream(std::shared_ptr&& a_Stream, TEnc&&... a_Encapsulators) : m_Stream(std::move(a_Stream)){ m_Encapsulators.reserve(sizeof...(a_Encapsulators)); AddEncapsulators(std::move(a_Encapsulators ...)); } std::unique_ptr ReadMessage(); std::unique_ptr ReadMessage(MessageIdType a_Id); void WriteMessage(const MessageBaseType& a_Message, bool a_WriteId = true); template void AddEncapsulators(Args&& ... a_Encapsulators) { AddEncapsulators(std::move(std::make_tuple<>(a_Encapsulators ...))); } template void AddEncapsulators(std::tuple&& a_Encapsulators) { TupleForEach([this](auto&& a_Encapsulator){ m_Encapsulators.push_back(std::move(a_Encapsulator)); }, a_Encapsulators); } private: DataBuffer ReadAndDecapsulate(); std::unique_ptr MakeMessage(DataBuffer& buffer, MessageIdType a_Id); }; } // namespace sp #include