68 using NoForcingTag = comms::details::tag::Tag1<>;
70 using ParsedOptionsInternal = details::MsgDispatcherOptionsParser<TOptions...>;
74 ParsedOptionsInternal::HasForcedDispatch
76 typename ParsedOptionsInternal::ForcedDispatch,
80 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
81 static auto dispatchInternal(TMsgId&&
id, std::size_t idx, TMsg& msg, THandler& handler, NoForcingTag) ->
82 decltype(comms::dispatchMsg<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler))
84 return comms::dispatchMsg<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler);
87 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
88 static auto dispatchInternal(TMsgId&&
id, TMsg& msg, THandler& handler, NoForcingTag) ->
89 decltype(comms::dispatchMsg<TAllMessages>(std::forward<TMsgId>(
id), msg, handler))
91 return comms::dispatchMsg<TAllMessages>(std::forward<TMsgId>(
id), msg, handler);
94 template <
typename TAllMessages,
typename TMsg,
typename THandler>
95 static auto dispatchInternal(TMsg& msg, THandler& handler, NoForcingTag) ->
96 decltype(comms::dispatchMsg<TAllMessages>(msg, handler))
98 return comms::dispatchMsg<TAllMessages>(msg, handler);
101 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
103 decltype(comms::dispatchMsgPolymorphic<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler))
105 return comms::dispatchMsgPolymorphic<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler);
108 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
110 decltype(comms::dispatchMsgPolymorphic<TAllMessages>(std::forward<TMsgId>(
id), msg, handler))
112 return comms::dispatchMsgPolymorphic<TAllMessages>(std::forward<TMsgId>(
id), msg, handler);
115 template <
typename TAllMessages,
typename TMsg,
typename THandler>
117 decltype(comms::dispatchMsgPolymorphic<TAllMessages>(msg, handler))
119 return comms::dispatchMsgPolymorphic<TAllMessages>(msg, handler);
122 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
124 decltype(comms::dispatchMsgStaticBinSearch<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler))
126 return comms::dispatchMsgStaticBinSearch<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler);
129 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
131 decltype(comms::dispatchMsgStaticBinSearch<TAllMessages>(std::forward<TMsgId>(
id), msg, handler))
133 return comms::dispatchMsgStaticBinSearch<TAllMessages>(std::forward<TMsgId>(
id), msg, handler);
136 template <
typename TAllMessages,
typename TMsg,
typename THandler>
138 decltype(comms::dispatchMsgStaticBinSearch<TAllMessages>(msg, handler))
140 return comms::dispatchMsgStaticBinSearch<TAllMessages>(msg, handler);
143 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
145 decltype(comms::dispatchMsgLinearSwitch<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler))
147 return comms::dispatchMsgLinearSwitch<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler);
150 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
152 decltype(comms::dispatchMsgLinearSwitch<TAllMessages>(std::forward<TMsgId>(
id), msg, handler))
154 return comms::dispatchMsgLinearSwitch<TAllMessages>(std::forward<TMsgId>(
id), msg, handler);
157 template <
typename TAllMessages,
typename TMsg,
typename THandler>
159 decltype(comms::dispatchMsgLinearSwitch<TAllMessages>(msg, handler))
161 return comms::dispatchMsgLinearSwitch<TAllMessages>(msg, handler);
164 template <
typename TAllMessages>
165 static constexpr bool isDispatchPolymorphicInternal(NoForcingTag)
167 return comms::dispatchMsgTypeIsPolymorphic<TAllMessages>();
170 template <
typename TAllMessages,
typename TTag>
171 static constexpr bool isDispatchPolymorphicInternal(TTag)
173 static_assert(!std::is_same<TTag, NoForcingTag>::value,
"Invalid tag dispatch");
174 return std::is_same<TTag, comms::traits::dispatch::Polymorphic>::value;
177 template <
typename TAllMessages>
178 static constexpr bool isDispatchStaticBinSearchInternal(NoForcingTag)
180 return comms::dispatchMsgTypeIsStaticBinSearch<TAllMessages>();
183 template <
typename TAllMessages,
typename TTag>
184 static constexpr bool isDispatchStaticBinSearchInternal(TTag)
186 static_assert(!std::is_same<TTag, NoForcingTag>::value,
"Invalid tag dispatch");
187 return std::is_same<TTag, comms::traits::dispatch::StaticBinSearch>::value;
190 template <
typename TAllMessages>
191 static constexpr bool isDispatchLinearSwitchInternal(NoForcingTag)
196 template <
typename TAllMessages,
typename TTag>
197 static constexpr bool isDispatchLinearSwitchInternal(TTag)
199 static_assert(!std::is_same<TTag, NoForcingTag>::value,
"Invalid tag dispatch");
200 return std::is_same<TTag, comms::traits::dispatch::LinearSwitch>::value;
220 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
221 static auto dispatch(TMsgId&&
id, std::size_t idx, TMsg& msg, THandler& handler) ->
222 decltype(dispatchInternal<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler, Tag()))
224 return dispatchInternal<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler, Tag());
235 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
236 static auto dispatch(TMsgId&&
id, TMsg&& msg, THandler&& handler) ->
237 decltype(dispatchInternal<TAllMessages>(std::forward<TMsgId>(
id), msg, handler, Tag()))
239 return dispatchInternal<TAllMessages>(std::forward<TMsgId>(
id), msg, handler, Tag());
253 template <
typename TAllMessages,
typename TMsg,
typename THandler>
254 static auto dispatch(TMsg&& msg, THandler&& handler) ->
255 decltype(dispatchInternal<TAllMessages>(msg, handler, Tag()))
257 return dispatchInternal<TAllMessages>(msg, handler, Tag());
265 template <
typename TAllMessages>
268 return isDispatchPolymorphicInternal<TAllMessages>(Tag());
276 template <
typename TAllMessages>
279 return isDispatchStaticBinSearchInternal<TAllMessages>(Tag());
287 template <
typename TAllMessages>
290 return isDispatchLinearSwitchInternal<TAllMessages>(Tag());