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
15#include <utility>
16
17namespace comms
18{
19
20namespace details
21{
22
23template <typename...>
24class ReadIteratorHelper
25{
26 template <typename... TParams>
27 using HasReadIterTag = comms::details::tag::Tag1<>;
28
29 template <typename... TParams>
30 using MsgPointerTag = comms::details::tag::Tag2<>;
31
32 template <typename... TParams>
33 using CastTag = comms::details::tag::Tag3<>;
34
35 template <typename TMsg>
36 using MsgObjTag =
37 typename comms::util::LazyShallowConditional<
38 TMsg::hasRead()
39 >::template Type<
40 HasReadIterTag,
41 CastTag
42 >;
43
44 template <typename TMsg>
45 using MsgPtrOrCastTag =
46 typename comms::util::LazyShallowConditional<
47 hasElementType<TMsg>()
48 >::template Type<
49 MsgPointerTag,
50 CastTag
51 >;
52
53 template <typename TMsg>
54 using Tag =
55 typename comms::util::LazyShallowConditional<
56 comms::isMessage<TMsg>()
57 >::template Type<
58 MsgObjTag,
59 MsgPtrOrCastTag,
60 TMsg
61 >;
62
63 template <typename TMsg, typename TIter, typename... TParams>
64 static auto getInternal(TIter&& iter, HasReadIterTag<TParams...>) -> typename TMsg::ReadIterator
65 {
66 static_assert(std::is_convertible<typename std::decay<decltype(iter)>::type, typename TMsg::ReadIterator>::value,
67 "Provided iterator is not convertible to read iterator type used by message interface");
68 return typename TMsg::ReadIterator(std::forward<TIter>(iter));
69 }
70
71 template <typename TMsg, typename TIter, typename... TParams>
72 static auto getInternal(TIter&& iter, CastTag<TParams...>) -> decltype(std::forward<TIter>(iter))
73 {
74 return std::forward<TIter>(iter);
75 }
76
77 template <typename TMsg, typename TIter, typename... TParams>
78 static auto getInternal(TIter&& iter, MsgPointerTag<TParams...>) ->
79 decltype(getInternal<typename TMsg::element_type>(std::forward<TIter>(iter), Tag<typename TMsg::element_type>()))
80 {
81 return getInternal<typename TMsg::element_type>(std::forward<TIter>(iter), Tag<typename TMsg::element_type>());
82 }
83
84public:
85 template <typename TMsg, typename TIter>
86 static auto get(TIter&& iter) -> decltype(getInternal<TMsg>(std::forward<TIter>(iter), Tag<TMsg>()))
87 {
88 return getInternal<TMsg>(std::forward<TIter>(iter), Tag<TMsg>());
89 }
90};
91
92} // namespace details
93
94} // 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.