From 143b2f357c5c08fd1ffb7c3ae790085558fcf8f5 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Fri, 18 Jul 2025 16:45:27 +0200 Subject: [PATCH] use generic handler --- include/sp/protocol/ConcreteMessage.h | 16 ++++ include/sp/protocol/MessageHandler.h | 133 -------------------------- test/test_message.cpp | 24 ++--- 3 files changed, 28 insertions(+), 145 deletions(-) delete mode 100644 include/sp/protocol/MessageHandler.h diff --git a/include/sp/protocol/ConcreteMessage.h b/include/sp/protocol/ConcreteMessage.h index f9cf5a7..5ba43cc 100644 --- a/include/sp/protocol/ConcreteMessage.h +++ b/include/sp/protocol/ConcreteMessage.h @@ -33,6 +33,22 @@ class ConcreteMessage : public MessageBase { return details::WriteMessage(m_Data); } + DataType* operator*() { + return &m_Data; + } + + DataType* operator->() { + return &m_Data; + } + + const DataType* operator*() const { + return &m_Data; + } + + const DataType* operator->() const { + return &m_Data; + } + private: DataType m_Data; }; diff --git a/include/sp/protocol/MessageHandler.h b/include/sp/protocol/MessageHandler.h deleted file mode 100644 index b8d4ee7..0000000 --- a/include/sp/protocol/MessageHandler.h +++ /dev/null @@ -1,133 +0,0 @@ -#pragma once - -#include - -namespace sp -{ - // This class is inspired by https://arobenko.gitbooks.io/comms-protocols-cpp/content/ - - // TAll is all the message types, that need to be handled, bundled in std::tuple - template - class MessageHandler; - - // Big boy to process packets 20 by 20, preventing needlessly copying vtable many times at each inheritance stage - template - class MessageHandler > : public MessageHandler > - { - using Base = MessageHandler >; - public: - using Base::Handle; // Don't hide all Handle() functions from base classes - virtual void Handle(const typename T1::DataType& msg) {} - virtual void Handle(const typename T2::DataType& msg) {} - virtual void Handle(const typename T3::DataType& msg) {} - virtual void Handle(const typename T4::DataType& msg) {} - virtual void Handle(const typename T5::DataType& msg) {} - virtual void Handle(const typename T6::DataType& msg) {} - virtual void Handle(const typename T7::DataType& msg) {} - virtual void Handle(const typename T8::DataType& msg) {} - virtual void Handle(const typename T9::DataType& msg) {} - virtual void Handle(const typename T10::DataType& msg) {} - virtual void Handle(const typename T11::DataType& msg) {} - virtual void Handle(const typename T12::DataType& msg) {} - virtual void Handle(const typename T13::DataType& msg) {} - virtual void Handle(const typename T14::DataType& msg) {} - virtual void Handle(const typename T15::DataType& msg) {} - virtual void Handle(const typename T16::DataType& msg) {} - virtual void Handle(const typename T17::DataType& msg) {} - virtual void Handle(const typename T18::DataType& msg) {} - virtual void Handle(const typename T19::DataType& msg) {} - virtual void Handle(const typename T20::DataType& msg) {} - }; - - // 10 by 10 - template - class MessageHandler > : public MessageHandler > - { - using Base = MessageHandler >; - public: - using Base::Handle; // Don't hide all Handle() functions from base classes - virtual void Handle(const typename T1::DataType& msg) {} - virtual void Handle(const typename T2::DataType& msg) {} - virtual void Handle(const typename T3::DataType& msg) {} - virtual void Handle(const typename T4::DataType& msg) {} - virtual void Handle(const typename T5::DataType& msg) {} - virtual void Handle(const typename T6::DataType& msg) {} - virtual void Handle(const typename T7::DataType& msg) {} - virtual void Handle(const typename T8::DataType& msg) {} - virtual void Handle(const typename T9::DataType& msg) {} - virtual void Handle(const typename T10::DataType& msg) {} - }; - - // 5 by 5 - template < - typename T1, typename T2, typename T3, typename T4, typename T5, - typename... TRest> - class MessageHandler > : public MessageHandler > - { - using Base = MessageHandler >; - public: - using Base::Handle; // Don't hide all Handle() functions from base classes - virtual void Handle(const typename T1::DataType& msg) {} - virtual void Handle(const typename T2::DataType& msg) {} - virtual void Handle(const typename T3::DataType& msg) {} - virtual void Handle(const typename T4::DataType& msg) {} - virtual void Handle(const typename T5::DataType& msg) {} - }; - - // Deal with rest with 4 types - template - class MessageHandler > - { - public: - virtual ~MessageHandler() {} - virtual void Handle(const typename T1::DataType& msg) {} - virtual void Handle(const typename T2::DataType& msg) {} - virtual void Handle(const typename T3::DataType& msg) {} - virtual void Handle(const typename T4::DataType& msg) {} - }; - - // Deal with rest with 3 types - template < typename T1, typename T2, typename T3> - class MessageHandler > - { - public: - virtual ~MessageHandler() {} - virtual void Handle(const typename T1::DataType& msg) {} - virtual void Handle(const typename T2::DataType& msg) {} - virtual void Handle(const typename T3::DataType& msg) {} - }; - - // Deal with rest with 2 types - template - class MessageHandler > - { - public: - virtual ~MessageHandler() {} - virtual void Handle(const typename T1::DataType& msg) {} - virtual void Handle(const typename T2::DataType& msg) {} - }; - - // Deal with rest with 1 type - template - class MessageHandler > - { - public: - virtual ~MessageHandler() {} - virtual void Handle(const typename T1::DataType& msg) {} - }; - - // Deal with rest with 0 type - template <> - class MessageHandler > - { - public: - virtual ~MessageHandler() {} - }; - -} // sp \ No newline at end of file diff --git a/test/test_message.cpp b/test/test_message.cpp index 7602ceb..b958f1a 100644 --- a/test/test_message.cpp +++ b/test/test_message.cpp @@ -1,16 +1,16 @@ -#include -#include -#include -#include +#include #include #include #include +#include +#include +#include #include #include -#include #include +#include enum class PacketID { KeepAlive = 0 }; @@ -30,12 +30,12 @@ using KeepAliveMessage = Message; using AllMessages = std::tuple; -class PacketHandler : public sp::MessageHandler {}; +class PacketHandler : public sp::GenericHandler {}; class MyHandler : public PacketHandler { public: - virtual void Handle(const KeepAlivePacket& msg) { - std::cout << "I recieved a keep alive : " << *msg.one << " : " << *msg.two << "\n"; + virtual void Handle(const KeepAliveMessage& msg) override { + std::cout << "I recieved a keep alive : " << *msg->one << " : " << *msg->two << "\n"; } }; @@ -64,17 +64,17 @@ int main() { auto compress = std::make_shared(); - std::ofstream file {"test.bin"}; + std::ofstream file{"test.bin"}; - PacketStream p(std::make_shared(file), compress); + PacketStream p(std::make_shared(file)); p.WriteMessage(m); file.flush(); - std::ifstream file2 {"test.bin"}; + std::ifstream file2{"test.bin"}; - PacketStream p2(std::make_shared(file2), compress); + PacketStream p2(std::make_shared(file2)); auto message2 = p2.ReadMessage();