17#include "comms/details/protocol_layers_access.h"
18#include "comms/details/detect.h"
19#include "comms/details/tag.h"
21#include "comms/frame/details/FrameLayerBaseOptionsParser.h"
22#include "comms/frame/details/FrameLayerDetails.h"
35COMMS_MSVC_WARNING_PUSH
36COMMS_MSVC_WARNING_DISABLE(4100)
74 using ParsedOptions = details::FrameLayerBaseOptionsParser<TOptions...>;
83 std::declval<std::tuple<Field> >(),
84 std::declval<typename TNextLayer::AllFields>())
100 using MsgPtr =
typename details::FrameLayerMsgPtr<NextLayer>::Type;
106 static const std::size_t NumOfLayers = 1 + NextLayer::NumOfLayers;
118 template <
typename... TArgs>
120 m_nextLayer(
std::forward<TArgs>(args)...)
151 return static_cast<const ThisLayer&
>(*this);
158 return (!ParsedOptions::HasDisallowReadUntilDataSplit) && NextLayer::canSplitRead();
216 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
221 TExtraValues... extraValues)
224 typename comms::util::LazyShallowConditional<
225 ParsedOptions::HasForceReadUntilDataSplit
231 static_assert(std::is_same<Tag, NormalReadTag<> >::value || canSplitRead(),
232 "Read split is disallowed by at least one of the inner layers");
233 return readInternal(msg, iter, size, Tag(), extraValues...);
260 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
265 TExtraValues... extraValues)
269 auto& derivedObj =
static_cast<TDerived&
>(*this);
270 auto reader = createNextLayerUntilDataReader();
303 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
308 TExtraValues... extraValues)
310 return nextLayer().readFromData(msg, iter, size, extraValues...);
338 template <
typename TAllFields,
typename TMsg,
typename TIter,
typename... TExtraValues>
340 TAllFields& allFields,
344 TExtraValues... extraValues)
346 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
347 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
348 static const std::size_t Idx =
349 std::tuple_size<AllFieldsDecayed>::value -
350 std::tuple_size<AllFields>::value;
351 auto& field = getField<Idx>(allFields);
352 auto& derivedObj =
static_cast<TDerived&
>(*this);
353 auto reader = createNextLayerCachedFieldsReader(allFields);
389 template <
typename TAllFields,
typename TMsg,
typename TIter,
typename... TExtraValues>
391 TAllFields& allFields,
395 TExtraValues... extraValues)
397 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
398 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
399 static const std::size_t Idx =
400 std::tuple_size<AllFieldsDecayed>::value -
401 std::tuple_size<AllFields>::value;
403 auto& field = getField<Idx>(allFields);
404 auto& derivedObj =
static_cast<TDerived&
>(*this);
405 auto reader = createNextLayerCachedFieldsUntilDataReader(allFields);
439 template <
typename TAllFields,
typename TMsg,
typename TIter,
typename... TExtraValues>
441 TAllFields& allFields,
445 TExtraValues... extraValues)
447 return nextLayer().readFromDataFieldsCached(allFields, msg, iter, size, extraValues...);
489 template <
typename TMsg,
typename TIter>
493 std::size_t size)
const
496 auto& derivedObj =
static_cast<const TDerived&
>(*this);
497 auto writer = createNextLayerWriter();
498 return derivedObj.doWrite(field, msg, iter, size, writer);
518 template <
typename TAllFields,
typename TMsg,
typename TIter>
520 TAllFields& allFields,
523 std::size_t size)
const
525 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
526 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
527 static const std::size_t Idx =
528 std::tuple_size<AllFieldsDecayed>::value -
529 std::tuple_size<AllFields>::value;
531 auto& field = getField<Idx>(allFields);
532 auto& derivedObj =
static_cast<const TDerived&
>(*this);
533 auto writer = createNextLayerCachedFieldsWriter(allFields);
534 return derivedObj.doWrite(field, msg, iter, size, writer);
547 return thisLayer().doFieldLength() + m_nextLayer.length();
562 template <
typename TMsg>
563 constexpr std::size_t
length(
const TMsg& msg)
const
565 return thisLayer().doFieldLength(msg) + m_nextLayer.length(msg);
604 template <
typename TIter>
608 auto& derivedObj =
static_cast<const TDerived&
>(*this);
609 auto updater = createNextLayerUpdater();
610 return derivedObj.doUpdate(field, iter, size, updater);
620 template <
typename TMsg,
typename TIter>
624 auto& derivedObj =
static_cast<const TDerived&
>(*this);
625 auto updater = createNextLayerUpdater();
626 return derivedObj.doUpdate(msg, field, iter, size, updater);
644 template <
typename TAllFields,
typename TIter>
646 TAllFields& allFields,
648 std::size_t size)
const
650 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
651 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
652 static const std::size_t Idx =
653 std::tuple_size<AllFieldsDecayed>::value -
654 std::tuple_size<AllFields>::value;
656 auto& field = getField<Idx>(allFields);
657 auto& derivedObj =
static_cast<const TDerived&
>(*this);
658 auto updater = createNextLayerCachedFieldsUpdater(allFields);
659 return derivedObj.doUpdate(field, iter, size, updater);
679 template <
typename TAllFields,
typename TMsg,
typename TIter>
681 TAllFields& allFields,
684 std::size_t size)
const
686 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
687 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
688 static const std::size_t Idx =
689 std::tuple_size<AllFieldsDecayed>::value -
690 std::tuple_size<AllFields>::value;
692 auto& field = getField<Idx>(allFields);
693 auto& derivedObj =
static_cast<const TDerived&
>(*this);
694 auto updater = createNextLayerCachedFieldsUpdater(allFields);
695 return derivedObj.doUpdate(msg, field, iter, size, updater);
710 template <
typename TIter,
typename TNextLayerUpdater>
715 TNextLayerUpdater&& nextLayerUpdater)
const
717 return updateInternal(field, iter, size, std::forward<TNextLayerUpdater>(nextLayerUpdater), LengthTag<>());
731 template <
typename TMsg,
typename TIter,
typename TNextLayerUpdater>
737 TNextLayerUpdater&& nextLayerUpdater)
const
739 return updateInternal(msg, field, iter, size, std::forward<TNextLayerUpdater>(nextLayerUpdater), LengthTag<>());
750 return Field::minLength();
760 template <
typename TMsg>
763 return doFieldLength();
775 template <
typename TId>
778 return nextLayer().createMsg(std::forward<TId>(
id), idx);
785 template <
typename TAllFields>
787 decltype(std::get<std::tuple_size<typename std::decay<TAllFields>::type>::value - std::tuple_size<AllFields>::value>(allFields))
789 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
790 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
791 static const std::size_t Idx =
792 std::tuple_size<AllFieldsDecayed>::value -
793 std::tuple_size<AllFields>::value;
795 return std::get<Idx>(allFields);
807 template <
typename TMsg,
typename TIter>
810 static_cast<void>(msgPtr);
811 return field.read(iter, len);
822 template <
typename TMsg,
typename TIter>
825 static_cast<void>(msgPtr);
826 return field.write(iter, len);
833 template <
typename T>
836 return comms::details::hasImplOptions<T>();
842 template <
typename TMsg>
845 resetMsgInternal(msg, MsgTypeTag<
typename std::decay<
decltype(msg)>::type>());
849 template <
typename... TParams>
850 using MessageObjTag = comms::details::tag::Tag5<>;
852 template <
typename... TParams>
853 using SmartPtrTag = comms::details::tag::Tag6<>;
855 template <
typename TMsg>
857 typename comms::util::LazyShallowConditional<
858 comms::isMessage<TMsg>()
864 template <
typename TMsg,
typename... TParams>
865 static auto toMsgPtrInternal(TMsg& msg, MessageObjTag<TParams...>) ->
decltype(&msg)
870 template <
typename TMsg,
typename... TParams>
871 static auto toMsgPtrInternal(TMsg& msg, SmartPtrTag<TParams...>) ->
decltype(msg.get())
881 template <
typename TMsg>
882 static auto toMsgPtr(TMsg& msg) ->
decltype(toMsgPtrInternal(msg, MsgTypeTag<
typename std::decay<
decltype(msg)>::type>()))
884 return toMsgPtrInternal(msg, MsgTypeTag<
typename std::decay<
decltype(msg)>::type>());
895 template <
typename... TExtraValues>
898 return updateMissingSizeInternal(size, extraValues...);
910 template <
typename... TExtraValues>
914 TExtraValues... extraValues)
const
916 return updateMissingSizeInternal(field, size, extraValues...);
926 template <
typename... TExtraValues>
929 TExtraValues... extraValues)
const
931 return setMissingSizeInternal(val, extraValues...);
941 template <
typename TId,
typename... TExtraValues>
944 TExtraValues... extraValues)
const
946 return setMsgIdInternal(val, extraValues...);
956 template <
typename... TExtraValues>
959 TExtraValues... extraValues)
const
961 return setMsgIndexInternal(val, extraValues...);
967 template <std::
size_t TIdx,
typename TAllFields>
971 "Expected TAllFields to be a tuple");
972 static_assert(TIdx < std::tuple_size<TAllFields>::value,
973 "Invalid tuple access index");
975 auto& field = std::get<TIdx>(allFields);
977 using FieldType =
typename std::decay<
decltype(field)>::type;
979 std::is_same<Field, FieldType>::value,
980 "Field has wrong type");
986 template <
typename... TParams>
987 using FixedLengthTag = comms::details::tag::Tag1<>;
989 template <
typename... TParams>
990 using VarLengthTag = comms::details::tag::Tag2<>;
992 static constexpr std::size_t MinFieldLength = Field::minLength();
993 static constexpr std::size_t MaxFieldLength = Field::maxLength();
995 template <
typename...>
997 typename comms::util::LazyShallowConditional<
998 (MinFieldLength == MaxFieldLength)
1004 class NextLayerReader
1007 explicit NextLayerReader(NextLayer& nextLayer)
1008 : m_nextLayer(nextLayer)
1012 template <
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1017 TExtraValues... extraValues)
1019 return m_nextLayer.read(msg, iter, size, extraValues...);
1022 NextLayer& m_nextLayer;
1025 class NextLayerUntilDataReader
1028 explicit NextLayerUntilDataReader(NextLayer& nextLayer)
1029 : m_nextLayer(nextLayer)
1033 template <
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1038 TExtraValues... extraValues)
1040 return m_nextLayer.readUntilData(msg, iter, size, extraValues...);
1043 NextLayer& m_nextLayer;
1046 template <
typename TAllFields>
1047 class NextLayerCachedFieldsReader
1050 NextLayerCachedFieldsReader(
1051 NextLayer& nextLayer,
1052 TAllFields& allFields)
1053 : m_nextLayer(nextLayer),
1054 m_allFields(allFields)
1058 template<
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1063 TExtraValues... extraValues)
1065 return m_nextLayer.readFieldsCached(m_allFields, msg, iter, size, extraValues...);
1069 NextLayer& m_nextLayer;
1070 TAllFields& m_allFields;
1073 template <
typename TAllFields>
1074 class NextLayerCachedFieldsUntilDataReader
1077 NextLayerCachedFieldsUntilDataReader(
1078 NextLayer& nextLayer,
1079 TAllFields& allFields)
1080 : m_nextLayer(nextLayer),
1081 m_allFields(allFields)
1085 template<
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1090 TExtraValues... extraValues)
1092 return m_nextLayer.readUntilDataFieldsCache(m_allFields, msg, iter, size, extraValues...);
1096 NextLayer& m_nextLayer;
1097 TAllFields& m_allFields;
1100 class NextLayerWriter
1104 explicit NextLayerWriter(
const NextLayer& nextLayer)
1105 : m_nextLayer(nextLayer)
1109 template <
typename TMsg,
typename TIter>
1110 ErrorStatus write(
const TMsg& msg, TIter& iter, std::size_t size)
const
1112 return m_nextLayer.write(msg, iter, size);
1116 const NextLayer& m_nextLayer;
1119 template <
typename TAllFields>
1120 class NextLayerCachedFieldsWriter
1123 NextLayerCachedFieldsWriter(
1124 const NextLayer& nextLayer,
1125 TAllFields& allFields)
1126 : m_nextLayer(nextLayer),
1127 m_allFields(allFields)
1131 template <
typename TMsg,
typename TIter>
1132 ErrorStatus write(
const TMsg& msg, TIter& iter, std::size_t size)
const
1134 return m_nextLayer.writeFieldsCached(m_allFields, msg, iter, size);
1138 const NextLayer& m_nextLayer;
1139 TAllFields& m_allFields;
1142 class NextLayerUpdater
1146 explicit NextLayerUpdater(
const NextLayer& nextLayer)
1147 : m_nextLayer(nextLayer)
1151 template <
typename TIter>
1152 ErrorStatus update(TIter& iter, std::size_t size)
const
1154 return m_nextLayer.update(iter, size);
1157 template <
typename TMsg,
typename TIter>
1158 ErrorStatus update(
const TMsg& msg, TIter& iter, std::size_t size)
const
1160 return m_nextLayer.update(msg, iter, size);
1164 const NextLayer& m_nextLayer;
1167 template <
typename TAllFields>
1168 class NextLayerCachedFieldsUpdater
1171 NextLayerCachedFieldsUpdater(
1172 const NextLayer& nextLayer,
1173 TAllFields& allFields)
1174 : m_nextLayer(nextLayer),
1175 m_allFields(allFields)
1179 template <
typename TIter>
1180 ErrorStatus update(TIter& iter, std::size_t size)
const
1182 return m_nextLayer.updateFieldsCached(m_allFields, iter, size);
1185 template <
typename TMsg,
typename TIter>
1186 ErrorStatus update(
const TMsg& msg, TIter& iter, std::size_t size)
const
1188 return m_nextLayer.updateFieldsCached(m_allFields, msg, iter, size);
1192 const NextLayer& m_nextLayer;
1193 TAllFields& m_allFields;
1196 NextLayerReader createNextLayerReader()
1198 return NextLayerReader(m_nextLayer);
1201 NextLayerUntilDataReader createNextLayerUntilDataReader()
1203 return NextLayerUntilDataReader(m_nextLayer);
1206 template <
typename TAllFields>
1207 NextLayerCachedFieldsReader<TAllFields>
1208 createNextLayerCachedFieldsReader(TAllFields& fields)
1210 return NextLayerCachedFieldsReader<TAllFields>(m_nextLayer, fields);
1213 template <
typename TAllFields>
1214 NextLayerCachedFieldsUntilDataReader<TAllFields>
1215 createNextLayerCachedFieldsUntilDataReader(TAllFields& fields)
1217 return NextLayerCachedFieldsUntilDataReader<TAllFields>(m_nextLayer, fields);
1220 NextLayerWriter createNextLayerWriter()
const
1222 return NextLayerWriter(m_nextLayer);
1225 template <
typename TAllFields>
1226 NextLayerCachedFieldsWriter<TAllFields>
1227 createNextLayerCachedFieldsWriter(TAllFields& fields)
const
1229 return NextLayerCachedFieldsWriter<TAllFields>(m_nextLayer, fields);
1232 NextLayerUpdater createNextLayerUpdater()
const
1234 return NextLayerUpdater(m_nextLayer);
1237 template <
typename TAllFields>
1238 NextLayerCachedFieldsUpdater<TAllFields>
1239 createNextLayerCachedFieldsUpdater(TAllFields& fields)
const
1241 return NextLayerCachedFieldsUpdater<TAllFields>(m_nextLayer, fields);
1247 template <
typename... TParams>
1248 using NormalReadTag = comms::details::tag::Tag3<>;
1250 template <
typename... TParams>
1251 using SplitReadTag = comms::details::tag::Tag4<>;
1253 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
1259 TExtraValues... extraValues)
1262 auto& derivedObj =
static_cast<TDerived&
>(*this);
1263 auto reader = createNextLayerReader();
1264 return derivedObj.doRead(field, msg, iter, size, reader, extraValues...);
1267 template <
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1273 TExtraValues... extraValues)
1275 auto fromIter = iter;
1276 auto es = readUntilData(msgPtr, iter, size, extraValues...);
1281 auto consumed =
static_cast<std::size_t
>(std::distance(fromIter, iter));
1283 return readFromData(msgPtr, iter, size - consumed, extraValues...);
1286 template <
typename TIter,
typename TNextLayerUpdater,
typename... TParams>
1291 TNextLayerUpdater&& nextLayerUpdater,
1292 FixedLengthTag<TParams...>)
const
1294 auto len = field.length();
1296 std::advance(iter, len);
1297 return nextLayerUpdater.update(iter, size - len);
1300 template <
typename TIter,
typename TNextLayerUpdater,
typename... TParams>
1305 TNextLayerUpdater&& nextLayerUpdater,
1306 VarLengthTag<TParams...>)
const
1308 auto iterTmp = iter;
1309 auto es = field.read(iter, size);
1311 auto diff =
static_cast<std::size_t
>(std::distance(iterTmp, iter));
1312 es = nextLayerUpdater.update(iter, size - diff);
1317 template <
typename TMsg,
typename TIter,
typename TNextLayerUpdater,
typename... TParams>
1323 TNextLayerUpdater&& nextLayerUpdater,
1324 FixedLengthTag<TParams...>)
const
1326 auto len = field.length();
1328 std::advance(iter, len);
1329 return nextLayerUpdater.update(msg, iter, size - len);
1332 template <
typename TMsg,
typename TIter,
typename TNextLayerUpdater,
typename... TParams>
1338 TNextLayerUpdater&& nextLayerUpdater,
1339 VarLengthTag<TParams...>)
const
1341 auto iterTmp = iter;
1342 auto es = field.read(iter, size);
1344 auto diff =
static_cast<std::size_t
>(std::distance(iterTmp, iter));
1345 es = nextLayerUpdater.update(msg, iter, size - diff);
1350 template <
typename TMsg,
typename... TParams>
1351 static void resetMsgInternal(TMsg&, MessageObjTag<TParams...>)
1356 template <
typename TMsg,
typename... TParams>
1357 static void resetMsgInternal(TMsg& msg, SmartPtrTag<TParams...>)
1362 static void updateMissingSizeInternal(std::size_t size)
1364 static_cast<void>(size);
1367 static void updateMissingSizeInternal(
const Field& field, std::size_t size)
1369 static_cast<void>(field);
1370 static_cast<void>(size);
1373 template <
typename... TExtraValues>
1374 void updateMissingSizeInternal(
1376 details::MissingSizeRetriever<> retriever,
1377 TExtraValues... extraValues)
const
1380 retriever.setValue(std::max(std::size_t(1U), length() - size));
1381 updateMissingSizeInternal(size, extraValues...);
1384 template <
typename... TExtraValues>
1385 void updateMissingSizeInternal(
1388 details::MissingSizeRetriever<> retriever,
1389 TExtraValues... extraValues)
const
1392 details::isMissingSizeRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1393 "Must be missing size retriever");
1394 auto totalLen = field.length() + m_nextLayer.length();
1396 retriever.setValue(std::max(std::size_t(1U), totalLen - size));
1397 updateMissingSizeInternal(size, extraValues...);
1400 template <
typename T,
typename... TExtraValues>
1401 void updateMissingSizeInternal(
1404 TExtraValues... extraValues)
const
1406 static_cast<void>(retriever);
1408 !details::isMissingSizeRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1409 "Mustn't be missing size retriever");
1410 updateMissingSizeInternal(size, extraValues...);
1413 template <
typename T,
typename... TExtraValues>
1414 void updateMissingSizeInternal(
1418 TExtraValues... extraValues)
const
1420 static_cast<void>(retriever);
1422 !details::isMissingSizeRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1423 "Mustn't be missing size retriever");
1424 updateMissingSizeInternal(field, size, extraValues...);
1427 static void setMissingSizeInternal(std::size_t val)
1429 static_cast<void>(val);
1432 template <
typename... TExtraValues>
1433 static void setMissingSizeInternal(
1435 details::MissingSizeRetriever<> retriever,
1436 TExtraValues... extraValues)
1438 retriever.setValue(val);
1439 setMissingSizeInternal(val, extraValues...);
1442 template <
typename T,
typename... TExtraValues>
1443 static void setMissingSizeInternal(
1446 TExtraValues... extraValues)
1448 static_cast<void>(retriever);
1450 !details::isMissingSizeRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1451 "Mustn't be missing size retriever");
1452 setMissingSizeInternal(val, extraValues...);
1455 template <
typename TId>
1456 static void setMsgIdInternal(TId val)
1458 static_cast<void>(val);
1461 template <
typename TId,
typename U,
typename... TExtraValues>
1462 static void setMsgIdInternal(
1464 details::MsgIdRetriever<U> retriever,
1465 TExtraValues... extraValues)
1467 retriever.setValue(val);
1468 setMsgIdInternal(val, extraValues...);
1471 template <
typename TId,
typename T,
typename... TExtraValues>
1472 static void setMsgIdInternal(
1475 TExtraValues... extraValues)
1477 static_cast<void>(retriever);
1479 !details::isMsgIdRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1480 "Mustn't be message id retriever");
1481 setMsgIdInternal(val, extraValues...);
1484 static void setMsgIndexInternal(std::size_t val)
1486 static_cast<void>(val);
1489 template <
typename... TExtraValues>
1490 static void setMsgIndexInternal(
1492 details::MsgIndexRetriever retriever,
1493 TExtraValues... extraValues)
1495 retriever.setValue(val);
1496 setMsgIndexInternal(val, extraValues...);
1499 template <
typename T,
typename... TExtraValues>
1500 static void setMsgIndexInternal(
1503 TExtraValues... extraValues)
1505 static_cast<void>(retriever);
1507 !details::isMsgIndexRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1508 "Mustn't be missing size retriever");
1509 setMsgIndexInternal(val, extraValues...);
1513 NextLayer m_nextLayer;
1520 typename TNextLayer,
1522 typename... TOptions>
1523FrameLayerBase<TField, TNextLayer, TDerived, TOptions...>&
1533 typename TNextLayer,
1535 typename... TOptions>
1537const FrameLayerBase<TField, TNextLayer, TDerived, TOptions...>&
1566 return details::MissingSizeRetriever<>(val);
1589template <
typename TId>
1590details::MsgIdRetriever<TId>
msgId(TId& val)
1592 return details::MsgIdRetriever<TId>(val);
1629 return details::MsgIndexRetriever(val);
1654template <
typename TIter>
1655details::MsgPayloadRetriever<TIter>
msgPayload(TIter& iter, std::size_t& len)
1657 return details::MsgPayloadRetriever<TIter>(iter, len);
1670#define COMMS_FRAME_LAYERS_ACCESS(...) \
1671 COMMS_DO_ACCESS_LAYER_ACC_FUNC(__VA_ARGS__)
1679#define COMMS_FRAME_LAYERS_NAMES(...) \
1680 COMMS_DO_LAYER_TYPE_ALIAS(Base, __VA_ARGS__) \
1681 COMMS_DO_ACCESS_LAYER_ACC_FUNC(__VA_ARGS__)
1685#define COMMS_FRAME_LAYERS_ACCESS_INNER(...) \
1686 COMMS_FRAME_LAYERS_ACCESS(__VA_ARGS__)
1690#define COMMS_FRAME_LAYERS_NAMES_INNER(...) \
1691 COMMS_FRAME_LAYERS_NAMES(__VA_ARGS__)
1701#define COMMS_FRAME_LAYERS_ACCESS_OUTER(...) \
1702 COMMS_FRAME_LAYERS_ACCESS(COMMS_EXPAND(COMMS_REVERSE_MACRO_ARGS(__VA_ARGS__)))
1710#define COMMS_FRAME_LAYERS_NAMES_OUTER(...) \
1711 COMMS_FRAME_LAYERS_NAMES(COMMS_EXPAND(COMMS_REVERSE_MACRO_ARGS(__VA_ARGS__)))
1713COMMS_MSVC_WARNING_POP
This file contains classes required for generic custom assertion functionality.
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
Contains various compiler related definitions.
This file contain definition of error statuses used by comms module.
Contains definition of Message object interface and various base classes for custom messages.
Contains various tuple type manipulation classes and functions.
Base class for all the middle (non MsgDataLayer) protocol transport layers.
Definition FrameLayerBase.h:65
const NextLayer & nextLayer() const
Get "const" access to the next layer object.
Definition FrameLayerBase.h:137
FrameLayerBase(const FrameLayerBase &)=default
Copy constructor.
comms::ErrorStatus write(const TMsg &msg, TIter &iter, std::size_t size) const
Serialise message into output data sequence.
Definition FrameLayerBase.h:490
MsgPtr createMsg(TId &&id, unsigned idx=0)
Create message object given the ID.
Definition FrameLayerBase.h:776
comms::ErrorStatus update(TIter &iter, std::size_t size) const
Update recently written (using write()) message contents data.
Definition FrameLayerBase.h:605
static constexpr std::size_t doFieldLength()
Default implementation of field length retrieval.
Definition FrameLayerBase.h:748
~FrameLayerBase() noexcept=default
Desctructor.
comms::ErrorStatus readFromData(TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
Finalise the read operation by reading the message payload.
Definition FrameLayerBase.h:304
comms::ErrorStatus writeFieldsCached(TAllFields &allFields, const TMsg &msg, TIter &iter, std::size_t size) const
Serialise message into output data sequence while caching the written transport information fields.
Definition FrameLayerBase.h:519
typename NextLayer::MsgFactory MsgFactory
Type of message factory.
Definition FrameLayerBase.h:96
ThisLayer & thisLayer()
Get access to this layer object.
Definition FrameLayerBase.h:143
constexpr std::size_t length(const TMsg &msg) const
Get remaining length of wrapping transport information + length of the provided message.
Definition FrameLayerBase.h:563
static constexpr bool canSplitRead()
Compile time check whether split read "until" and "from" data layer is allowed.
Definition FrameLayerBase.h:156
ErrorStatus updateFieldsCached(TAllFields &allFields, TIter &iter, std::size_t size) const
Update recently written (using writeFieldsCached()) message data as well as cached transport informat...
Definition FrameLayerBase.h:645
details::FrameLayerBaseOptionsParser< TOptions... > ParsedOptions
Parsed options structure.
Definition FrameLayerBase.h:74
static Field & getField(TAllFields &allFields)
Retrieve reference to a layer specific field out of all fields.
Definition FrameLayerBase.h:968
void setMsgIndex(std::size_t val, TExtraValues... extraValues) const
Set the message index information if such is requested.
Definition FrameLayerBase.h:957
void setMissingSize(std::size_t val, TExtraValues... extraValues) const
Set the missing size information if such is requested.
Definition FrameLayerBase.h:927
void updateMissingSize(const Field &field, std::size_t size, TExtraValues... extraValues) const
Update the missing size information if such is requested.
Definition FrameLayerBase.h:911
ErrorStatus updateFieldsCached(TAllFields &allFields, const TMsg &msg, TIter &iter, std::size_t size) const
Update recently written (using writeFieldsCached()) message data as well as cached transport informat...
Definition FrameLayerBase.h:680
static constexpr std::size_t doFieldLength(const TMsg &)
Default implementation of field length retrieval when message is known.
Definition FrameLayerBase.h:761
comms::ErrorStatus readUntilData(TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
Perform read of data fields until data layer (message payload).
Definition FrameLayerBase.h:261
typename details::FrameLayerMsgPtr< NextLayer >::Type MsgPtr
Type of pointer to the message.
Definition FrameLayerBase.h:100
static comms::ErrorStatus doWriteField(const TMsg *msgPtr, const Field &field, TIter &iter, std::size_t len)
Write the layer field.
Definition FrameLayerBase.h:823
comms::ErrorStatus readUntilDataFieldsCached(TAllFields &allFields, TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
Perform read of data fields until data layer (message payload) while caching the read transport infor...
Definition FrameLayerBase.h:390
FrameLayerBase(FrameLayerBase &&)=default
Move constructor.
static auto accessCachedField(TAllFields &allFields) -> decltype(std::get< std::tuple_size< typename std::decay< TAllFields >::type >::value - std::tuple_size< AllFields >::value >(allFields))
Access appropriate field from "cached" bundle of all the frame fields.
Definition FrameLayerBase.h:786
comms::ErrorStatus doUpdate(const TMsg &msg, Field &field, TIter &iter, std::size_t size, TNextLayerUpdater &&nextLayerUpdater) const
Default implementation of the "update" functaionality.
Definition FrameLayerBase.h:732
typename std::decay< decltype(std::tuple_cat(std::declval< std::tuple< Field > >(), std::declval< typename TNextLayer::AllFields >())) >::type AllFields
Type of all the fields of all the transport layers wrapped in std::tuple.
Definition FrameLayerBase.h:86
void updateMissingSize(std::size_t size, TExtraValues... extraValues) const
Update the missing size information if such is requested.
Definition FrameLayerBase.h:896
TField Field
Type of the field used for this layer.
Definition FrameLayerBase.h:68
comms::ErrorStatus doUpdate(Field &field, TIter &iter, std::size_t size, TNextLayerUpdater &&nextLayerUpdater) const
Default implementation of the "update" functaionality.
Definition FrameLayerBase.h:711
constexpr std::size_t length() const
Get remaining length of wrapping transport information.
Definition FrameLayerBase.h:545
TDerived ThisLayer
Actual derived class.
Definition FrameLayerBase.h:103
static comms::ErrorStatus doReadField(const TMsg *msgPtr, Field &field, TIter &iter, std::size_t len)
Read the layer field.
Definition FrameLayerBase.h:808
comms::ErrorStatus read(TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
Deserialise message from the input data sequence.
Definition FrameLayerBase.h:217
typename NextLayer::AllMessages AllMessages
All supported messages.
Definition FrameLayerBase.h:91
static auto toMsgPtr(TMsg &msg) -> decltype(toMsgPtrInternal(msg, MsgTypeTag< typename std::decay< decltype(msg)>::type >()))
Get a pointer to the message object.
Definition FrameLayerBase.h:882
FrameLayerBase(TArgs &&... args)
Constructor.
Definition FrameLayerBase.h:119
comms::ErrorStatus readFromDataFieldsCached(TAllFields &allFields, TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
Finalise the read operation by reading the message payload while caching the read transport informati...
Definition FrameLayerBase.h:440
static void resetMsg(TMsg &msg)
Reset msg in case it is a smart pointer (MsgPtr).
Definition FrameLayerBase.h:843
TNextLayer NextLayer
Type of the next transport layer.
Definition FrameLayerBase.h:71
comms::ErrorStatus readFieldsCached(TAllFields &allFields, TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
Deserialise message from the input data sequence while caching the read transport information fields.
Definition FrameLayerBase.h:339
void setMsgId(TId val, TExtraValues... extraValues) const
Set the message ID information if such is requested.
Definition FrameLayerBase.h:942
const ThisLayer & thisLayer() const
Get "const" access to this layer object.
Definition FrameLayerBase.h:149
comms::ErrorStatus update(const TMsg &msg, TIter &iter, std::size_t size) const
Update recently written (using write()) message contents data.
Definition FrameLayerBase.h:621
static constexpr bool isMessageObjRef()
Detect whether type is actual message object.
Definition FrameLayerBase.h:834
details::MissingSizeRetriever missingSize(std::size_t &val)
Add "missing size" output parameter to frame's "read" operation.
Definition FrameLayerBase.h:1564
details::MsgPayloadRetriever< TIter > msgPayload(TIter &iter, std::size_t &len)
Add "payload start" and "payload size" output parameters to frame's "read" operation.
Definition FrameLayerBase.h:1655
details::MsgIndexRetriever msgIndex(std::size_t &val)
Add "message index" output parameter to frame's "read" operation.
Definition FrameLayerBase.h:1627
FrameLayerBase< TField, TNextLayer, TDerived, TOptions... > & toFrameLayerBase(FrameLayerBase< TField, TNextLayer, TDerived, TOptions... > &layer)
Upcast protocol layer in order to have access to its internal types.
Definition FrameLayerBase.h:1524
details::MsgIdRetriever< TId > msgId(TId &val)
Add "message ID" output parameter to frame's "read" operation.
Definition FrameLayerBase.h:1590
Main namespace for all classes / functions of COMMS library.
ErrorStatus
Error statuses reported by the Communication module.
Definition ErrorStatus.h:19
@ Success
Used to indicate successful outcome of the operation.
Contains definition of all the options used by the COMMS library.
Check whether provided type is a variant of std::tuple.
Definition Tuple.h:39
Replacement to some types from standard type_traits.