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