65 using NoForcingTag = comms::details::tag::Tag1<>;
67 using ParsedOptionsInternal = details::MsgDispatcherOptionsParser<TOptions...>;
71 ParsedOptionsInternal::HasForcedDispatch
73 typename ParsedOptionsInternal::ForcedDispatch,
77 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
78 static auto dispatchInternal(TMsgId&&
id, std::size_t idx, TMsg& msg, THandler& handler, NoForcingTag) ->
79 decltype(comms::dispatchMsg<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler))
81 return comms::dispatchMsg<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler);
84 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
85 static auto dispatchInternal(TMsgId&&
id, TMsg& msg, THandler& handler, NoForcingTag) ->
86 decltype(comms::dispatchMsg<TAllMessages>(std::forward<TMsgId>(
id), msg, handler))
88 return comms::dispatchMsg<TAllMessages>(std::forward<TMsgId>(
id), msg, handler);
91 template <
typename TAllMessages,
typename TMsg,
typename THandler>
92 static auto dispatchInternal(TMsg& msg, THandler& handler, NoForcingTag) ->
93 decltype(comms::dispatchMsg<TAllMessages>(msg, handler))
95 return comms::dispatchMsg<TAllMessages>(msg, handler);
98 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
100 decltype(comms::dispatchMsgPolymorphic<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler))
102 return comms::dispatchMsgPolymorphic<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler);
105 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
107 decltype(comms::dispatchMsgPolymorphic<TAllMessages>(std::forward<TMsgId>(
id), msg, handler))
109 return comms::dispatchMsgPolymorphic<TAllMessages>(std::forward<TMsgId>(
id), msg, handler);
112 template <
typename TAllMessages,
typename TMsg,
typename THandler>
114 decltype(comms::dispatchMsgPolymorphic<TAllMessages>(msg, handler))
116 return comms::dispatchMsgPolymorphic<TAllMessages>(msg, handler);
119 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
121 decltype(comms::dispatchMsgStaticBinSearch<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler))
123 return comms::dispatchMsgStaticBinSearch<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler);
126 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
128 decltype(comms::dispatchMsgStaticBinSearch<TAllMessages>(std::forward<TMsgId>(
id), msg, handler))
130 return comms::dispatchMsgStaticBinSearch<TAllMessages>(std::forward<TMsgId>(
id), msg, handler);
133 template <
typename TAllMessages,
typename TMsg,
typename THandler>
135 decltype(comms::dispatchMsgStaticBinSearch<TAllMessages>(msg, handler))
137 return comms::dispatchMsgStaticBinSearch<TAllMessages>(msg, handler);
140 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
142 decltype(comms::dispatchMsgLinearSwitch<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler))
144 return comms::dispatchMsgLinearSwitch<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler);
147 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
149 decltype(comms::dispatchMsgLinearSwitch<TAllMessages>(std::forward<TMsgId>(
id), msg, handler))
151 return comms::dispatchMsgLinearSwitch<TAllMessages>(std::forward<TMsgId>(
id), msg, handler);
154 template <
typename TAllMessages,
typename TMsg,
typename THandler>
156 decltype(comms::dispatchMsgLinearSwitch<TAllMessages>(msg, handler))
158 return comms::dispatchMsgLinearSwitch<TAllMessages>(msg, handler);
161 template <
typename TAllMessages>
162 static constexpr bool isDispatchPolymorphicInternal(NoForcingTag)
164 return comms::dispatchMsgTypeIsPolymorphic<TAllMessages>();
167 template <
typename TAllMessages,
typename TTag>
168 static constexpr bool isDispatchPolymorphicInternal(TTag)
170 static_assert(!std::is_same<TTag, NoForcingTag>::value,
"Invalid tag dispatch");
171 return std::is_same<TTag, comms::traits::dispatch::Polymorphic>::value;
174 template <
typename TAllMessages>
175 static constexpr bool isDispatchStaticBinSearchInternal(NoForcingTag)
177 return comms::dispatchMsgTypeIsStaticBinSearch<TAllMessages>();
180 template <
typename TAllMessages,
typename TTag>
181 static constexpr bool isDispatchStaticBinSearchInternal(TTag)
183 static_assert(!std::is_same<TTag, NoForcingTag>::value,
"Invalid tag dispatch");
184 return std::is_same<TTag, comms::traits::dispatch::StaticBinSearch>::value;
187 template <
typename TAllMessages>
188 static constexpr bool isDispatchLinearSwitchInternal(NoForcingTag)
193 template <
typename TAllMessages,
typename TTag>
194 static constexpr bool isDispatchLinearSwitchInternal(TTag)
196 static_assert(!std::is_same<TTag, NoForcingTag>::value,
"Invalid tag dispatch");
197 return std::is_same<TTag, comms::traits::dispatch::LinearSwitch>::value;
217 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
218 static auto dispatch(TMsgId&&
id, std::size_t idx, TMsg& msg, THandler& handler) ->
219 decltype(dispatchInternal<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler, Tag()))
221 return dispatchInternal<TAllMessages>(std::forward<TMsgId>(
id), idx, msg, handler, Tag());
232 template <
typename TAllMessages,
typename TMsgId,
typename TMsg,
typename THandler>
233 static auto dispatch(TMsgId&&
id, TMsg&& msg, THandler&& handler) ->
234 decltype(dispatchInternal<TAllMessages>(std::forward<TMsgId>(
id), msg, handler, Tag()))
236 return dispatchInternal<TAllMessages>(std::forward<TMsgId>(
id), msg, handler, Tag());
250 template <
typename TAllMessages,
typename TMsg,
typename THandler>
251 static auto dispatch(TMsg&& msg, THandler&& handler) ->
252 decltype(dispatchInternal<TAllMessages>(msg, handler, Tag()))
254 return dispatchInternal<TAllMessages>(msg, handler, Tag());
262 template <
typename TAllMessages>
265 return isDispatchPolymorphicInternal<TAllMessages>(Tag());
273 template <
typename TAllMessages>
276 return isDispatchStaticBinSearchInternal<TAllMessages>(Tag());
284 template <
typename TAllMessages>
287 return isDispatchLinearSwitchInternal<TAllMessages>(Tag());