15#include "comms/details/tag.h"
16#include "comms/frame/details/TransportValueLayerOptionsParser.h"
17#include "comms/frame/details/TransportValueLayerBase.h"
22COMMS_MSVC_WARNING_PUSH
23COMMS_MSVC_WARNING_DISABLE(4189)
64template <
typename TField, std::size_t TIdx,
typename TNextLayer,
typename... TOptions>
65class TransportValueLayer :
public comms::frame::details::TransportValueLayerBase<TField, TIdx, TNextLayer, TOptions...>
67 using BaseImpl = comms::frame::details::TransportValueLayerBase<TField, TIdx, TNextLayer, TOptions...>;
68 using ParsedOptionsInternal = comms::frame::details::TransportValueLayerOptionsParser<TOptions...>;
72 using Field =
typename BaseImpl::Field;
88 static constexpr
bool hasExtendingClass()
90 return ParsedOptionsInternal::HasExtendingClass;
97 return ParsedOptionsInternal::HasPseudoValue;
133 template <
typename TMsg,
typename TIter,
typename TNextLayerReader,
typename... TExtraValues>
139 TNextLayerReader&& nextLayerReader,
140 TExtraValues... extraValues)
142 auto es = readFieldInternal(field, msg, iter, size, ValueTag<>(), extraValues...);
147 static constexpr bool ForcedReadUntilDataSplit =
148 BaseImpl::ParsedOptions::HasForceReadUntilDataSplit;
150 if (ForcedReadUntilDataSplit) {
151 es = nextLayerReader.read(msg, iter, size, extraValues...);
158 auto& thisObj = BaseImpl::thisLayer();
159 auto* msgPtr = BaseImpl::toMsgPtr(msg);
160 bool success = thisObj.reassignFieldValueToMsg(field, msgPtr);
165 if (!ForcedReadUntilDataSplit) {
166 es = nextLayerReader.read(msg, iter, size, extraValues...);
189 template <
typename TMsg,
typename TIter,
typename TNextLayerWriter>
195 TNextLayerWriter&& nextLayerWriter)
const
197 auto& thisObj = BaseImpl::thisLayer();
198 thisObj.prepareFieldForWrite(msg, field);
200 auto es = writeFieldInternal(field, msg, iter, size, ValueTag<>());
201 if (es != ErrorStatus::Success) {
205 return nextLayerWriter.write(msg, iter, size);
213 return doFieldLengthInternal(ValueTag<>());
219 template <
typename TMsg>
222 return doFieldLength();
225#ifdef FOR_DOXYGEN_DOC_ONLY
249 template <
typename TMsg>
252 using MsgType =
typename std::decay<
decltype(msg)>::type;
253 static_assert(MsgType::hasTransportFields(),
254 "Message interface class hasn't defined transport fields, "
255 "use comms::option::def::ExtraTransportFields option.");
256 static_assert(TIdx < std::tuple_size<typename MsgType::TransportFields>::value,
257 "TIdx is too big, exceeds the amount of transport fields defined in interface class");
259 auto& allTransportFields = msg.transportFields();
260 auto& transportField = std::get<TIdx>(allTransportFields);
262 using FieldType =
typename std::decay<
decltype(transportField)>::type;
263 transportField = comms::field_cast<FieldType>(field);
278 template <
typename TMsg>
281 if (msgPtr ==
nullptr) {
285 auto& thisObj = BaseImpl::thisLayer();
286 thisObj.reassignFieldValue(*msgPtr, field);
297 template <
typename TMsg>
300 using MsgType =
typename std::decay<
decltype(msg)>::type;
301 static_assert(MsgType::hasTransportFields(),
302 "Message interface class hasn't defined transport fields, "
303 "use comms::option::def::ExtraTransportFields option.");
304 static_assert(TIdx < std::tuple_size<typename MsgType::TransportFields>::value,
305 "TIdx is too big, exceeds the amount of transport fields defined in interface class");
307 auto& transportField = std::get<TIdx>(msg.transportFields());
308 field = comms::field_cast<Field>(transportField);
313 template <
typename... TParams>
314 using PseudoValueTag = comms::details::tag::Tag1<>;
316 template <
typename... TParams>
317 using NormalValueTag = comms::details::tag::Tag2<>;
319 template <
typename...>
321 typename comms::util::LazyShallowConditional<
322 ParsedOptionsInternal::HasPseudoValue
328 template <
typename... TParams>
329 static constexpr std::size_t doFieldLengthInternal(PseudoValueTag<TParams...>)
334 template <
typename... TParams>
335 static constexpr std::size_t doFieldLengthInternal(NormalValueTag<TParams...>)
337 return BaseImpl::doFieldLength();
340 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
349 static_cast<void>(msg);
350 static_cast<void>(iter);
351 static_cast<void>(len);
352 field = BaseImpl::pseudoField();
356 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
363 TExtraValues... extraValues)
365 auto& thisObj = BaseImpl::thisLayer();
366 auto* msgPtr = BaseImpl::toMsgPtr(msg);
367 auto beforeReadIter = iter;
369 auto es = thisObj.doReadField(msgPtr, field, iter, len);
371 BaseImpl::updateMissingSize(field, len, extraValues...);
374 auto fieldLen =
static_cast<std::size_t
>(std::distance(beforeReadIter, iter));
380 template <
typename TMsg,
typename TIter,
typename... TParams>
386 PseudoValueTag<TParams...>)
const
388 static_cast<void>(msg);
389 static_cast<void>(iter);
390 static_cast<void>(len);
391 field = BaseImpl::pseudoField();
395 template <
typename TMsg,
typename TIter,
typename... TParams>
401 NormalValueTag<TParams...>)
const
403 auto& thisObj = BaseImpl::thisLayer();
404 auto es = thisObj.doWriteField(&msg, field, iter, len);
407 len -= field.length();
416struct TransportValueLayerCheckHelper
418 static const bool Value =
false;
421template <
typename TField, std::
size_t TIdx,
typename TNextLayer>
424 static const bool Value =
true;
435 return details::TransportValueLayerCheckHelper<T>::Value;
442COMMS_MSVC_WARNING_POP
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:168
Contains various compiler related definitions.
Contains definition of various casts.
Frame layer that reads a value from transport wrapping and reassigns it to appropriate "extra transpo...
Definition TransportValueLayer.h:66
comms::ErrorStatus doRead(Field &field, TMsg &msg, TIter &iter, std::size_t size, TNextLayerReader &&nextLayerReader, TExtraValues... extraValues)
Customized read functionality, invoked by read().
Definition TransportValueLayer.h:134
static constexpr bool hasPseudoValue()
Compile time inquiry of whether the comms::option::def::PseudoValue option has been used.
Definition TransportValueLayer.h:95
typename BaseImpl::Field Field
Type of the field object used to read/write "sync" value.
Definition TransportValueLayer.h:72
TransportValueLayer(TransportValueLayer &&)=default
Move constructor.
~TransportValueLayer() noexcept=default
Destructor.
static constexpr std::size_t doFieldLength()
Customising field length calculation.
Definition TransportValueLayer.h:211
static void reassignFieldValue(TMsg &msg, const Field &field)
Re-assign the value from the input field to appropriate transport field in the message object.
Definition TransportValueLayer.h:250
TransportValueLayer(const TransportValueLayer &)=default
Copy constructor.
const Field & pseudoField() const
Const access to pseudo field stored internally.
static void prepareFieldForWrite(const TMsg &msg, Field &field)
Prepare field for writing.
Definition TransportValueLayer.h:298
TransportValueLayer()=default
Default constructor.
Field & pseudoField()
Access to pseudo field stored internally.
static std::size_t doFieldLength(const TMsg &)
Customising field length calculation.
Definition TransportValueLayer.h:220
constexpr bool isTransportValueLayer()
Compile time check of whether the provided type is a variant of TransportValueLayer.
Definition TransportValueLayer.h:433
bool reassignFieldValueToMsg(const Field &field, TMsg *msgPtr)
Re-assign the value from the input field to appropriate transport field in the message object.
Definition TransportValueLayer.h:279
comms::ErrorStatus doWrite(Field &field, const TMsg &msg, TIter &iter, std::size_t size, TNextLayerWriter &&nextLayerWriter) const
Customized write functionality, invoked by write().
Definition TransportValueLayer.h:190
comms::frame::TransportValueLayer< TField, TIdx, TNextLayer, TOptions... > TransportValueLayer
Alias to the comms::frame::TransportValueLayer.
Definition TransportValueLayer.h:25
Main namespace for all classes / functions of COMMS library.
ErrorStatus
Error statuses reported by the Communication module.
Definition ErrorStatus.h:17
@ Success
Used to indicate successful outcome of the operation.
Replacement to some types from standard type_traits.