From 59bedd648278728e71e978a3fc33f13da377de8d Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 26 Jun 2025 16:02:18 +0200 Subject: [PATCH] read/write for basic types --- .gitignore | 4 ++- include/sp/protocol/ConcreteMessage.h | 12 ++++++++- include/sp/protocol/MessageBase.h | 5 ++++ include/sp/protocol/MessageIO.h | 38 +++++++++++++++++++++++++++ test/test_message.cpp | 18 ++++++++++++- xmake.lua | 2 ++ 6 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 include/sp/protocol/MessageIO.h diff --git a/.gitignore b/.gitignore index fb11540..c1251e7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ build/ .DS_Store -.vscode \ No newline at end of file +.vscode + +*.bin \ No newline at end of file diff --git a/include/sp/protocol/ConcreteMessage.h b/include/sp/protocol/ConcreteMessage.h index 78bc34a..2a0da69 100644 --- a/include/sp/protocol/ConcreteMessage.h +++ b/include/sp/protocol/ConcreteMessage.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace sp { @@ -8,6 +9,7 @@ template class ConcreteMessage : public MessageBase { public: using DataType = TData; + using ThisType = ConcreteMessage; template ConcreteMessage(const T&... args) : m_Data{args...} {} @@ -19,7 +21,15 @@ class ConcreteMessage : public MessageBase { } virtual void Dispatch(THandler& handler) const override { - handler.Handle(static_cast&>(*this)); + handler.Handle(static_cast(*this)); + } + + virtual void Read(std::istream& a_Is) override { + details::ReadMessage(a_Is, m_Data); + } + + virtual void Write(std::ostream& a_Os) const override { + details::WriteMessage(a_Os, m_Data); } private: diff --git a/include/sp/protocol/MessageBase.h b/include/sp/protocol/MessageBase.h index 5fd2441..ba3e10b 100644 --- a/include/sp/protocol/MessageBase.h +++ b/include/sp/protocol/MessageBase.h @@ -1,5 +1,7 @@ #pragma once +#include + namespace sp { template @@ -14,6 +16,9 @@ class MessageBase { virtual MessageIdType GetId() const = 0; virtual void Dispatch(HandlerType& handler) const = 0; + + virtual void Read(std::istream& a_Is) = 0; + virtual void Write(std::ostream& a_Os) const = 0; }; } // namespace sp diff --git a/include/sp/protocol/MessageIO.h b/include/sp/protocol/MessageIO.h new file mode 100644 index 0000000..d3661f5 --- /dev/null +++ b/include/sp/protocol/MessageIO.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include + +namespace sp { +namespace details { + +template +void WriteField(std::ostream& a_Os, const T& a_Data) { + T swapped = a_Data; + ToNetwork(swapped); + a_Os.write(reinterpret_cast(&swapped), sizeof(a_Data)); +} + +template +void ReadField(std::istream& a_Is, T& a_Data) { + a_Is.read(reinterpret_cast(&a_Data), sizeof(a_Data)); + FromNetwork(a_Data); +} + +template +void WriteMessage(std::ostream& a_Os, const TData& a_MessageData) { + boost::pfr::for_each_field(a_MessageData, [&a_Os](const auto& a_Field) { + WriteField(a_Os, a_Field); + }); +} + +template +void ReadMessage(std::istream& a_Is, TData& a_MessageData) { + boost::pfr::for_each_field(a_MessageData, [&a_Is](auto& a_Field) { + ReadField(a_Is, a_Field); + }); +} + +} // namespace details +} // namespace sp diff --git a/test/test_message.cpp b/test/test_message.cpp index f135d7b..5842e70 100644 --- a/test/test_message.cpp +++ b/test/test_message.cpp @@ -5,8 +5,9 @@ #include #include +#include -enum class PacketID { KeepAlive = 0}; +enum class PacketID { KeepAlive = 0 }; class PacketHandler; @@ -38,6 +39,9 @@ using PacketFactory = sp::MessageFactory; int main() { KeepAliveMessage m{5UL}; + + // dispatch tests + MyHandler h; PacketDispatcher d; d.RegisterHandler(PacketID::KeepAlive, &h); @@ -45,5 +49,17 @@ int main() { PacketFactory f; auto message = f.CreateMessage(PacketID::KeepAlive); d.Dispatch(*message); + + + + // write tests + + std::ofstream file {"test.bin"}; + + message->Write(file); + // file << std::endl; + m.Write(file); + // file << std::endl; + // message->Read(file); return 0; } \ No newline at end of file diff --git a/xmake.lua b/xmake.lua index 1a9d65c..e925610 100644 --- a/xmake.lua +++ b/xmake.lua @@ -106,6 +106,8 @@ for _, file in ipairs(os.files("test/**.cpp")) do add_files(file) add_includedirs("include") + set_rundir(".") + add_deps("SimpleProtocol") add_tests("compile_and_run")