11#include "comms/details/tag.h"
28using MessageInterfaceEmptyBase = comms::util::EmptyStruct<>;
32template <
typename TEndian>
33class MessageInterfaceEndianBase
41 ~MessageInterfaceEndianBase() noexcept = default;
43 template <typename T, typename TIter>
44 static
void writeData(T value, TIter& iter)
46 writeData<sizeof(T), T>(value, iter);
49 template <std::
size_t TSize,
typename T,
typename TIter>
50 static void writeData(T value, TIter& iter)
52 static_assert(TSize <=
sizeof(T),
53 "Cannot put more bytes than type contains");
54 return util::writeData<TSize, T>(value, iter,
Endian());
57 template <
typename T,
typename TIter>
60 return readData<T, sizeof(T)>(iter);
63 template <
typename T, std::
size_t TSize,
typename TIter>
66 static_assert(TSize <=
sizeof(T),
67 "Cannot get more bytes than type contains");
68 return util::readData<T, TSize>(iter,
Endian());
74template <
typename TBase,
typename TId>
75class MessageInterfaceIdTypeBase :
public TBase
79 using MsgIdParamType =
81 std::is_integral<MsgIdType>::value || std::is_enum<MsgIdType>::value
88 ~MessageInterfaceIdTypeBase() noexcept = default;
93template <typename TBase, typename TFields>
94class MessageInterfaceExtraTransportFieldsBase : public TBase
97 using TransportFields = TFields;
99 static_assert(comms::util::isTuple<TransportFields>(),
100 "TransportFields is expected to be tuple");
102 TransportFields& transportFields()
104 return m_transportFields;
107 const TransportFields& transportFields()
const
109 return m_transportFields;
113 ~MessageInterfaceExtraTransportFieldsBase() noexcept = default;
115 TransportFields m_transportFields;
120template <typename TBase,
std::
size_t TIdx>
121class MessageInterfaceVersionInExtraTransportFieldsBase : public TBase
124 using TransportFields =
typename TBase::TransportFields;
126 static_assert(comms::util::isTuple<TransportFields>(),
127 "TransportFields is expected to be tuple");
129 static_assert(TIdx < std::tuple_size<TransportFields>::value,
130 "Index provided to comms::option::def::VersionInExtraTransportFields exceeds size of the tuple");
132 using VersionType =
typename std::tuple_element<TIdx, TransportFields>::type::ValueType;
136 return std::get<TIdx>(TBase::transportFields()).value();
141 return std::get<TIdx>(TBase::transportFields()).value();
145 ~MessageInterfaceVersionInExtraTransportFieldsBase() noexcept = default;
150template <typename TBase>
151class MessageInterfaceIdInfoBase : public TBase
154 using MsgIdParamType =
typename TBase::MsgIdParamType;
156 MsgIdParamType getId()
const
162 ~MessageInterfaceIdInfoBase() noexcept = default;
163 virtual MsgIdParamType getIdImpl() const = 0;
168template <typename TBase, typename TReadIter>
169class MessageInterfaceReadBase : public TBase
175 return this->readImpl(iter, size);
179 ~MessageInterfaceReadBase() noexcept = default;
182 static_cast<void>(iter);
183 static_cast<void>(size);
190template <
typename TBase,
typename TWriteIter>
191class MessageInterfaceWriteBase :
public TBase
197 return this->writeImpl(iter, size);
201 ~MessageInterfaceWriteBase() noexcept = default;
202 virtual
comms::ErrorStatus writeImpl(WriteIterator& iter,
std::
size_t size)
const
204 static_cast<void>(iter);
205 static_cast<void>(size);
212template <
typename TBase>
213class MessageInterfaceValidBase :
public TBase
222 ~MessageInterfaceValidBase() noexcept = default;
223 virtual
bool validImpl()
const
231template <
typename TBase>
232class MessageInterfaceLengthBase :
public TBase
235 std::size_t length()
const
241 ~MessageInterfaceLengthBase() noexcept = default;
242 virtual
std::
size_t lengthImpl()
const
244 static constexpr bool Not_overriden =
false;
245 static_cast<void>(Not_overriden);
253template <
class T,
class R =
void>
254struct MessageInterfaceIfHasRetType {
using Type = R; };
256template <
class T,
class Enable =
void>
257struct MessageInterfaceDispatchRetTypeHelper
263struct MessageInterfaceDispatchRetTypeHelper<T, typename MessageInterfaceIfHasRetType<typename T::RetType>::Type>
265 using Type =
typename T::RetType;
269using MessageInterfaceDispatchRetType =
typename MessageInterfaceDispatchRetTypeHelper<T>::Type;
272template <
typename TBase,
typename THandler>
273class MessageInterfaceHandlerBase :
public TBase
277 using DispatchRetType = MessageInterfaceDispatchRetType<Handler>;
279 DispatchRetType dispatch(Handler& handler)
281 return dispatchImpl(handler);
285 ~MessageInterfaceHandlerBase() noexcept = default;
286 virtual DispatchRetType dispatchImpl(Handler& handler)
288 static_cast<void>(handler);
289 static constexpr bool Must_not_be_called =
false;
290 static_cast<void>(Must_not_be_called);
294 std::is_void<DispatchRetType>::value
296 VoidHandleRetTypeTag,
297 NonVoidHandleRetTypeTag
299 return dispatchInternal(Tag());
303 using VoidHandleRetTypeTag = comms::details::tag::Tag1<>;
304 using NonVoidHandleRetTypeTag = comms::details::tag::Tag2<>;
306 static DispatchRetType dispatchInternal(VoidHandleRetTypeTag)
311 static DispatchRetType dispatchInternal(NonVoidHandleRetTypeTag)
313 using RetTypeInternal =
typename std::decay<DispatchRetType>::type;
314 static const RetTypeInternal Ret = RetTypeInternal();
321template <
typename TBase>
322class MessageInterfaceRefreshBase :
public TBase
327 return refreshImpl();
331 ~MessageInterfaceRefreshBase() noexcept = default;
332 virtual
bool refreshImpl()
340template <
typename TBase>
341class MessageInterfaceNameBase :
public TBase
344 const char* name()
const
350 ~MessageInterfaceNameBase() noexcept = default;
351 virtual const
char* nameImpl() const = 0;
356template <typename TBase>
357class MessageInterfaceVirtDestructorBase : public TBase
360 virtual ~MessageInterfaceVirtDestructorBase() noexcept = default;
This file contains classes required for generic custom assertion functionality.
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
This file contain definition of error statuses used by comms module.
Contains definition of comms::Field class.
Contains various tuple type manipulation classes and functions.
Contains functions for raw data access / (de)serialization.
Base class to all the field classes.
Definition Field.h:33
comms::option::app::WriteIterator< TIter > WriteIterator
Same as comms::option::app::WriteIterator.
Definition options.h:1970
comms::option::app::Handler< T > Handler
Same as comms::option::app::Handler.
Definition options.h:1995
comms::option::app::ReadIterator< TIter > ReadIterator
Same as comms::option::app::ReadIterator.
Definition options.h:1965
comms::option::def::VersionType< T > VersionType
Same as comms::option::def::VersionType.
Definition options.h:1917
comms::option::def::Endian< TEndian > Endian
Same as comms::option::def::Endian.
Definition options.h:1460
comms::option::def::MsgIdType< T > MsgIdType
Same as comms::option::def::MsgIdType.
Definition options.h:1473
T readData(TIter &iter, const traits::endian::Big &endian)
Same as readBig<T, TIter>()
Definition access.h:774
void writeData(T value, TIter &iter, const traits::endian::Big &endian)
Same as writeBig<T, TIter>()
Definition access.h:706
Main namespace for all classes / functions of COMMS library.
ErrorStatus
Error statuses reported by the Communication module.
Definition ErrorStatus.h:17
@ NotSupported
The operation is not supported.
constexpr unsigned version()
Version of the COMMS library as single numeric value.
Definition version.h:64
Contains definition of all the options used by the COMMS library.
Replacement to std::conditional.
Definition type_traits.h:29
Replacement to some types from standard type_traits.