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