15#include "comms/details/protocol_layers_access.h"
16#include "comms/details/detect.h"
17#include "comms/details/tag.h"
19#include "comms/frame/details/FrameLayerBaseOptionsParser.h"
20#include "comms/frame/details/FrameLayerDetails.h"
30COMMS_MSVC_WARNING_PUSH
31COMMS_MSVC_WARNING_DISABLE(4100)
69 using ParsedOptions = details::FrameLayerBaseOptionsParser<TOptions...>;
78 std::declval<std::tuple<Field> >(),
79 std::declval<typename TNextLayer::AllFields>())
95 using MsgPtr =
typename details::FrameLayerMsgPtr<NextLayer>::Type;
101 static const std::size_t NumOfLayers = 1 + NextLayer::NumOfLayers;
113 template <
typename... TArgs>
115 m_nextLayer(
std::forward<TArgs>(args)...)
146 return static_cast<const ThisLayer&
>(*this);
153 return (!ParsedOptions::HasDisallowReadUntilDataSplit) && NextLayer::canSplitRead();
211 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
216 TExtraValues... extraValues)
219 typename comms::util::LazyShallowConditional<
220 ParsedOptions::HasForceReadUntilDataSplit
226 static_assert(std::is_same<Tag, NormalReadTag<> >::value || canSplitRead(),
227 "Read split is disallowed by at least one of the inner layers");
228 return readInternal(msg, iter, size, Tag(), extraValues...);
255 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
260 TExtraValues... extraValues)
264 auto& derivedObj =
static_cast<TDerived&
>(*this);
265 auto reader = createNextLayerUntilDataReader();
298 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
303 TExtraValues... extraValues)
305 return nextLayer().readFromData(msg, iter, size, extraValues...);
333 template <
typename TAllFields,
typename TMsg,
typename TIter,
typename... TExtraValues>
335 TAllFields& allFields,
339 TExtraValues... extraValues)
341 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
342 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
343 static const std::size_t Idx =
344 std::tuple_size<AllFieldsDecayed>::value -
345 std::tuple_size<AllFields>::value;
346 auto& field = getField<Idx>(allFields);
347 auto& derivedObj =
static_cast<TDerived&
>(*this);
348 auto reader = createNextLayerCachedFieldsReader(allFields);
384 template <
typename TAllFields,
typename TMsg,
typename TIter,
typename... TExtraValues>
386 TAllFields& allFields,
390 TExtraValues... extraValues)
392 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
393 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
394 static const std::size_t Idx =
395 std::tuple_size<AllFieldsDecayed>::value -
396 std::tuple_size<AllFields>::value;
398 auto& field = getField<Idx>(allFields);
399 auto& derivedObj =
static_cast<TDerived&
>(*this);
400 auto reader = createNextLayerCachedFieldsUntilDataReader(allFields);
434 template <
typename TAllFields,
typename TMsg,
typename TIter,
typename... TExtraValues>
436 TAllFields& allFields,
440 TExtraValues... extraValues)
442 return nextLayer().readFromDataFieldsCached(allFields, msg, iter, size, extraValues...);
484 template <
typename TMsg,
typename TIter>
488 std::size_t size)
const
491 auto& derivedObj =
static_cast<const TDerived&
>(*this);
492 auto writer = createNextLayerWriter();
493 return derivedObj.doWrite(field, msg, iter, size, writer);
513 template <
typename TAllFields,
typename TMsg,
typename TIter>
515 TAllFields& allFields,
518 std::size_t size)
const
520 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
521 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
522 static const std::size_t Idx =
523 std::tuple_size<AllFieldsDecayed>::value -
524 std::tuple_size<AllFields>::value;
526 auto& field = getField<Idx>(allFields);
527 auto& derivedObj =
static_cast<const TDerived&
>(*this);
528 auto writer = createNextLayerCachedFieldsWriter(allFields);
529 return derivedObj.doWrite(field, msg, iter, size, writer);
542 return thisLayer().doFieldLength() + m_nextLayer.length();
557 template <
typename TMsg>
558 constexpr std::size_t
length(
const TMsg& msg)
const
560 return thisLayer().doFieldLength(msg) + m_nextLayer.length(msg);
599 template <
typename TIter>
603 auto& derivedObj =
static_cast<const TDerived&
>(*this);
604 auto updater = createNextLayerUpdater();
605 return derivedObj.doUpdate(field, iter, size, updater);
615 template <
typename TMsg,
typename TIter>
619 auto& derivedObj =
static_cast<const TDerived&
>(*this);
620 auto updater = createNextLayerUpdater();
621 return derivedObj.doUpdate(msg, field, iter, size, updater);
639 template <
typename TAllFields,
typename TIter>
641 TAllFields& allFields,
643 std::size_t size)
const
645 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
646 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
647 static const std::size_t Idx =
648 std::tuple_size<AllFieldsDecayed>::value -
649 std::tuple_size<AllFields>::value;
651 auto& field = getField<Idx>(allFields);
652 auto& derivedObj =
static_cast<const TDerived&
>(*this);
653 auto updater = createNextLayerCachedFieldsUpdater(allFields);
654 return derivedObj.doUpdate(field, iter, size, updater);
674 template <
typename TAllFields,
typename TMsg,
typename TIter>
676 TAllFields& allFields,
679 std::size_t size)
const
681 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
682 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
683 static const std::size_t Idx =
684 std::tuple_size<AllFieldsDecayed>::value -
685 std::tuple_size<AllFields>::value;
687 auto& field = getField<Idx>(allFields);
688 auto& derivedObj =
static_cast<const TDerived&
>(*this);
689 auto updater = createNextLayerCachedFieldsUpdater(allFields);
690 return derivedObj.doUpdate(msg, field, iter, size, updater);
705 template <
typename TIter,
typename TNextLayerUpdater>
710 TNextLayerUpdater&& nextLayerUpdater)
const
712 return updateInternal(field, iter, size, std::forward<TNextLayerUpdater>(nextLayerUpdater), LengthTag<>());
726 template <
typename TMsg,
typename TIter,
typename TNextLayerUpdater>
732 TNextLayerUpdater&& nextLayerUpdater)
const
734 return updateInternal(msg, field, iter, size, std::forward<TNextLayerUpdater>(nextLayerUpdater), LengthTag<>());
745 return Field::minLength();
755 template <
typename TMsg>
758 return doFieldLength();
770 template <
typename TId>
773 return nextLayer().createMsg(std::forward<TId>(
id), idx);
780 template <
typename TAllFields>
782 decltype(std::get<std::tuple_size<typename std::decay<TAllFields>::type>::value - std::tuple_size<AllFields>::value>(allFields))
784 using AllFieldsDecayed =
typename std::decay<TAllFields>::type;
785 static_assert(util::tupleIsTailOf<AllFields, AllFieldsDecayed>(),
"Passed tuple is wrong.");
786 static const std::size_t Idx =
787 std::tuple_size<AllFieldsDecayed>::value -
788 std::tuple_size<AllFields>::value;
790 return std::get<Idx>(allFields);
802 template <
typename TMsg,
typename TIter>
805 static_cast<void>(msgPtr);
806 return field.read(iter, len);
817 template <
typename TMsg,
typename TIter>
820 static_cast<void>(msgPtr);
821 return field.write(iter, len);
828 template <
typename T>
831 return comms::details::hasImplOptions<T>();
837 template <
typename TMsg>
840 resetMsgInternal(msg, MsgTypeTag<
typename std::decay<
decltype(msg)>::type>());
844 template <
typename... TParams>
845 using MessageObjTag = comms::details::tag::Tag5<>;
847 template <
typename... TParams>
848 using SmartPtrTag = comms::details::tag::Tag6<>;
850 template <
typename TMsg>
852 typename comms::util::LazyShallowConditional<
853 comms::isMessage<TMsg>()
859 template <
typename TMsg,
typename... TParams>
860 static auto toMsgPtrInternal(TMsg& msg, MessageObjTag<TParams...>) ->
decltype(&msg)
865 template <
typename TMsg,
typename... TParams>
866 static auto toMsgPtrInternal(TMsg& msg, SmartPtrTag<TParams...>) ->
decltype(msg.get())
876 template <
typename TMsg>
877 static auto toMsgPtr(TMsg& msg) ->
decltype(toMsgPtrInternal(msg, MsgTypeTag<
typename std::decay<
decltype(msg)>::type>()))
879 return toMsgPtrInternal(msg, MsgTypeTag<
typename std::decay<
decltype(msg)>::type>());
890 template <
typename... TExtraValues>
893 return updateMissingSizeInternal(size, extraValues...);
905 template <
typename... TExtraValues>
909 TExtraValues... extraValues)
const
911 return updateMissingSizeInternal(field, size, extraValues...);
921 template <
typename... TExtraValues>
924 TExtraValues... extraValues)
const
926 return setMissingSizeInternal(val, extraValues...);
936 template <
typename TId,
typename... TExtraValues>
939 TExtraValues... extraValues)
const
941 return setMsgIdInternal(val, extraValues...);
951 template <
typename... TExtraValues>
954 TExtraValues... extraValues)
const
956 return setMsgIndexInternal(val, extraValues...);
962 template <std::
size_t TIdx,
typename TAllFields>
966 "Expected TAllFields to be a tuple");
967 static_assert(TIdx < std::tuple_size<TAllFields>::value,
968 "Invalid tuple access index");
970 auto& field = std::get<TIdx>(allFields);
972 using FieldType =
typename std::decay<
decltype(field)>::type;
974 std::is_same<Field, FieldType>::value,
975 "Field has wrong type");
981 template <
typename... TParams>
982 using FixedLengthTag = comms::details::tag::Tag1<>;
984 template <
typename... TParams>
985 using VarLengthTag = comms::details::tag::Tag2<>;
987 static constexpr std::size_t MinFieldLength = Field::minLength();
988 static constexpr std::size_t MaxFieldLength = Field::maxLength();
990 template <
typename...>
992 typename comms::util::LazyShallowConditional<
993 (MinFieldLength == MaxFieldLength)
999 class NextLayerReader
1002 explicit NextLayerReader(NextLayer& nextLayer)
1003 : m_nextLayer(nextLayer)
1007 template <
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1012 TExtraValues... extraValues)
1014 return m_nextLayer.read(msg, iter, size, extraValues...);
1017 NextLayer& m_nextLayer;
1020 class NextLayerUntilDataReader
1023 explicit NextLayerUntilDataReader(NextLayer& nextLayer)
1024 : m_nextLayer(nextLayer)
1028 template <
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1033 TExtraValues... extraValues)
1035 return m_nextLayer.readUntilData(msg, iter, size, extraValues...);
1038 NextLayer& m_nextLayer;
1041 template <
typename TAllFields>
1042 class NextLayerCachedFieldsReader
1045 NextLayerCachedFieldsReader(
1046 NextLayer& nextLayer,
1047 TAllFields& allFields)
1048 : m_nextLayer(nextLayer),
1049 m_allFields(allFields)
1053 template<
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1058 TExtraValues... extraValues)
1060 return m_nextLayer.readFieldsCached(m_allFields, msg, iter, size, extraValues...);
1064 NextLayer& m_nextLayer;
1065 TAllFields& m_allFields;
1068 template <
typename TAllFields>
1069 class NextLayerCachedFieldsUntilDataReader
1072 NextLayerCachedFieldsUntilDataReader(
1073 NextLayer& nextLayer,
1074 TAllFields& allFields)
1075 : m_nextLayer(nextLayer),
1076 m_allFields(allFields)
1080 template<
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1085 TExtraValues... extraValues)
1087 return m_nextLayer.readUntilDataFieldsCache(m_allFields, msg, iter, size, extraValues...);
1091 NextLayer& m_nextLayer;
1092 TAllFields& m_allFields;
1095 class NextLayerWriter
1099 explicit NextLayerWriter(
const NextLayer& nextLayer)
1100 : m_nextLayer(nextLayer)
1104 template <
typename TMsg,
typename TIter>
1105 ErrorStatus write(
const TMsg& msg, TIter& iter, std::size_t size)
const
1107 return m_nextLayer.write(msg, iter, size);
1111 const NextLayer& m_nextLayer;
1114 template <
typename TAllFields>
1115 class NextLayerCachedFieldsWriter
1118 NextLayerCachedFieldsWriter(
1119 const NextLayer& nextLayer,
1120 TAllFields& allFields)
1121 : m_nextLayer(nextLayer),
1122 m_allFields(allFields)
1126 template <
typename TMsg,
typename TIter>
1127 ErrorStatus write(
const TMsg& msg, TIter& iter, std::size_t size)
const
1129 return m_nextLayer.writeFieldsCached(m_allFields, msg, iter, size);
1133 const NextLayer& m_nextLayer;
1134 TAllFields& m_allFields;
1137 class NextLayerUpdater
1141 explicit NextLayerUpdater(
const NextLayer& nextLayer)
1142 : m_nextLayer(nextLayer)
1146 template <
typename TIter>
1147 ErrorStatus update(TIter& iter, std::size_t size)
const
1149 return m_nextLayer.update(iter, size);
1152 template <
typename TMsg,
typename TIter>
1153 ErrorStatus update(
const TMsg& msg, TIter& iter, std::size_t size)
const
1155 return m_nextLayer.update(msg, iter, size);
1159 const NextLayer& m_nextLayer;
1162 template <
typename TAllFields>
1163 class NextLayerCachedFieldsUpdater
1166 NextLayerCachedFieldsUpdater(
1167 const NextLayer& nextLayer,
1168 TAllFields& allFields)
1169 : m_nextLayer(nextLayer),
1170 m_allFields(allFields)
1174 template <
typename TIter>
1175 ErrorStatus update(TIter& iter, std::size_t size)
const
1177 return m_nextLayer.updateFieldsCached(m_allFields, iter, size);
1180 template <
typename TMsg,
typename TIter>
1181 ErrorStatus update(
const TMsg& msg, TIter& iter, std::size_t size)
const
1183 return m_nextLayer.updateFieldsCached(m_allFields, msg, iter, size);
1187 const NextLayer& m_nextLayer;
1188 TAllFields& m_allFields;
1191 NextLayerReader createNextLayerReader()
1193 return NextLayerReader(m_nextLayer);
1196 NextLayerUntilDataReader createNextLayerUntilDataReader()
1198 return NextLayerUntilDataReader(m_nextLayer);
1201 template <
typename TAllFields>
1202 NextLayerCachedFieldsReader<TAllFields>
1203 createNextLayerCachedFieldsReader(TAllFields& fields)
1205 return NextLayerCachedFieldsReader<TAllFields>(m_nextLayer, fields);
1208 template <
typename TAllFields>
1209 NextLayerCachedFieldsUntilDataReader<TAllFields>
1210 createNextLayerCachedFieldsUntilDataReader(TAllFields& fields)
1212 return NextLayerCachedFieldsUntilDataReader<TAllFields>(m_nextLayer, fields);
1215 NextLayerWriter createNextLayerWriter()
const
1217 return NextLayerWriter(m_nextLayer);
1220 template <
typename TAllFields>
1221 NextLayerCachedFieldsWriter<TAllFields>
1222 createNextLayerCachedFieldsWriter(TAllFields& fields)
const
1224 return NextLayerCachedFieldsWriter<TAllFields>(m_nextLayer, fields);
1227 NextLayerUpdater createNextLayerUpdater()
const
1229 return NextLayerUpdater(m_nextLayer);
1232 template <
typename TAllFields>
1233 NextLayerCachedFieldsUpdater<TAllFields>
1234 createNextLayerCachedFieldsUpdater(TAllFields& fields)
const
1236 return NextLayerCachedFieldsUpdater<TAllFields>(m_nextLayer, fields);
1242 template <
typename... TParams>
1243 using NormalReadTag = comms::details::tag::Tag3<>;
1245 template <
typename... TParams>
1246 using SplitReadTag = comms::details::tag::Tag4<>;
1248 template <
typename TMsg,
typename TIter,
typename... TExtraValues>
1254 TExtraValues... extraValues)
1257 auto& derivedObj =
static_cast<TDerived&
>(*this);
1258 auto reader = createNextLayerReader();
1259 return derivedObj.doRead(field, msg, iter, size, reader, extraValues...);
1262 template <
typename TMsgPtr,
typename TIter,
typename... TExtraValues>
1268 TExtraValues... extraValues)
1270 auto fromIter = iter;
1271 auto es = readUntilData(msgPtr, iter, size, extraValues...);
1276 auto consumed =
static_cast<std::size_t
>(std::distance(fromIter, iter));
1278 return readFromData(msgPtr, iter, size - consumed, extraValues...);
1281 template <
typename TIter,
typename TNextLayerUpdater,
typename... TParams>
1286 TNextLayerUpdater&& nextLayerUpdater,
1287 FixedLengthTag<TParams...>)
const
1289 auto len = field.length();
1291 std::advance(iter, len);
1292 return nextLayerUpdater.update(iter, size - len);
1295 template <
typename TIter,
typename TNextLayerUpdater,
typename... TParams>
1300 TNextLayerUpdater&& nextLayerUpdater,
1301 VarLengthTag<TParams...>)
const
1303 auto iterTmp = iter;
1304 auto es = field.read(iter, size);
1306 auto diff =
static_cast<std::size_t
>(std::distance(iterTmp, iter));
1307 es = nextLayerUpdater.update(iter, size - diff);
1312 template <
typename TMsg,
typename TIter,
typename TNextLayerUpdater,
typename... TParams>
1318 TNextLayerUpdater&& nextLayerUpdater,
1319 FixedLengthTag<TParams...>)
const
1321 auto len = field.length();
1323 std::advance(iter, len);
1324 return nextLayerUpdater.update(msg, iter, size - len);
1327 template <
typename TMsg,
typename TIter,
typename TNextLayerUpdater,
typename... TParams>
1333 TNextLayerUpdater&& nextLayerUpdater,
1334 VarLengthTag<TParams...>)
const
1336 auto iterTmp = iter;
1337 auto es = field.read(iter, size);
1339 auto diff =
static_cast<std::size_t
>(std::distance(iterTmp, iter));
1340 es = nextLayerUpdater.update(msg, iter, size - diff);
1345 template <
typename TMsg,
typename... TParams>
1346 static void resetMsgInternal(TMsg&, MessageObjTag<TParams...>)
1351 template <
typename TMsg,
typename... TParams>
1352 static void resetMsgInternal(TMsg& msg, SmartPtrTag<TParams...>)
1357 static void updateMissingSizeInternal(std::size_t size)
1359 static_cast<void>(size);
1362 static void updateMissingSizeInternal(
const Field& field, std::size_t size)
1364 static_cast<void>(field);
1365 static_cast<void>(size);
1368 template <
typename... TExtraValues>
1369 void updateMissingSizeInternal(
1371 details::MissingSizeRetriever<> retriever,
1372 TExtraValues... extraValues)
const
1375 retriever.setValue(std::max(std::size_t(1U), length() - size));
1376 updateMissingSizeInternal(size, extraValues...);
1379 template <
typename... TExtraValues>
1380 void updateMissingSizeInternal(
1383 details::MissingSizeRetriever<> retriever,
1384 TExtraValues... extraValues)
const
1387 details::isMissingSizeRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1388 "Must be missing size retriever");
1389 auto totalLen = field.length() + m_nextLayer.length();
1391 retriever.setValue(std::max(std::size_t(1U), totalLen - size));
1392 updateMissingSizeInternal(size, extraValues...);
1395 template <
typename T,
typename... TExtraValues>
1396 void updateMissingSizeInternal(
1399 TExtraValues... extraValues)
const
1401 static_cast<void>(retriever);
1403 !details::isMissingSizeRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1404 "Mustn't be missing size retriever");
1405 updateMissingSizeInternal(size, extraValues...);
1408 template <
typename T,
typename... TExtraValues>
1409 void updateMissingSizeInternal(
1413 TExtraValues... extraValues)
const
1415 static_cast<void>(retriever);
1417 !details::isMissingSizeRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1418 "Mustn't be missing size retriever");
1419 updateMissingSizeInternal(field, size, extraValues...);
1422 static void setMissingSizeInternal(std::size_t val)
1424 static_cast<void>(val);
1427 template <
typename... TExtraValues>
1428 static void setMissingSizeInternal(
1430 details::MissingSizeRetriever<> retriever,
1431 TExtraValues... extraValues)
1433 retriever.setValue(val);
1434 setMissingSizeInternal(val, extraValues...);
1437 template <
typename T,
typename... TExtraValues>
1438 static void setMissingSizeInternal(
1441 TExtraValues... extraValues)
1443 static_cast<void>(retriever);
1445 !details::isMissingSizeRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1446 "Mustn't be missing size retriever");
1447 setMissingSizeInternal(val, extraValues...);
1450 template <
typename TId>
1451 static void setMsgIdInternal(TId val)
1453 static_cast<void>(val);
1456 template <
typename TId,
typename U,
typename... TExtraValues>
1457 static void setMsgIdInternal(
1459 details::MsgIdRetriever<U> retriever,
1460 TExtraValues... extraValues)
1462 retriever.setValue(val);
1463 setMsgIdInternal(val, extraValues...);
1466 template <
typename TId,
typename T,
typename... TExtraValues>
1467 static void setMsgIdInternal(
1470 TExtraValues... extraValues)
1472 static_cast<void>(retriever);
1474 !details::isMsgIdRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1475 "Mustn't be message id retriever");
1476 setMsgIdInternal(val, extraValues...);
1479 static void setMsgIndexInternal(std::size_t val)
1481 static_cast<void>(val);
1484 template <
typename... TExtraValues>
1485 static void setMsgIndexInternal(
1487 details::MsgIndexRetriever retriever,
1488 TExtraValues... extraValues)
1490 retriever.setValue(val);
1491 setMsgIndexInternal(val, extraValues...);
1494 template <
typename T,
typename... TExtraValues>
1495 static void setMsgIndexInternal(
1498 TExtraValues... extraValues)
1500 static_cast<void>(retriever);
1502 !details::isMsgIndexRetriever<
typename std::decay<
decltype(retriever)>::type>(),
1503 "Mustn't be missing size retriever");
1504 setMsgIndexInternal(val, extraValues...);
1508 NextLayer m_nextLayer;
1515 typename TNextLayer,
1517 typename... TOptions>
1518FrameLayerBase<TField, TNextLayer, TDerived, TOptions...>&
1528 typename TNextLayer,
1530 typename... TOptions>
1532const FrameLayerBase<TField, TNextLayer, TDerived, TOptions...>&
1561 return details::MissingSizeRetriever<>(val);
1584template <
typename TId>
1585details::MsgIdRetriever<TId>
msgId(TId& val)
1587 return details::MsgIdRetriever<TId>(val);
1624 return details::MsgIndexRetriever(val);
1649template <
typename TIter>
1650details::MsgPayloadRetriever<TIter>
msgPayload(TIter& iter, std::size_t& len)
1652 return details::MsgPayloadRetriever<TIter>(iter, len);
1665#define COMMS_FRAME_LAYERS_ACCESS(...) \
1666 COMMS_DO_ACCESS_LAYER_ACC_FUNC(__VA_ARGS__)
1674#define COMMS_FRAME_LAYERS_NAMES(...) \
1675 COMMS_DO_LAYER_TYPE_ALIAS(Base, __VA_ARGS__) \
1676 COMMS_DO_ACCESS_LAYER_ACC_FUNC(__VA_ARGS__)
1681#define COMMS_FRAME_LAYERS_ACCESS_INNER(...) \
1682 COMMS_FRAME_LAYERS_ACCESS(__VA_ARGS__)
1686#define COMMS_FRAME_LAYERS_NAMES_INNER(...) \
1687 COMMS_FRAME_LAYERS_NAMES(__VA_ARGS__)
1697#define COMMS_FRAME_LAYERS_ACCESS_OUTER(...) \
1698 COMMS_FRAME_LAYERS_ACCESS(COMMS_EXPAND(COMMS_REVERSE_MACRO_ARGS(__VA_ARGS__)))
1706#define COMMS_FRAME_LAYERS_NAMES_OUTER(...) \
1707 COMMS_FRAME_LAYERS_NAMES(COMMS_EXPAND(COMMS_REVERSE_MACRO_ARGS(__VA_ARGS__)))
1709COMMS_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 various tuple type manipulation classes and functions.
Base class for all the middle (non MsgDataLayer) protocol transport layers.
Definition FrameLayerBase.h:60
const NextLayer & nextLayer() const
Get "const" access to the next layer object.
Definition FrameLayerBase.h:132
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:485
MsgPtr createMsg(TId &&id, unsigned idx=0)
Create message object given the ID.
Definition FrameLayerBase.h:771
comms::ErrorStatus update(TIter &iter, std::size_t size) const
Update recently written (using write()) message contents data.
Definition FrameLayerBase.h:600
static constexpr std::size_t doFieldLength()
Default implementation of field length retrieval.
Definition FrameLayerBase.h:743
~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:299
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:514
typename NextLayer::MsgFactory MsgFactory
Type of message factory.
Definition FrameLayerBase.h:91
ThisLayer & thisLayer()
Get access to this layer object.
Definition FrameLayerBase.h:138
constexpr std::size_t length(const TMsg &msg) const
Get remaining length of wrapping transport information + length of the provided message.
Definition FrameLayerBase.h:558
static constexpr bool canSplitRead()
Compile time check whether split read "until" and "from" data layer is allowed.
Definition FrameLayerBase.h:151
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:640
details::FrameLayerBaseOptionsParser< TOptions... > ParsedOptions
Parsed options structure.
Definition FrameLayerBase.h:69
static Field & getField(TAllFields &allFields)
Retrieve reference to a layer specific field out of all fields.
Definition FrameLayerBase.h:963
void setMsgIndex(std::size_t val, TExtraValues... extraValues) const
Set the message index information if such is requested.
Definition FrameLayerBase.h:952
void setMissingSize(std::size_t val, TExtraValues... extraValues) const
Set the missing size information if such is requested.
Definition FrameLayerBase.h:922
void updateMissingSize(const Field &field, std::size_t size, TExtraValues... extraValues) const
Update the missing size information if such is requested.
Definition FrameLayerBase.h:906
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:675
static constexpr std::size_t doFieldLength(const TMsg &)
Default implementation of field length retrieval when message is known.
Definition FrameLayerBase.h:756
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:256
typename details::FrameLayerMsgPtr< NextLayer >::Type MsgPtr
Type of pointer to the message.
Definition FrameLayerBase.h:95
static comms::ErrorStatus doWriteField(const TMsg *msgPtr, const Field &field, TIter &iter, std::size_t len)
Write the layer field.
Definition FrameLayerBase.h:818
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:385
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:781
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:727
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:81
void updateMissingSize(std::size_t size, TExtraValues... extraValues) const
Update the missing size information if such is requested.
Definition FrameLayerBase.h:891
TField Field
Type of the field used for this layer.
Definition FrameLayerBase.h:63
comms::ErrorStatus doUpdate(Field &field, TIter &iter, std::size_t size, TNextLayerUpdater &&nextLayerUpdater) const
Default implementation of the "update" functaionality.
Definition FrameLayerBase.h:706
constexpr std::size_t length() const
Get remaining length of wrapping transport information.
Definition FrameLayerBase.h:540
TDerived ThisLayer
Actual derived class.
Definition FrameLayerBase.h:98
static comms::ErrorStatus doReadField(const TMsg *msgPtr, Field &field, TIter &iter, std::size_t len)
Read the layer field.
Definition FrameLayerBase.h:803
comms::ErrorStatus read(TMsg &msg, TIter &iter, std::size_t size, TExtraValues... extraValues)
Deserialise message from the input data sequence.
Definition FrameLayerBase.h:212
typename NextLayer::AllMessages AllMessages
All supported messages.
Definition FrameLayerBase.h:86
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:877
FrameLayerBase(TArgs &&... args)
Constructor.
Definition FrameLayerBase.h:114
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:435
static void resetMsg(TMsg &msg)
Reset msg in case it is a smart pointer (MsgPtr).
Definition FrameLayerBase.h:838
TNextLayer NextLayer
Type of the next transport layer.
Definition FrameLayerBase.h:66
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:334
void setMsgId(TId val, TExtraValues... extraValues) const
Set the message ID information if such is requested.
Definition FrameLayerBase.h:937
const ThisLayer & thisLayer() const
Get "const" access to this layer object.
Definition FrameLayerBase.h:144
comms::ErrorStatus update(const TMsg &msg, TIter &iter, std::size_t size) const
Update recently written (using write()) message contents data.
Definition FrameLayerBase.h:616
static constexpr bool isMessageObjRef()
Detect whether type is actual message object.
Definition FrameLayerBase.h:829
details::MissingSizeRetriever missingSize(std::size_t &val)
Add "missing size" output parameter to frame's "read" operation.
Definition FrameLayerBase.h:1559
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:1650
details::MsgIndexRetriever msgIndex(std::size_t &val)
Add "message index" output parameter to frame's "read" operation.
Definition FrameLayerBase.h:1622
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:1519
details::MsgIdRetriever< TId > msgId(TId &val)
Add "message ID" output parameter to frame's "read" operation.
Definition FrameLayerBase.h:1585
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.
Contains definition of all the options used by the COMMS library.
Check whether provided type is a variant of std::tuple.
Definition Tuple.h:36
Replacement to some types from standard type_traits.