1 #ifndef MSP_NET_RECEIVER_H_
2 #define MSP_NET_RECEIVER_H_
5 #include <msp/core/algorithm.h>
6 #include <msp/core/maputils.h>
7 #include <msp/core/variant.h>
8 #include "mspnet_api.h"
13 class MSPNET_API ReceiverBase
16 ReceiverBase() = default;
18 virtual ~ReceiverBase() = default;
23 class PacketReceiver: public virtual ReceiverBase
26 PacketReceiver() = default;
28 virtual void receive(const P &) = 0;
32 class MSPNET_API DynamicReceiver: public ReceiverBase
35 DynamicReceiver() = default;
37 virtual void receive(unsigned, const Variant &) = 0;
41 class MSPNET_API DynamicDispatcher: public DynamicReceiver
44 using DispatchFunc = void(ReceiverBase &, const Variant &);
49 ReceiverBase *receiver;
52 Target(unsigned i, ReceiverBase &r, DispatchFunc *f): packet_id(i), receiver(&r), func(f) { }
55 std::vector<Target> targets;
59 void add_receiver(unsigned, PacketReceiver<P> &);
61 void receive(unsigned, const Variant &) override;
66 void DynamicDispatcher::add_receiver(unsigned packet_id, PacketReceiver<P> &r)
68 auto i = lower_bound_member(targets, packet_id, &Target::packet_id);
69 if(i!=targets.end() && i->packet_id==packet_id)
70 throw key_error(packet_id);
72 auto dispatch = [](ReceiverBase &receiver, const Variant &packet){
73 dynamic_cast<PacketReceiver<P> &>(receiver).receive(packet.value<P>());
76 targets.emplace(i, packet_id, r, +dispatch);