13#include "comms/details/tag.h"
31using MessageInterfaceEmptyBase = comms::util::EmptyStruct<>;
35template <
typename TEndian>
36class MessageInterfaceEndianBase
44 ~MessageInterfaceEndianBase() noexcept = default;
46 template <typename T, typename TIter>
47 static
void writeData(T value, TIter& iter)
49 writeData<sizeof(T), T>(value, iter);
52 template <std::
size_t TSize,
typename T,
typename TIter>
53 static void writeData(T value, TIter& iter)
55 static_assert(TSize <=
sizeof(T),
56 "Cannot put more bytes than type contains");
57 return util::writeData<TSize, T>(value, iter,
Endian());
60 template <
typename T,
typename TIter>
63 return readData<T, sizeof(T)>(iter);
66 template <
typename T, std::
size_t TSize,
typename TIter>
69 static_assert(TSize <=
sizeof(T),
70 "Cannot get more bytes than type contains");
71 return util::readData<T, TSize>(iter,
Endian());
77template <
typename TBase,
typename TId>
78class MessageInterfaceIdTypeBase :
public TBase
82 using MsgIdParamType =
84 std::is_integral<MsgIdType>::value || std::is_enum<MsgIdType>::value
91 ~MessageInterfaceIdTypeBase() noexcept = default;
96template <typename TBase, typename TFields>
97class MessageInterfaceExtraTransportFieldsBase : public TBase
100 using TransportFields = TFields;
102 static_assert(comms::util::isTuple<TransportFields>(),
103 "TransportFields is expected to be tuple");
105 TransportFields& transportFields()
107 return m_transportFields;
110 const TransportFields& transportFields()
const
112 return m_transportFields;
116 ~MessageInterfaceExtraTransportFieldsBase() noexcept = default;
118 TransportFields m_transportFields;
123template <typename TBase,
std::
size_t TIdx>
124class MessageInterfaceVersionInExtraTransportFieldsBase : public TBase
127 using TransportFields =
typename TBase::TransportFields;
129 static_assert(comms::util::isTuple<TransportFields>(),
130 "TransportFields is expected to be tuple");
132 static_assert(TIdx < std::tuple_size<TransportFields>::value,
133 "Index provided to comms::option::def::VersionInExtraTransportFields exceeds size of the tuple");
135 using VersionType =
typename std::tuple_element<TIdx, TransportFields>::type::ValueType;
139 return std::get<TIdx>(TBase::transportFields()).value();
144 return std::get<TIdx>(TBase::transportFields()).value();
148 ~MessageInterfaceVersionInExtraTransportFieldsBase() noexcept = default;
153template <typename TBase>
154class MessageInterfaceIdInfoBase : public TBase
157 using MsgIdParamType =
typename TBase::MsgIdParamType;
159 MsgIdParamType getId()
const
165 ~MessageInterfaceIdInfoBase() noexcept = default;
166 virtual MsgIdParamType getIdImpl() const = 0;
171template <typename TBase, typename TReadIter>
172class MessageInterfaceReadBase : public TBase
178 return this->readImpl(iter, size);
182 ~MessageInterfaceReadBase() noexcept = default;
185 static_cast<void>(iter);
186 static_cast<void>(size);
193template <
typename TBase,
typename TWriteIter>
194class MessageInterfaceWriteBase :
public TBase
200 return this->writeImpl(iter, size);
204 ~MessageInterfaceWriteBase() noexcept = default;
205 virtual
comms::ErrorStatus writeImpl(WriteIterator& iter,
std::
size_t size)
const
207 static_cast<void>(iter);
208 static_cast<void>(size);
215template <
typename TBase>
216class MessageInterfaceValidBase :
public TBase
225 ~MessageInterfaceValidBase() noexcept = default;
226 virtual
bool validImpl()
const
234template <
typename TBase>
235class MessageInterfaceLengthBase :
public TBase
238 std::size_t length()
const
244 ~MessageInterfaceLengthBase() noexcept = default;
245 virtual
std::
size_t lengthImpl()
const
247 static constexpr bool Not_overriden =
false;
248 static_cast<void>(Not_overriden);
256template <
class T,
class R =
void>
257struct MessageInterfaceIfHasRetType {
using Type = R; };
259template <
class T,
class Enable =
void>
260struct MessageInterfaceDispatchRetTypeHelper
266struct MessageInterfaceDispatchRetTypeHelper<T, typename MessageInterfaceIfHasRetType<typename T::RetType>::Type>
268 using Type =
typename T::RetType;
272using MessageInterfaceDispatchRetType =
typename MessageInterfaceDispatchRetTypeHelper<T>::Type;
274template <
typename TBase,
typename THandler>
275class MessageInterfaceHandlerBase :
public TBase
279 using DispatchRetType = MessageInterfaceDispatchRetType<Handler>;
281 DispatchRetType dispatch(Handler& handler)
283 return dispatchImpl(handler);
287 ~MessageInterfaceHandlerBase() noexcept = default;
288 virtual DispatchRetType dispatchImpl(Handler& handler)
290 static_cast<void>(handler);
291 static constexpr bool Must_not_be_called =
false;
292 static_cast<void>(Must_not_be_called);
296 std::is_void<DispatchRetType>::value
298 VoidHandleRetTypeTag,
299 NonVoidHandleRetTypeTag
301 return dispatchInternal(Tag());
305 using VoidHandleRetTypeTag = comms::details::tag::Tag1<>;
306 using NonVoidHandleRetTypeTag = comms::details::tag::Tag2<>;
308 static DispatchRetType dispatchInternal(VoidHandleRetTypeTag)
313 static DispatchRetType dispatchInternal(NonVoidHandleRetTypeTag)
315 using RetTypeInternal =
typename std::decay<DispatchRetType>::type;
316 static const RetTypeInternal Ret = RetTypeInternal();
323template <
typename TBase>
324class MessageInterfaceRefreshBase :
public TBase
329 return refreshImpl();
333 ~MessageInterfaceRefreshBase() noexcept = default;
334 virtual
bool refreshImpl()
342template <
typename TBase>
343class MessageInterfaceNameBase :
public TBase
346 const char* name()
const
352 ~MessageInterfaceNameBase() noexcept = default;
353 virtual const
char* nameImpl() const = 0;
358template <typename TBase>
359class MessageInterfaceVirtDestructorBase : public TBase
362 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:36
comms::option::app::WriteIterator< TIter > WriteIterator
Same as comms::option::app::WriteIterator.
Definition options.h:1983
comms::option::app::Handler< T > Handler
Same as comms::option::app::Handler.
Definition options.h:2008
comms::option::app::ReadIterator< TIter > ReadIterator
Same as comms::option::app::ReadIterator.
Definition options.h:1978
comms::option::def::VersionType< T > VersionType
Same as comms::option::def::VersionType.
Definition options.h:1930
comms::option::def::Endian< TEndian > Endian
Same as comms::option::def::Endian.
Definition options.h:1473
comms::option::def::MsgIdType< T > MsgIdType
Same as comms::option::def::MsgIdType.
Definition options.h:1486
T readData(TIter &iter, const traits::endian::Big &endian)
Same as readBig<T, TIter>()
Definition access.h:775
void writeData(T value, TIter &iter, const traits::endian::Big &endian)
Same as writeBig<T, TIter>()
Definition access.h:707
Main namespace for all classes / functions of COMMS library.
ErrorStatus
Error statuses reported by the Communication module.
Definition ErrorStatus.h:19
@ NotSupported
The operation is not supported.
constexpr unsigned version()
Version of the COMMS library as single numeric value.
Definition version.h:66
Contains definition of all the options used by the COMMS library.
Replacement to std::conditional.
Definition type_traits.h:32
Replacement to some types from standard type_traits.