COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
ReadIteratorHelper.h
1//
2// Copyright 2019 - 2025 (C). Alex Robenko. All rights reserved.
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
8#pragma once
9
10#include "comms/details/detect.h"
11#include "comms/details/tag.h"
12#include "comms/Message.h"
14
15namespace comms
16{
17
18namespace details
19{
20
21template <typename...>
22class ReadIteratorHelper
23{
24 template <typename... TParams>
25 using HasReadIterTag = comms::details::tag::Tag1<>;
26
27 template <typename... TParams>
28 using MsgPointerTag = comms::details::tag::Tag2<>;
29
30 template <typename... TParams>
31 using CastTag = comms::details::tag::Tag3<>;
32
33 template <typename TMsg>
34 using MsgObjTag =
35 typename comms::util::LazyShallowConditional<
36 TMsg::hasRead()
37 >::template Type<
38 HasReadIterTag,
39 CastTag
40 >;
41
42 template <typename TMsg>
43 using MsgPtrOrCastTag =
44 typename comms::util::LazyShallowConditional<
45 hasElementType<TMsg>()
46 >::template Type<
47 MsgPointerTag,
48 CastTag
49 >;
50
51 template <typename TMsg>
52 using Tag =
53 typename comms::util::LazyShallowConditional<
54 comms::isMessage<TMsg>()
55 >::template Type<
56 MsgObjTag,
57 MsgPtrOrCastTag,
58 TMsg
59 >;
60
61 template <typename TMsg, typename TIter, typename... TParams>
62 static auto getInternal(TIter&& iter, HasReadIterTag<TParams...>) -> typename TMsg::ReadIterator
63 {
64 static_assert(std::is_convertible<typename std::decay<decltype(iter)>::type, typename TMsg::ReadIterator>::value,
65 "Provided iterator is not convertible to read iterator type used by message interface");
66 return typename TMsg::ReadIterator(std::forward<TIter>(iter));
67 }
68
69 template <typename TMsg, typename TIter, typename... TParams>
70 static auto getInternal(TIter&& iter, CastTag<TParams...>) -> decltype(std::forward<TIter>(iter))
71 {
72 return std::forward<TIter>(iter);
73 }
74
75 template <typename TMsg, typename TIter, typename... TParams>
76 static auto getInternal(TIter&& iter, MsgPointerTag<TParams...>) ->
77 decltype(getInternal<typename TMsg::element_type>(std::forward<TIter>(iter), Tag<typename TMsg::element_type>()))
78 {
79 return getInternal<typename TMsg::element_type>(std::forward<TIter>(iter), Tag<typename TMsg::element_type>());
80 }
81
82public:
83 template <typename TMsg, typename TIter>
84 static auto get(TIter&& iter) -> decltype(getInternal<TMsg>(std::forward<TIter>(iter), Tag<TMsg>()))
85 {
86 return getInternal<TMsg>(std::forward<TIter>(iter), Tag<TMsg>());
87 }
88};
89
90} // namespace details
91
92} // namespace comms
Contains definition of Message object interface and various base classes for custom messages.
Main namespace for all classes / functions of COMMS library.
Replacement to some types from standard type_traits.