15#include "comms/details/tag.h"
16#include "comms/frame/details/TransportValueLayerOptionsParser.h"
17#include "comms/frame/details/TransportValueLayerBase.h"
20COMMS_MSVC_WARNING_PUSH
21COMMS_MSVC_WARNING_DISABLE(4189)
62template <
typename TField, std::size_t TIdx,
typename TNextLayer,
typename... TOptions>
63class TransportValueLayer :
public comms::frame::details::TransportValueLayerBase<TField, TIdx, TNextLayer, TOptions...>
65 using BaseImpl = comms::frame::details::TransportValueLayerBase<TField, TIdx, TNextLayer, TOptions...>;
66 using ParsedOptionsInternal = comms::frame::details::TransportValueLayerOptionsParser<TOptions...>;
70 using Field =
typename BaseImpl::Field;
93 static constexpr
bool hasExtendingClass()
95 return ParsedOptionsInternal::HasExtendingClass;
102 return ParsedOptionsInternal::HasPseudoValue;
138 template <
typename TMsg,
typename TIter,
typename TNextLayerReader,
typename... TExtraValues>
144 TNextLayerReader&& nextLayerReader,
145 TExtraValues... extraValues)
147 auto es = readFieldInternal(field, msg, iter, size, ValueTag<>(), extraValues...);
152 static constexpr bool ForcedReadUntilDataSplit =
153 BaseImpl::ParsedOptions::HasForceReadUntilDataSplit;
155 if (ForcedReadUntilDataSplit) {
156 es = nextLayerReader.read(msg, iter, size, extraValues...);
163 auto& thisObj = BaseImpl::thisLayer();
164 auto* msgPtr = BaseImpl::toMsgPtr(msg);
165 bool success = thisObj.reassignFieldValueToMsg(field, msgPtr);
170 if (!ForcedReadUntilDataSplit) {
171 es = nextLayerReader.read(msg, iter, size, extraValues...);
194 template <
typename TMsg,
typename TIter,
typename TNextLayerWriter>
200 TNextLayerWriter&& nextLayerWriter)
const
202 auto& thisObj = BaseImpl::thisLayer();
203 thisObj.prepareFieldForWrite(msg, field);
205 auto es = writeFieldInternal(field, msg, iter, size, ValueTag<>());
206 if (es != ErrorStatus::Success) {
210 return nextLayerWriter.write(msg, iter, size);
218 return doFieldLengthInternal(ValueTag<>());
224 template <
typename TMsg>
227 return doFieldLength();
230#ifdef FOR_DOXYGEN_DOC_ONLY
254 template <
typename TMsg>
257 using MsgType =
typename std::decay<
decltype(msg)>::type;
258 static_assert(MsgType::hasTransportFields(),
259 "Message interface class hasn't defined transport fields, "
260 "use comms::option::def::ExtraTransportFields option.");
261 static_assert(TIdx < std::tuple_size<typename MsgType::TransportFields>::value,
262 "TIdx is too big, exceeds the amount of transport fields defined in interface class");
264 auto& allTransportFields = msg.transportFields();
265 auto& transportField = std::get<TIdx>(allTransportFields);
267 using FieldType =
typename std::decay<
decltype(transportField)>::type;
268 transportField = comms::field_cast<FieldType>(field);
283 template <
typename TMsg>
286 if (msgPtr ==
nullptr) {
290 auto& thisObj = BaseImpl::thisLayer();
291 thisObj.reassignFieldValue(*msgPtr, field);
302 template <
typename TMsg>
305 using MsgType =
typename std::decay<
decltype(msg)>::type;
306 static_assert(MsgType::hasTransportFields(),
307 "Message interface class hasn't defined transport fields, "
308 "use comms::option::def::ExtraTransportFields option.");
309 static_assert(TIdx < std::tuple_size<typename MsgType::TransportFields>::value,
310 "TIdx is too big, exceeds the amount of transport fields defined in interface class");
312 auto& transportField = std::get<TIdx>(msg.transportFields());
313 field = comms::field_cast<Field>(transportField);
318 template <
typename... TParams>
319 using PseudoValueTag = comms::details::tag::Tag1<>;
321 template <
typename... TParams>
322 using NormalValueTag = comms::details::tag::Tag2<>;
324 template <
typename...>
326 typename comms::util::LazyShallowConditional<
327 ParsedOptionsInternal::HasPseudoValue
334 template <
typename... TParams>
335 static constexpr std::size_t doFieldLengthInternal(PseudoValueTag<TParams...>)
340 template <
typename... TParams>
341 static constexpr std::size_t doFieldLengthInternal(NormalValueTag<TParams...>)
343 return BaseImpl::doFieldLength();
346 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
355 static_cast<void>(msg);
356 static_cast<void>(iter);
357 static_cast<void>(len);
358 field = BaseImpl::pseudoField();
362 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
369 TExtraValues... extraValues)
371 auto& thisObj = BaseImpl::thisLayer();
372 auto* msgPtr = BaseImpl::toMsgPtr(msg);
373 auto beforeReadIter = iter;
375 auto es = thisObj.doReadField(msgPtr, field, iter, len);
377 BaseImpl::updateMissingSize(field, len, extraValues...);
380 auto fieldLen =
static_cast<std::size_t
>(std::distance(beforeReadIter, iter));
386 template <
typename TMsg,
typename TIter,
typename... TParams>
392 PseudoValueTag<TParams...>)
const
394 static_cast<void>(msg);
395 static_cast<void>(iter);
396 static_cast<void>(len);
397 field = BaseImpl::pseudoField();
401 template <
typename TMsg,
typename TIter,
typename... TParams>
407 NormalValueTag<TParams...>)
const
409 auto& thisObj = BaseImpl::thisLayer();
410 auto es = thisObj.doWriteField(&msg, field, iter, len);
413 len -= field.length();
422struct TransportValueLayerCheckHelper
424 static const bool Value =
false;
427template <
typename TField, std::
size_t TIdx,
typename TNextLayer>
430 static const bool Value =
true;
441 return details::TransportValueLayerCheckHelper<T>::Value;
448COMMS_MSVC_WARNING_POP
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
Contains various compiler related definitions.
Contains definition of various casts.
Protocol layer that reads a value from transport wrapping and reassigns it to appropriate "extra tran...
Definition TransportValueLayer.h:64
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:139
static constexpr bool hasPseudoValue()
Compile time inquiry of whether the comms::option::def::PseudoValue option has been used.
Definition TransportValueLayer.h:100
typename BaseImpl::Field Field
Type of the field object used to read/write "sync" value.
Definition TransportValueLayer.h:70
TransportValueLayer(TransportValueLayer &&)=default
Move constructor.
~TransportValueLayer() noexcept=default
Destructor.
static constexpr std::size_t doFieldLength()
Customising field length calculation.
Definition TransportValueLayer.h:216
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:255
typename ParsedOptionsInternal::ExtendingClass ExtendingClass
Type of real extending class.
Definition TransportValueLayer.h:75
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:303
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:225
constexpr bool isTransportValueLayer()
Compile time check of whether the provided type is a variant of TransportValueLayer.
Definition TransportValueLayer.h:439
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:284
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:195
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.