#include #include #include #include #include #include #include #include #include #include #include enum class PacketID : std::uint8_t { KeepAlive = 0, MDC = 1 }; class PacketHandler; using PacketBase = sp::MessageBase; template using Message = sp::ConcreteMessage; struct KeepAlivePacket { sp::BitField one; sp::BitField two; std::shared_ptr test; }; struct MDCPacket { sp::BitField one; sp::BitField two; std::unique_ptr test; }; using KeepAliveMessage = Message; using MDCMessage = Message; using AllMessages = std::tuple; class PacketHandler : public sp::GenericHandler {}; class MyHandler : public PacketHandler { public: virtual void Handle(const KeepAliveMessage& msg) override { std::cout << "I recieved a keep alive : " << *msg->one << " : " << *msg->two << " : " << (msg->test ? *msg->test : "nullptr") << "\n"; } virtual void Handle(const MDCMessage& msg) override { std::cout << "I recieved a mdc : " << *msg->one << " : " << static_cast(*msg->two) << " : " << *msg->test << "\n"; } }; using PacketDispatcher = sp::MessageDispatcher; using PacketFactory = sp::MessageFactory; using PacketStream = sp::MessageStream; int main() { KeepAliveMessage m{69, 5, std::make_shared("I'm a keepalive")}; // dispatch tests MyHandler h; PacketDispatcher d; d.RegisterHandler(PacketID::KeepAlive, &h); d.RegisterHandler(PacketID::MDC, &h); d.Dispatch(m); PacketFactory f; auto message = f.CreateMessage(PacketID::KeepAlive); d.Dispatch(*message); // write tests auto compress = std::make_shared(); std::ofstream file{"test.bin"}; PacketStream p(std::make_shared(file)); p.WriteMessage(m); p.WriteMessage(MDCMessage{42, PacketID::MDC, std::make_unique("Coucou")}); file.flush(); std::ifstream file2{"test.bin"}; PacketStream p2(std::make_shared(file2)); auto message2 = p2.ReadMessage(); auto message3 = p2.ReadMessage(); d.Dispatch(*message2); d.Dispatch(*message3); // message->Write(file); // file << std::endl; // m.Write(file); // file << std::endl; // message->Read(file); return 0; }