13#include "comms/details/tag.h"
48template <
typename TDefault,
typename TAll,
typename TRetType =
void>
52 "TAll must be std::tuple");
54#ifdef FOR_DOXYGEN_DOC_ONLY
61 virtual TRetType
handle(TDefault& msg);
89class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TRest...>, TRetType>
92 using BaseImpl =
GenericHandler<TDefault, std::tuple<TRest...>, TRetType>;
95 using BaseImpl::handle;
96 virtual TRetType
handle(T1& msg)
98 static_assert(std::is_base_of<TDefault, T1>::value,
99 "TDefault must be base class for every element in TAll");
101 return this->
handle(
static_cast<TDefault&
>(msg));
104 virtual TRetType
handle(T2& msg)
106 static_assert(std::is_base_of<TDefault, T2>::value,
107 "TDefault must be base class for every element in TAll");
109 return this->
handle(
static_cast<TDefault&
>(msg));
112 virtual TRetType
handle(T3& msg)
114 static_assert(std::is_base_of<TDefault, T3>::value,
115 "TDefault must be base class for every element in TAll");
117 return this->
handle(
static_cast<TDefault&
>(msg));
120 virtual TRetType
handle(T4& msg)
122 static_assert(std::is_base_of<TDefault, T4>::value,
123 "TDefault must be base class for every element in TAll");
125 return this->
handle(
static_cast<TDefault&
>(msg));
128 virtual TRetType
handle(T5& msg)
130 static_assert(std::is_base_of<TDefault, T5>::value,
131 "TDefault must be base class for every element in TAll");
133 return this->
handle(
static_cast<TDefault&
>(msg));
136 virtual TRetType
handle(T6& msg)
138 static_assert(std::is_base_of<TDefault, T6>::value,
139 "TDefault must be base class for every element in TAll");
141 return this->
handle(
static_cast<TDefault&
>(msg));
144 virtual TRetType
handle(T7& msg)
146 static_assert(std::is_base_of<TDefault, T7>::value,
147 "TDefault must be base class for every element in TAll");
149 return this->
handle(
static_cast<TDefault&
>(msg));
152 virtual TRetType
handle(T8& msg)
154 static_assert(std::is_base_of<TDefault, T8>::value,
155 "TDefault must be base class for every element in TAll");
157 return this->
handle(
static_cast<TDefault&
>(msg));
160 virtual TRetType
handle(T9& msg)
162 static_assert(std::is_base_of<TDefault, T9>::value,
163 "TDefault must be base class for every element in TAll");
165 return this->
handle(
static_cast<TDefault&
>(msg));
168 virtual TRetType
handle(T10& msg)
170 static_assert(std::is_base_of<TDefault, T10>::value,
171 "TDefault must be base class for every element in TAll");
173 return this->
handle(
static_cast<TDefault&
>(msg));
183template <
typename TDefault,
typename TRetType>
184class GenericHandlerBase
187 using RetType = TRetType;
189 virtual TRetType handle(TDefault& msg)
192 static_cast<void>(msg);
195 typename comms::util::LazyShallowConditional<
196 std::is_void<TRetType>::value
199 RetValueShallowCondWrap
202 return defaultHandle(Tag());
206 template <
typename... TParams>
207 using VoidReturnTag = comms::details::tag::Tag1<>;
209 template <
typename... TParams>
210 using ReferenceReturnTag = comms::details::tag::Tag2<>;
212 template <
typename... TParams>
213 using ValueReturnTag = comms::details::tag::Tag3<>;
215 template <
typename... TParams>
216 using RetValueShallowCondWrap =
217 typename comms::util::LazyShallowConditional<
218 std::is_lvalue_reference<TRetType>::value
225 template <
typename... TParams>
226 void defaultHandle(VoidReturnTag<TParams...>)
230 template <
typename... TParams>
231 TRetType defaultHandle(ReferenceReturnTag<TParams...>)
233 static typename std::decay<TRetType>::type Value;
237 template <
typename... TParams>
238 TRetType defaultHandle(ValueReturnTag<TParams...>)
240 return typename std::decay<TRetType>::type();
259class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>, TRetType> :
public
260 details::GenericHandlerBase<TDefault, TRetType>
262 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
265 using BaseImpl::handle;
266 virtual TRetType handle(T1& msg)
268 static_assert(std::is_base_of<TDefault, T1>::value,
269 "TDefault must be base class for every element in TAll");
271 return this->handle(
static_cast<TDefault&
>(msg));
274 virtual TRetType handle(T2& msg)
276 static_assert(std::is_base_of<TDefault, T2>::value,
277 "TDefault must be base class for every element in TAll");
279 return this->handle(
static_cast<TDefault&
>(msg));
282 virtual TRetType handle(T3& msg)
284 static_assert(std::is_base_of<TDefault, T3>::value,
285 "TDefault must be base class for every element in TAll");
287 return this->handle(
static_cast<TDefault&
>(msg));
290 virtual TRetType handle(T4& msg)
292 static_assert(std::is_base_of<TDefault, T4>::value,
293 "TDefault must be base class for every element in TAll");
295 return this->handle(
static_cast<TDefault&
>(msg));
298 virtual TRetType handle(T5& msg)
300 static_assert(std::is_base_of<TDefault, T5>::value,
301 "TDefault must be base class for every element in TAll");
303 return this->handle(
static_cast<TDefault&
>(msg));
306 virtual TRetType handle(T6& msg)
308 static_assert(std::is_base_of<TDefault, T6>::value,
309 "TDefault must be base class for every element in TAll");
311 return this->handle(
static_cast<TDefault&
>(msg));
314 virtual TRetType handle(T7& msg)
316 static_assert(std::is_base_of<TDefault, T7>::value,
317 "TDefault must be base class for every element in TAll");
319 return this->handle(
static_cast<TDefault&
>(msg));
322 virtual TRetType handle(T8& msg)
324 static_assert(std::is_base_of<TDefault, T8>::value,
325 "TDefault must be base class for every element in TAll");
327 return this->handle(
static_cast<TDefault&
>(msg));
330 virtual TRetType handle(T9& msg)
332 static_assert(std::is_base_of<TDefault, T9>::value,
333 "TDefault must be base class for every element in TAll");
335 return this->handle(
static_cast<TDefault&
>(msg));
339 ~GenericHandler() noexcept = default;
353class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6, T7, T8>, TRetType> : public
354 details::GenericHandlerBase<TDefault, TRetType>
356 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
359 using BaseImpl::handle;
360 virtual TRetType handle(T1& msg)
362 static_assert(std::is_base_of<TDefault, T1>::value,
363 "TDefault must be base class for every element in TAll");
365 return this->handle(
static_cast<TDefault&
>(msg));
368 virtual TRetType handle(T2& msg)
370 static_assert(std::is_base_of<TDefault, T2>::value,
371 "TDefault must be base class for every element in TAll");
373 return this->handle(
static_cast<TDefault&
>(msg));
376 virtual TRetType handle(T3& msg)
378 static_assert(std::is_base_of<TDefault, T3>::value,
379 "TDefault must be base class for every element in TAll");
381 return this->handle(
static_cast<TDefault&
>(msg));
384 virtual TRetType handle(T4& msg)
386 static_assert(std::is_base_of<TDefault, T4>::value,
387 "TDefault must be base class for every element in TAll");
389 return this->handle(
static_cast<TDefault&
>(msg));
392 virtual TRetType handle(T5& msg)
394 static_assert(std::is_base_of<TDefault, T5>::value,
395 "TDefault must be base class for every element in TAll");
397 return this->handle(
static_cast<TDefault&
>(msg));
400 virtual TRetType handle(T6& msg)
402 static_assert(std::is_base_of<TDefault, T6>::value,
403 "TDefault must be base class for every element in TAll");
405 return this->handle(
static_cast<TDefault&
>(msg));
408 virtual TRetType handle(T7& msg)
410 static_assert(std::is_base_of<TDefault, T7>::value,
411 "TDefault must be base class for every element in TAll");
413 return this->handle(
static_cast<TDefault&
>(msg));
416 virtual TRetType handle(T8& msg)
418 static_assert(std::is_base_of<TDefault, T8>::value,
419 "TDefault must be base class for every element in TAll");
421 return this->handle(
static_cast<TDefault&
>(msg));
425 ~GenericHandler() noexcept = default;
438class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6, T7>, TRetType> : public
439 details::GenericHandlerBase<TDefault, TRetType>
441 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
444 using BaseImpl::handle;
445 virtual TRetType handle(T1& msg)
447 static_assert(std::is_base_of<TDefault, T1>::value,
448 "TDefault must be base class for every element in TAll");
450 return this->handle(
static_cast<TDefault&
>(msg));
453 virtual TRetType handle(T2& msg)
455 static_assert(std::is_base_of<TDefault, T2>::value,
456 "TDefault must be base class for every element in TAll");
458 return this->handle(
static_cast<TDefault&
>(msg));
461 virtual TRetType handle(T3& msg)
463 static_assert(std::is_base_of<TDefault, T3>::value,
464 "TDefault must be base class for every element in TAll");
466 return this->handle(
static_cast<TDefault&
>(msg));
469 virtual TRetType handle(T4& msg)
471 static_assert(std::is_base_of<TDefault, T4>::value,
472 "TDefault must be base class for every element in TAll");
474 return this->handle(
static_cast<TDefault&
>(msg));
477 virtual TRetType handle(T5& msg)
479 static_assert(std::is_base_of<TDefault, T5>::value,
480 "TDefault must be base class for every element in TAll");
482 return this->handle(
static_cast<TDefault&
>(msg));
485 virtual TRetType handle(T6& msg)
487 static_assert(std::is_base_of<TDefault, T6>::value,
488 "TDefault must be base class for every element in TAll");
490 return this->handle(
static_cast<TDefault&
>(msg));
493 virtual TRetType handle(T7& msg)
495 static_assert(std::is_base_of<TDefault, T7>::value,
496 "TDefault must be base class for every element in TAll");
498 return this->handle(
static_cast<TDefault&
>(msg));
502 ~GenericHandler() noexcept = default;
514class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5, T6>, TRetType> : public
515 details::GenericHandlerBase<TDefault, TRetType>
517 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
520 using BaseImpl::handle;
521 virtual TRetType handle(T1& msg)
523 static_assert(std::is_base_of<TDefault, T1>::value,
524 "TDefault must be base class for every element in TAll");
526 return this->handle(
static_cast<TDefault&
>(msg));
529 virtual TRetType handle(T2& msg)
531 static_assert(std::is_base_of<TDefault, T2>::value,
532 "TDefault must be base class for every element in TAll");
534 return this->handle(
static_cast<TDefault&
>(msg));
537 virtual TRetType handle(T3& msg)
539 static_assert(std::is_base_of<TDefault, T3>::value,
540 "TDefault must be base class for every element in TAll");
542 return this->handle(
static_cast<TDefault&
>(msg));
545 virtual TRetType handle(T4& msg)
547 static_assert(std::is_base_of<TDefault, T4>::value,
548 "TDefault must be base class for every element in TAll");
550 return this->handle(
static_cast<TDefault&
>(msg));
553 virtual TRetType handle(T5& msg)
555 static_assert(std::is_base_of<TDefault, T5>::value,
556 "TDefault must be base class for every element in TAll");
558 return this->handle(
static_cast<TDefault&
>(msg));
561 virtual TRetType handle(T6& msg)
563 static_assert(std::is_base_of<TDefault, T6>::value,
564 "TDefault must be base class for every element in TAll");
566 return this->handle(
static_cast<TDefault&
>(msg));
570 ~GenericHandler() noexcept = default;
581class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4, T5>, TRetType> : public
582 details::GenericHandlerBase<TDefault, TRetType>
584 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
587 using BaseImpl::handle;
588 virtual TRetType handle(T1& msg)
590 static_assert(std::is_base_of<TDefault, T1>::value,
591 "TDefault must be base class for every element in TAll");
593 return this->handle(
static_cast<TDefault&
>(msg));
596 virtual TRetType handle(T2& msg)
598 static_assert(std::is_base_of<TDefault, T2>::value,
599 "TDefault must be base class for every element in TAll");
601 return this->handle(
static_cast<TDefault&
>(msg));
604 virtual TRetType handle(T3& msg)
606 static_assert(std::is_base_of<TDefault, T3>::value,
607 "TDefault must be base class for every element in TAll");
609 return this->handle(
static_cast<TDefault&
>(msg));
612 virtual TRetType handle(T4& msg)
614 static_assert(std::is_base_of<TDefault, T4>::value,
615 "TDefault must be base class for every element in TAll");
617 return this->handle(
static_cast<TDefault&
>(msg));
620 virtual TRetType handle(T5& msg)
622 static_assert(std::is_base_of<TDefault, T5>::value,
623 "TDefault must be base class for every element in TAll");
625 return this->handle(
static_cast<TDefault&
>(msg));
629 ~GenericHandler() noexcept = default;
639class GenericHandler<TDefault,
std::tuple<T1, T2, T3, T4>, TRetType> : public
640 details::GenericHandlerBase<TDefault, TRetType>
642 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
645 using BaseImpl::handle;
646 virtual TRetType handle(T1& msg)
648 static_assert(std::is_base_of<TDefault, T1>::value,
649 "TDefault must be base class for every element in TAll");
651 return this->handle(
static_cast<TDefault&
>(msg));
654 virtual TRetType handle(T2& msg)
656 static_assert(std::is_base_of<TDefault, T2>::value,
657 "TDefault must be base class for every element in TAll");
659 return this->handle(
static_cast<TDefault&
>(msg));
662 virtual TRetType handle(T3& msg)
664 static_assert(std::is_base_of<TDefault, T3>::value,
665 "TDefault must be base class for every element in TAll");
667 return this->handle(
static_cast<TDefault&
>(msg));
670 virtual TRetType handle(T4& msg)
672 static_assert(std::is_base_of<TDefault, T4>::value,
673 "TDefault must be base class for every element in TAll");
675 return this->handle(
static_cast<TDefault&
>(msg));
679 ~GenericHandler() noexcept = default;
682template <typename TDefault, typename T1, typename T2, typename T3, typename TRetType>
683class GenericHandler<TDefault,
std::tuple<T1, T2, T3>, TRetType> : public
684 details::GenericHandlerBase<TDefault, TRetType>
686 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
689 using BaseImpl::handle;
690 virtual TRetType handle(T1& msg)
692 static_assert(std::is_base_of<TDefault, T1>::value,
693 "TDefault must be base class for every element in TAll");
695 return this->handle(
static_cast<TDefault&
>(msg));
698 virtual TRetType handle(T2& msg)
700 static_assert(std::is_base_of<TDefault, T2>::value,
701 "TDefault must be base class for every element in TAll");
703 return this->handle(
static_cast<TDefault&
>(msg));
706 virtual TRetType handle(T3& msg)
708 static_assert(std::is_base_of<TDefault, T3>::value,
709 "TDefault must be base class for every element in TAll");
711 return this->handle(
static_cast<TDefault&
>(msg));
715 ~GenericHandler() noexcept = default;
718template <typename TDefault, typename T1, typename T2, typename TRetType>
719class GenericHandler<TDefault,
std::tuple<T1, T2>, TRetType> : public
720 details::GenericHandlerBase<TDefault, TRetType>
722 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
725 using BaseImpl::handle;
726 virtual TRetType handle(T1& msg)
728 static_assert(std::is_base_of<TDefault, T1>::value,
729 "TDefault must be base class for every element in TAll");
731 return this->handle(
static_cast<TDefault&
>(msg));
734 virtual TRetType handle(T2& msg)
736 static_assert(std::is_base_of<TDefault, T2>::value,
737 "TDefault must be base class for every element in TAll");
739 return this->handle(
static_cast<TDefault&
>(msg));
743 ~GenericHandler() noexcept = default;
746template <typename TDefault, typename T1, typename TRetType>
747class GenericHandler<TDefault,
std::tuple<T1>, TRetType> : public
748 details::GenericHandlerBase<TDefault, TRetType>
750 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
753 using BaseImpl::handle;
754 virtual TRetType handle(T1& msg)
756 static_assert(std::is_base_of<TDefault, T1>::value,
757 "TDefault must be base class for every element in TAll");
759 return this->handle(
static_cast<TDefault&
>(msg));
763 ~GenericHandler() noexcept = default;
766template <typename TDefault, typename TRetType>
767class GenericHandler<TDefault,
std::tuple<>, TRetType> : public
768 details::GenericHandlerBase<TDefault, TRetType>
770 using BaseImpl = details::GenericHandlerBase<TDefault, TRetType>;
772 using BaseImpl::handle;
774 ~GenericHandler() noexcept = default;
Contains various tuple type manipulation classes and functions.
Generic common message handler.
Definition GenericHandler.h:50
~GenericHandler() noexcept=default
Destructor.
virtual TRetType handle(TDefault &msg)
Handle message object.
TRetType RetType
Return type of every handle() member function.
Definition GenericHandler.h:57
Main namespace for all classes / functions of COMMS library.
Check whether provided type is a variant of std::tuple.
Definition Tuple.h:36
Replacement to some types from standard type_traits.