15#include "comms/details/tag.h"
50template <
typename TDefault,
typename TAll,
typename TRetType =
void>
54 "TAll must be std::tuple");
56#ifdef FOR_DOXYGEN_DOC_ONLY
63 virtual TRetType
handle(TDefault& msg);
91class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TRest...>, TRetType>
94 using BaseImpl =
GenericHandler<TDefault, std::tuple<TRest...>, TRetType>;
97 using BaseImpl::handle;
98 virtual TRetType
handle(T1& msg)
100 static_assert(std::is_base_of<TDefault, T1>::value,
101 "TDefault must be base class for every element in TAll");
103 return this->
handle(
static_cast<TDefault&
>(msg));
106 virtual TRetType
handle(T2& msg)
108 static_assert(std::is_base_of<TDefault, T2>::value,
109 "TDefault must be base class for every element in TAll");
111 return this->
handle(
static_cast<TDefault&
>(msg));
114 virtual TRetType
handle(T3& msg)
116 static_assert(std::is_base_of<TDefault, T3>::value,
117 "TDefault must be base class for every element in TAll");
119 return this->
handle(
static_cast<TDefault&
>(msg));
122 virtual TRetType
handle(T4& msg)
124 static_assert(std::is_base_of<TDefault, T4>::value,
125 "TDefault must be base class for every element in TAll");
127 return this->
handle(
static_cast<TDefault&
>(msg));
130 virtual TRetType
handle(T5& msg)
132 static_assert(std::is_base_of<TDefault, T5>::value,
133 "TDefault must be base class for every element in TAll");
135 return this->
handle(
static_cast<TDefault&
>(msg));
138 virtual TRetType
handle(T6& msg)
140 static_assert(std::is_base_of<TDefault, T6>::value,
141 "TDefault must be base class for every element in TAll");
143 return this->
handle(
static_cast<TDefault&
>(msg));
146 virtual TRetType
handle(T7& msg)
148 static_assert(std::is_base_of<TDefault, T7>::value,
149 "TDefault must be base class for every element in TAll");
151 return this->
handle(
static_cast<TDefault&
>(msg));
154 virtual TRetType
handle(T8& msg)
156 static_assert(std::is_base_of<TDefault, T8>::value,
157 "TDefault must be base class for every element in TAll");
159 return this->
handle(
static_cast<TDefault&
>(msg));
162 virtual TRetType
handle(T9& msg)
164 static_assert(std::is_base_of<TDefault, T9>::value,
165 "TDefault must be base class for every element in TAll");
167 return this->
handle(
static_cast<TDefault&
>(msg));
170 virtual TRetType
handle(T10& msg)
172 static_assert(std::is_base_of<TDefault, T10>::value,
173 "TDefault must be base class for every element in TAll");
175 return this->
handle(
static_cast<TDefault&
>(msg));
185template <
typename TDefault,
typename TRetType>
186class GenericHandlerBase
189 using RetType = TRetType;
191 virtual TRetType handle(TDefault& msg)
194 static_cast<void>(msg);
197 typename comms::util::LazyShallowConditional<
198 std::is_void<TRetType>::value
201 RetValueShallowCondWrap
204 return defaultHandle(Tag());
208 template <
typename... TParams>
209 using VoidReturnTag = comms::details::tag::Tag1<>;
211 template <
typename... TParams>
212 using ReferenceReturnTag = comms::details::tag::Tag2<>;
214 template <
typename... TParams>
215 using ValueReturnTag = comms::details::tag::Tag3<>;
217 template <
typename... TParams>
218 using RetValueShallowCondWrap =
219 typename comms::util::LazyShallowConditional<
220 std::is_lvalue_reference<TRetType>::value
227 template <
typename... TParams>
228 void defaultHandle(VoidReturnTag<TParams...>)
232 template <
typename... TParams>
233 TRetType defaultHandle(ReferenceReturnTag<TParams...>)
235 static typename std::decay<TRetType>::type Value;
239 template <
typename... TParams>
240 TRetType defaultHandle(ValueReturnTag<TParams...>)
242 return typename std::decay<TRetType>::type();
261class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>, TRetType> :
public
262 details::GenericHandlerBase<TDefault, TRetType>
264 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
267 using BaseImpl::handle;
268 virtual TRetType handle(T1& msg)
270 static_assert(std::is_base_of<TDefault, T1>::value,
271 "TDefault must be base class for every element in TAll");
273 return this->handle(
static_cast<TDefault&
>(msg));
276 virtual TRetType handle(T2& msg)
278 static_assert(std::is_base_of<TDefault, T2>::value,
279 "TDefault must be base class for every element in TAll");
281 return this->handle(
static_cast<TDefault&
>(msg));
284 virtual TRetType handle(T3& msg)
286 static_assert(std::is_base_of<TDefault, T3>::value,
287 "TDefault must be base class for every element in TAll");
289 return this->handle(
static_cast<TDefault&
>(msg));
292 virtual TRetType handle(T4& msg)
294 static_assert(std::is_base_of<TDefault, T4>::value,
295 "TDefault must be base class for every element in TAll");
297 return this->handle(
static_cast<TDefault&
>(msg));
300 virtual TRetType handle(T5& msg)
302 static_assert(std::is_base_of<TDefault, T5>::value,
303 "TDefault must be base class for every element in TAll");
305 return this->handle(
static_cast<TDefault&
>(msg));
308 virtual TRetType handle(T6& msg)
310 static_assert(std::is_base_of<TDefault, T6>::value,
311 "TDefault must be base class for every element in TAll");
313 return this->handle(
static_cast<TDefault&
>(msg));
316 virtual TRetType handle(T7& msg)
318 static_assert(std::is_base_of<TDefault, T7>::value,
319 "TDefault must be base class for every element in TAll");
321 return this->handle(
static_cast<TDefault&
>(msg));
324 virtual TRetType handle(T8& msg)
326 static_assert(std::is_base_of<TDefault, T8>::value,
327 "TDefault must be base class for every element in TAll");
329 return this->handle(
static_cast<TDefault&
>(msg));
332 virtual TRetType handle(T9& msg)
334 static_assert(std::is_base_of<TDefault, T9>::value,
335 "TDefault must be base class for every element in TAll");
337 return this->handle(
static_cast<TDefault&
>(msg));
341 ~GenericHandler() noexcept = default;
355class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6, T7, T8>, TRetType> : public
356 details::GenericHandlerBase<TDefault, TRetType>
358 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
361 using BaseImpl::handle;
362 virtual TRetType handle(T1& msg)
364 static_assert(std::is_base_of<TDefault, T1>::value,
365 "TDefault must be base class for every element in TAll");
367 return this->handle(
static_cast<TDefault&
>(msg));
370 virtual TRetType handle(T2& msg)
372 static_assert(std::is_base_of<TDefault, T2>::value,
373 "TDefault must be base class for every element in TAll");
375 return this->handle(
static_cast<TDefault&
>(msg));
378 virtual TRetType handle(T3& msg)
380 static_assert(std::is_base_of<TDefault, T3>::value,
381 "TDefault must be base class for every element in TAll");
383 return this->handle(
static_cast<TDefault&
>(msg));
386 virtual TRetType handle(T4& msg)
388 static_assert(std::is_base_of<TDefault, T4>::value,
389 "TDefault must be base class for every element in TAll");
391 return this->handle(
static_cast<TDefault&
>(msg));
394 virtual TRetType handle(T5& msg)
396 static_assert(std::is_base_of<TDefault, T5>::value,
397 "TDefault must be base class for every element in TAll");
399 return this->handle(
static_cast<TDefault&
>(msg));
402 virtual TRetType handle(T6& msg)
404 static_assert(std::is_base_of<TDefault, T6>::value,
405 "TDefault must be base class for every element in TAll");
407 return this->handle(
static_cast<TDefault&
>(msg));
410 virtual TRetType handle(T7& msg)
412 static_assert(std::is_base_of<TDefault, T7>::value,
413 "TDefault must be base class for every element in TAll");
415 return this->handle(
static_cast<TDefault&
>(msg));
418 virtual TRetType handle(T8& msg)
420 static_assert(std::is_base_of<TDefault, T8>::value,
421 "TDefault must be base class for every element in TAll");
423 return this->handle(
static_cast<TDefault&
>(msg));
427 ~GenericHandler() noexcept = default;
440class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6, T7>, TRetType> : public
441 details::GenericHandlerBase<TDefault, TRetType>
443 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
446 using BaseImpl::handle;
447 virtual TRetType handle(T1& msg)
449 static_assert(std::is_base_of<TDefault, T1>::value,
450 "TDefault must be base class for every element in TAll");
452 return this->handle(
static_cast<TDefault&
>(msg));
455 virtual TRetType handle(T2& msg)
457 static_assert(std::is_base_of<TDefault, T2>::value,
458 "TDefault must be base class for every element in TAll");
460 return this->handle(
static_cast<TDefault&
>(msg));
463 virtual TRetType handle(T3& msg)
465 static_assert(std::is_base_of<TDefault, T3>::value,
466 "TDefault must be base class for every element in TAll");
468 return this->handle(
static_cast<TDefault&
>(msg));
471 virtual TRetType handle(T4& msg)
473 static_assert(std::is_base_of<TDefault, T4>::value,
474 "TDefault must be base class for every element in TAll");
476 return this->handle(
static_cast<TDefault&
>(msg));
479 virtual TRetType handle(T5& msg)
481 static_assert(std::is_base_of<TDefault, T5>::value,
482 "TDefault must be base class for every element in TAll");
484 return this->handle(
static_cast<TDefault&
>(msg));
487 virtual TRetType handle(T6& msg)
489 static_assert(std::is_base_of<TDefault, T6>::value,
490 "TDefault must be base class for every element in TAll");
492 return this->handle(
static_cast<TDefault&
>(msg));
495 virtual TRetType handle(T7& msg)
497 static_assert(std::is_base_of<TDefault, T7>::value,
498 "TDefault must be base class for every element in TAll");
500 return this->handle(
static_cast<TDefault&
>(msg));
504 ~GenericHandler() noexcept = default;
516class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6>, TRetType> : public
517 details::GenericHandlerBase<TDefault, TRetType>
519 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
522 using BaseImpl::handle;
523 virtual TRetType handle(T1& msg)
525 static_assert(std::is_base_of<TDefault, T1>::value,
526 "TDefault must be base class for every element in TAll");
528 return this->handle(
static_cast<TDefault&
>(msg));
531 virtual TRetType handle(T2& msg)
533 static_assert(std::is_base_of<TDefault, T2>::value,
534 "TDefault must be base class for every element in TAll");
536 return this->handle(
static_cast<TDefault&
>(msg));
539 virtual TRetType handle(T3& msg)
541 static_assert(std::is_base_of<TDefault, T3>::value,
542 "TDefault must be base class for every element in TAll");
544 return this->handle(
static_cast<TDefault&
>(msg));
547 virtual TRetType handle(T4& msg)
549 static_assert(std::is_base_of<TDefault, T4>::value,
550 "TDefault must be base class for every element in TAll");
552 return this->handle(
static_cast<TDefault&
>(msg));
555 virtual TRetType handle(T5& msg)
557 static_assert(std::is_base_of<TDefault, T5>::value,
558 "TDefault must be base class for every element in TAll");
560 return this->handle(
static_cast<TDefault&
>(msg));
563 virtual TRetType handle(T6& msg)
565 static_assert(std::is_base_of<TDefault, T6>::value,
566 "TDefault must be base class for every element in TAll");
568 return this->handle(
static_cast<TDefault&
>(msg));
572 ~GenericHandler() noexcept = default;
583class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5>, TRetType> : public
584 details::GenericHandlerBase<TDefault, TRetType>
586 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
589 using BaseImpl::handle;
590 virtual TRetType handle(T1& msg)
592 static_assert(std::is_base_of<TDefault, T1>::value,
593 "TDefault must be base class for every element in TAll");
595 return this->handle(
static_cast<TDefault&
>(msg));
598 virtual TRetType handle(T2& msg)
600 static_assert(std::is_base_of<TDefault, T2>::value,
601 "TDefault must be base class for every element in TAll");
603 return this->handle(
static_cast<TDefault&
>(msg));
606 virtual TRetType handle(T3& msg)
608 static_assert(std::is_base_of<TDefault, T3>::value,
609 "TDefault must be base class for every element in TAll");
611 return this->handle(
static_cast<TDefault&
>(msg));
614 virtual TRetType handle(T4& msg)
616 static_assert(std::is_base_of<TDefault, T4>::value,
617 "TDefault must be base class for every element in TAll");
619 return this->handle(
static_cast<TDefault&
>(msg));
622 virtual TRetType handle(T5& msg)
624 static_assert(std::is_base_of<TDefault, T5>::value,
625 "TDefault must be base class for every element in TAll");
627 return this->handle(
static_cast<TDefault&
>(msg));
631 ~GenericHandler() noexcept = default;
641class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4>, TRetType> : public
642 details::GenericHandlerBase<TDefault, TRetType>
644 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
647 using BaseImpl::handle;
648 virtual TRetType handle(T1& msg)
650 static_assert(std::is_base_of<TDefault, T1>::value,
651 "TDefault must be base class for every element in TAll");
653 return this->handle(
static_cast<TDefault&
>(msg));
656 virtual TRetType handle(T2& msg)
658 static_assert(std::is_base_of<TDefault, T2>::value,
659 "TDefault must be base class for every element in TAll");
661 return this->handle(
static_cast<TDefault&
>(msg));
664 virtual TRetType handle(T3& msg)
666 static_assert(std::is_base_of<TDefault, T3>::value,
667 "TDefault must be base class for every element in TAll");
669 return this->handle(
static_cast<TDefault&
>(msg));
672 virtual TRetType handle(T4& msg)
674 static_assert(std::is_base_of<TDefault, T4>::value,
675 "TDefault must be base class for every element in TAll");
677 return this->handle(
static_cast<TDefault&
>(msg));
681 ~GenericHandler() noexcept = default;
684template <typename TDefault, typename T1, typename T2, typename T3, typename TRetType>
685class GenericHandler<TDefault,
std::tuple<T1, T2, T3>, TRetType> : public
686 details::GenericHandlerBase<TDefault, TRetType>
688 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
691 using BaseImpl::handle;
692 virtual TRetType handle(T1& msg)
694 static_assert(std::is_base_of<TDefault, T1>::value,
695 "TDefault must be base class for every element in TAll");
697 return this->handle(
static_cast<TDefault&
>(msg));
700 virtual TRetType handle(T2& msg)
702 static_assert(std::is_base_of<TDefault, T2>::value,
703 "TDefault must be base class for every element in TAll");
705 return this->handle(
static_cast<TDefault&
>(msg));
708 virtual TRetType handle(T3& msg)
710 static_assert(std::is_base_of<TDefault, T3>::value,
711 "TDefault must be base class for every element in TAll");
713 return this->handle(
static_cast<TDefault&
>(msg));
717 ~GenericHandler() noexcept = default;
720template <typename TDefault, typename T1, typename T2, typename TRetType>
721class GenericHandler<TDefault,
std::tuple<T1, T2>, TRetType> : public
722 details::GenericHandlerBase<TDefault, TRetType>
724 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
727 using BaseImpl::handle;
728 virtual TRetType handle(T1& msg)
730 static_assert(std::is_base_of<TDefault, T1>::value,
731 "TDefault must be base class for every element in TAll");
733 return this->handle(
static_cast<TDefault&
>(msg));
736 virtual TRetType handle(T2& msg)
738 static_assert(std::is_base_of<TDefault, T2>::value,
739 "TDefault must be base class for every element in TAll");
741 return this->handle(
static_cast<TDefault&
>(msg));
745 ~GenericHandler() noexcept = default;
748template <typename TDefault, typename T1, typename TRetType>
749class GenericHandler<TDefault,
std::tuple<T1>, TRetType> : public
750 details::GenericHandlerBase<TDefault, TRetType>
752 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
755 using BaseImpl::handle;
756 virtual TRetType handle(T1& msg)
758 static_assert(std::is_base_of<TDefault, T1>::value,
759 "TDefault must be base class for every element in TAll");
761 return this->handle(
static_cast<TDefault&
>(msg));
765 ~GenericHandler() noexcept = default;
768template <typename TDefault, typename TRetType>
769class GenericHandler<TDefault,
std::tuple<>, TRetType> : public
770 details::GenericHandlerBase<TDefault, TRetType>
772 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
774 using BaseImpl::handle;
776 ~GenericHandler() noexcept = default;
Contains various tuple type manipulation classes and functions.
Generic common message handler.
Definition GenericHandler.h:52
~GenericHandler() noexcept=default
Destructor.
virtual TRetType handle(TDefault &msg)
Handle message object.
TRetType RetType
Return type of every handle() member function.
Definition GenericHandler.h:59
Main namespace for all classes / functions of COMMS library.
Check whether provided type is a variant of std::tuple.
Definition Tuple.h:39
Replacement to some types from standard type_traits.