COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
SyncPrefixLayer.h
Go to the documentation of this file.
1//
2// Copyright 2015 - 2025 (C). Alex Robenko. All rights reserved.
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
10
11#pragma once
12
14#include "comms/frame/details/SyncPrefixLayerBase.h"
15#include "comms/frame/details/SyncPrefixLayerOptionsParser.h"
16
17#include <iterator>
18
19COMMS_MSVC_WARNING_PUSH
20COMMS_MSVC_WARNING_DISABLE(4189) // Disable erroneous initialized but not referenced variable warning
21
22namespace comms
23{
24
25namespace frame
26{
27
44template <typename TField, typename TNextLayer, typename... TOptions>
45class SyncPrefixLayer : public comms::frame::details::SyncPrefixLayerBase<TField, TNextLayer, TOptions...>
46{
47 using BaseImpl = comms::frame::details::SyncPrefixLayerBase<TField, TNextLayer, TOptions...>;
48 using ParsedOptionsInternal = comms::frame::details::SyncPrefixLayerOptionsParser<TOptions...>;
49
50public:
52 using Field = typename BaseImpl::Field;
53
57 using ExtendingClass = typename ParsedOptionsInternal::ExtendingClass;
58
60 SyncPrefixLayer() = default;
61
64
67
69 ~SyncPrefixLayer() noexcept = default;
70
75 static constexpr bool hasExtendingClass()
76 {
77 return ParsedOptionsInternal::HasExtendingClass;
78 }
79
108 template <typename TMsg, typename TIter, typename TNextLayerReader, typename... TExtraValues>
110 Field& field,
111 TMsg& msg,
112 TIter& iter,
113 std::size_t size,
114 TNextLayerReader&& nextLayerReader,
115 TExtraValues... extraValues)
116 {
117 auto& thisObj = BaseImpl::thisLayer();
118 auto* msgPtr = BaseImpl::toMsgPtr(msg);
119 auto beforeReadIter = iter;
120
121 auto es = thisObj.doReadField(msgPtr, field, iter, size);
123 BaseImpl::updateMissingSize(field, size, extraValues...);
124 }
125
126 if (es != comms::ErrorStatus::Success) {
127 return es;
128 }
129
130 bool verified = thisObj.verifyFieldValue(field);
131 if (!verified) {
133 }
134
135 auto fieldLen = static_cast<std::size_t>(std::distance(beforeReadIter, iter));
136 return nextLayerReader.read(msg, iter, size - fieldLen, extraValues...);
137 }
138
156 template <typename TMsg, typename TIter, typename TNextLayerWriter>
158 Field& field,
159 const TMsg& msg,
160 TIter& iter,
161 std::size_t size,
162 TNextLayerWriter&& nextLayerWriter) const
163 {
164 auto& thisObj = BaseImpl::thisLayer();
165 thisObj.prepareFieldForWrite(field);
166 auto es = thisObj.doWriteField(&msg, field, iter, size);
167 if (es != ErrorStatus::Success) {
168 return es;
169 }
170
171 COMMS_ASSERT(field.length() <= size);
172 return nextLayerWriter.write(msg, iter, size - field.length());
173 }
174
175protected:
182 static bool verifyFieldValue(const Field& field)
183 {
184 return field == Field();
185 }
186
194 static void prepareFieldForWrite(Field& field)
195 {
196 static_cast<void>(field);
197 }
198};
199
200namespace details
201{
202template <typename T>
203struct SyncPrefixLayerCheckHelper
204{
205 static const bool Value = false;
206};
207
208template <typename TField, typename TNextLayer>
209struct SyncPrefixLayerCheckHelper<SyncPrefixLayer<TField, TNextLayer> >
210{
211 static const bool Value = true;
212};
213
214} // namespace details
215
219template <typename T>
220constexpr bool isSyncPrefixLayer()
221{
222 return details::SyncPrefixLayerCheckHelper<T>::Value;
223}
224
225} // namespace frame
226
227} // namespace comms
228
229COMMS_MSVC_WARNING_POP
#define COMMS_ASSERT(expr)
Generic assert macro.
Definition Assert.h:170
Contains various compiler related definitions.
Protocol layer that uses "sync" field as a prefix to all the subsequent data written by other (next) ...
Definition SyncPrefixLayer.h:46
static bool verifyFieldValue(const Field &field)
Verify the validity of the field.
Definition SyncPrefixLayer.h:182
comms::ErrorStatus doRead(Field &field, TMsg &msg, TIter &iter, std::size_t size, TNextLayerReader &&nextLayerReader, TExtraValues... extraValues)
Customized read functionality, invoked by read().
Definition SyncPrefixLayer.h:109
SyncPrefixLayer(SyncPrefixLayer &&)=default
Move constructor.
typename ParsedOptionsInternal::ExtendingClass ExtendingClass
Type of real extending class.
Definition SyncPrefixLayer.h:57
static void prepareFieldForWrite(Field &field)
Prepare field for writing.
Definition SyncPrefixLayer.h:194
SyncPrefixLayer(const SyncPrefixLayer &)=default
Copy constructor.
comms::ErrorStatus doWrite(Field &field, const TMsg &msg, TIter &iter, std::size_t size, TNextLayerWriter &&nextLayerWriter) const
Customized write functionality, invoked by write().
Definition SyncPrefixLayer.h:157
~SyncPrefixLayer() noexcept=default
Destructor.
constexpr bool isSyncPrefixLayer()
Compile time check of whether the provided type is a variant of SyncPrefixLayer.
Definition SyncPrefixLayer.h:220
SyncPrefixLayer()=default
Default constructor.
typename BaseImpl::Field Field
Type of the field object used to read/write "sync" value.
Definition SyncPrefixLayer.h:52
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.