class MSPNET_API Protocol
{
+public:
+ struct PacketHeader
+ {
+ std::uint16_t type = 0;
+ std::uint16_t length = 0;
+
+ PacketHeader() = default;
+ PacketHeader(std::uint16_t, std::uint16_t);
+ };
+
private:
template<typename T, std::uint8_t K>
struct BasicTraits;
auto fields(T1 P::*first, T2 P::*second, Rest P::*...rest) { return fields(first).fields(second, rest...); }
};
- struct PacketHeader
- {
- std::uint16_t type = 0;
- std::uint16_t length = 0;
-
- PacketHeader() = default;
- PacketHeader(std::uint16_t, std::uint16_t);
- };
-
PacketTypeDef<PacketHeader> header_def;
unsigned next_packet_id;
std::map<unsigned, std::unique_ptr<PacketDefBase>> packet_class_defs;
const PacketTypeDef<P> &get_packet_by_class() const;
public:
+ template<typename P>
+ bool has_packet() const { return packet_class_defs.count(get_packet_class_id<P>()); }
+
+ template<typename P>
+ unsigned get_packet_id() const { return get_item(packet_class_defs, get_packet_class_id<P>())->get_id(); }
+
+ unsigned get_max_packet_id() const;
+
template<typename P>
std::size_t serialize(const P &, char *, std::size_t, unsigned = 0) const;
+ bool get_packet_header(PacketHeader &, const char *, std::size_t) const;
std::size_t get_packet_size(const char *, std::size_t) const;
std::size_t dispatch(ReceiverBase &, const char *, std::size_t, unsigned = 0) const;