#pragma once #include #include #include namespace sp { class Handler; class Message { public: virtual ~Message() {} void Write(DataBuffer& buffer) const { buffer << GetId(); WriteImpl(buffer); } void Read(const DataBuffer& buffer) { ReadImpl(buffer); } void Dispatch(Handler& handler) { DispatchImpl(handler); } virtual int GetId() const = 0; virtual std::string_view GetName() const = 0; protected: virtual void DispatchImpl(Handler& handler) = 0; virtual void WriteImpl(DataBuffer& buffer) const = 0; virtual void ReadImpl(const DataBuffer& buffer) = 0; }; } // namespace sp