#include <Core/Core.h> namespace Upp { struct AMessage { virtual void Serialize(Stream& s) = 0; virtual ~AMessage() {} }; typedef Function< void (One<AMessage>&) > MessageMake; VectorMap<int, MessageMake> message_maker; template <class T> void RegisterMessage(int messageid) { message_maker.Add(messageid, [](One<AMessage>& m) { m.Create<T>(); }); } // ============================= // Messages definition // ============================= struct TemperatureMessage : AMessage { double altitude, temperature; virtual void Serialize(Stream& s) { s % altitude % temperature; } }; struct WarningMessage : AMessage { String text; virtual void Serialize(Stream& s) { s % text; } }; // ============================= // Message registeration // ============================= INITBLOCK { RegisterMessage<TemperatureMessage>(1); // do that for all of your messages RegisterMessage<WarningMessage>(2); // do that for all of your messages }; void ProcessRequest(const String& data) { StringStream ss(data); // error handling for now omitted int client_id = ss.Get32(); int message_id = ss.Get32(); One<AMessage> m; int q = message_maker.Find(message_id); if(q < 0) return; (message_maker[q])(m); // create the required concrete message ss % *m; // load data to struct } } using namespace Upp; CONSOLE_APP_MAIN { }
Report message to a moderator