COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
AdaptBasicField.h
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
8#pragma once
9
10#include "adapters.h"
11#include "OptionsParser.h"
12
13namespace comms
14{
15
16namespace field
17{
18
19namespace details
20{
21
22template<
23 bool T1 = false,
24 bool T2 = false,
25 bool T3 = false,
26 bool T4 = false,
27 bool T5 = false,
28 bool T6 = false>
29struct FieldsOptionsCompatibilityCalc
30{
31 static const std::size_t Value =
32 static_cast<std::size_t>(T1) +\
33 static_cast<std::size_t>(T2) +
34 static_cast<std::size_t>(T3) +
35 static_cast<std::size_t>(T4) +
36 static_cast<std::size_t>(T5) +
37 static_cast<std::size_t>(T6);
38};
39
40//--
41
42template <typename TBasic, typename... TOptions>
43class AdaptBasicField
44{
45 using ParsedOptions = OptionsParser<TOptions...>;
46
47 static const bool CustomReaderIncompatible =
48 ParsedOptions::HasSerOffset ||
49 ParsedOptions::HasFixedLengthLimit ||
50 ParsedOptions::HasFixedBitLengthLimit ||
51 ParsedOptions::HasVarLengthLimits ||
52 ParsedOptions::HasAvailableLengthLimit ||
53 ParsedOptions::HasSequenceElemLengthForcing ||
54 ParsedOptions::HasSequenceSizeForcing ||
55 ParsedOptions::HasSequenceLengthForcing ||
56 ParsedOptions::HasSequenceFixedSize ||
57 ParsedOptions::HasSequenceSizeFieldPrefix ||
58 ParsedOptions::HasSequenceSerLengthFieldPrefix ||
59 ParsedOptions::HasSequenceElemSerLengthFieldPrefix ||
60 ParsedOptions::HasSequenceElemFixedSerLengthFieldPrefix ||
61 ParsedOptions::HasSequenceTrailingFieldSuffix ||
62 ParsedOptions::HasSequenceTerminationFieldSuffix ||
63 ParsedOptions::HasEmptySerialization ||
64 ParsedOptions::HasMissingOnReadFail;
65
66 static const bool VarLengthIncompatible =
67 ParsedOptions::HasFixedLengthLimit ||
68 ParsedOptions::HasFixedBitLengthLimit ||
69 ParsedOptions::HasAvailableLengthLimit;
70
71 static_assert(
72 (!ParsedOptions::HasVarLengthLimits) || (!VarLengthIncompatible),
73 "VarLength option is incompatible with FixedLength, FixedBitLength "
74 "and AvailableLengthLimit");
75
76 static_assert(
77 1U >= FieldsOptionsCompatibilityCalc<
78 ParsedOptions::HasSequenceSizeFieldPrefix,
79 ParsedOptions::HasSequenceSerLengthFieldPrefix,
80 ParsedOptions::HasSequenceFixedSize,
81 ParsedOptions::HasSequenceSizeForcing,
82 ParsedOptions::HasSequenceLengthForcing,
83 ParsedOptions::HasSequenceTerminationFieldSuffix>::Value,
84 "The following options are incompatible, cannot be used together: "
85 "SequenceSizeFieldPrefix, SequenceSerLengthFieldPrefix, "
86 "SequenceFixedSize, SequenceSizeForcingEnabled, SequenceLengthForcingEnabled, "
87 "SequenceTerminationFieldSuffix");
88
89 static_assert(
90 1U >= FieldsOptionsCompatibilityCalc<
91 ParsedOptions::HasSequenceElemSerLengthFieldPrefix,
92 ParsedOptions::HasSequenceElemFixedSerLengthFieldPrefix,
93 ParsedOptions::HasSequenceTerminationFieldSuffix>::Value,
94 "The following options are incompatible, cannot be used together: "
95 "SequenceElemSerLengthFieldPrefix, SequenceElemFixedSerLengthFieldPrefix "
96 "SequenceTerminationFieldSuffix");
97
98 static_assert(
99 (!ParsedOptions::HasSequenceTrailingFieldSuffix) ||
100 (!ParsedOptions::HasSequenceTerminationFieldSuffix),
101 "The following options are incompatible, cannot be used together: "
102 "SequenceTrailingFieldSuffix, SequenceTerminationFieldSuffix");
103
104 static_assert(
105 (!ParsedOptions::HasFailOnInvalid) ||
106 (!ParsedOptions::HasIgnoreInvalid),
107 "The following options are incompatible, cannot be used together: "
108 "FailOnInvalid, IgnoreInvalid");
109
110 static_assert(
111 1U >= FieldsOptionsCompatibilityCalc<
112 ParsedOptions::HasCustomStorageType,
113 ParsedOptions::HasFixedSizeStorage,
114 ParsedOptions::HasOrigDataView>::Value,
115 "The following options are incompatible, cannot be used together: "
116 "CustomStorageType, FixedSizeStorage, OrigDataView");
117
118 static_assert(
119 (!ParsedOptions::HasSequenceFixedSizeUseFixedSizeStorage) ||
120 (ParsedOptions::HasSequenceFixedSize),
121 "The option SequenceFixedSizeUseFixedSizeStorage cannot be used without SequenceFixedSize.");
122
123 static_assert(
124 (!ParsedOptions::HasSequenceFixedSizeUseFixedSizeStorage) ||
125 (!ParsedOptions::HasFixedSizeStorage),
126 "The following options are incompatible, cannot be used together: "
127 "SequenceFixedSizeUseFixedSizeStorage, FixedSizeStorage");
128
129 using FieldTypeAdapted =
130 typename ParsedOptions::template AdaptFieldType<TBasic>;
131
132 using InvalidByDefaultAdapted =
133 typename ParsedOptions::template AdaptInvalidByDefault<FieldTypeAdapted>;
134
135 using VersionStorageAdapted =
136 typename ParsedOptions::template AdaptVersionStorage<InvalidByDefaultAdapted>;
137
138 using SerOffsetAdapted =
139 typename ParsedOptions::template AdaptSerOffset<VersionStorageAdapted>;
140
141 using DisplayOffsetAdapted =
142 typename ParsedOptions::template AdaptDisplayOffset<SerOffsetAdapted>;
143
144 using VersionsRangeAdapted =
145 typename ParsedOptions::template AdaptVersionsRange<DisplayOffsetAdapted>;
146
147 using FixedLengthLimitAdapted =
148 typename ParsedOptions::template AdaptFixedLengthLimit<VersionsRangeAdapted>;
149
150 using FixedBitLengthLimitAdapted =
151 typename ParsedOptions::template AdaptFixedBitLengthLimit<FixedLengthLimitAdapted>;
152
153 using VarLengthLimitsAdapted =
154 typename ParsedOptions::template AdaptVarLengthLimits<FixedBitLengthLimitAdapted>;
155
156 using AvailableLengthLimitAdapted =
157 typename ParsedOptions::template AdaptAvailableLengthLimit<VarLengthLimitsAdapted>;
158
159 using SequenceElemLengthForcingAdapted =
160 typename ParsedOptions::template AdaptSequenceElemLengthForcing<AvailableLengthLimitAdapted>;
161
162 using SequenceElemSerLengthFieldPrefixAdapted =
163 typename ParsedOptions::template AdaptSequenceElemSerLengthFieldPrefix<SequenceElemLengthForcingAdapted>;
164
165 using SequenceElemFixedSerLengthFieldPrefixAdapted =
166 typename ParsedOptions::template AdaptSequenceElemFixedSerLengthFieldPrefix<SequenceElemSerLengthFieldPrefixAdapted>;
167
168 using SequenceSizeForcingAdapted =
169 typename ParsedOptions::template AdaptSequenceSizeForcing<SequenceElemFixedSerLengthFieldPrefixAdapted>;
170
171 using SequenceLengthForcingAdapted =
172 typename ParsedOptions::template AdaptSequenceLengthForcing<SequenceSizeForcingAdapted>;
173
174 using SequenceFixedSizeAdapted =
175 typename ParsedOptions::template AdaptSequenceFixedSize<SequenceLengthForcingAdapted>;
176
177 using SequenceSizeFieldPrefixAdapted =
178 typename ParsedOptions::template AdaptSequenceSizeFieldPrefix<SequenceFixedSizeAdapted>;
179
180 using SequenceSerLengthFieldPrefixAdapted =
181 typename ParsedOptions::template AdaptSequenceSerLengthFieldPrefix<SequenceSizeFieldPrefixAdapted>;
182
183 using SequenceTrailingFieldSuffixAdapted =
184 typename ParsedOptions::template AdaptSequenceTrailingFieldSuffix<SequenceSerLengthFieldPrefixAdapted>;
185
186 using SequenceTerminationFieldSuffixAdapted =
187 typename ParsedOptions::template AdaptSequenceTerminationFieldSuffix<SequenceTrailingFieldSuffixAdapted>;
188
189 using RemLengthMemberFieldAdapted =
190 typename ParsedOptions::template AdaptRemLengthMemberField<SequenceTerminationFieldSuffixAdapted>;
191
192 using DefaultValueInitialiserAdapted =
193 typename ParsedOptions::template AdaptDefaultValueInitialiser<RemLengthMemberFieldAdapted>;
194
195 using MultiRangeValidationAdapted =
196 typename ParsedOptions::template AdaptMultiRangeValidation<DefaultValueInitialiserAdapted>;
197
198 using CustomValidatorAdapted =
199 typename ParsedOptions::template AdaptCustomValidator<MultiRangeValidationAdapted>;
200
201 using FailOnInvalidAdapted =
202 typename ParsedOptions::template AdaptFailOnInvalid<CustomValidatorAdapted>;
203
204 using IgnoreInvalidAdapted =
205 typename ParsedOptions::template AdaptIgnoreInvalid<FailOnInvalidAdapted>;
206
207 using EmptySerializationAdapted =
208 typename ParsedOptions::template AdaptEmptySerialization<IgnoreInvalidAdapted>;
209
210 using CustomReadWrapAdapted =
211 typename ParsedOptions::template AdaptCustomRead<EmptySerializationAdapted>;
212
213 using CustomRefreshWrapAdapted =
214 typename ParsedOptions::template AdaptCustomRefresh<CustomReadWrapAdapted>;
215
216 using CustomWriteWrapAdapted =
217 typename ParsedOptions::template AdaptCustomWrite<CustomRefreshWrapAdapted>;
218
219 using MissingOnInvalidAdapted =
220 typename ParsedOptions::template AdaptMissingOnInvalid<CustomWriteWrapAdapted>;
221
222 using MissingOnReadFailAdapted =
223 typename ParsedOptions::template AdaptMissingOnReadFail<MissingOnInvalidAdapted>;
224
225 using VariantResetOnDestructAdapted =
226 typename ParsedOptions::template AdaptVariantResetOnDestruct<MissingOnReadFailAdapted>;
227
228 using FixedValueAdapted =
229 typename ParsedOptions::template AdaptFixedValue<VariantResetOnDestructAdapted>;
230
231public:
232 using Type = FixedValueAdapted;
233};
234
235template <typename TBasic, typename... TOptions>
236using AdaptBasicFieldT = typename AdaptBasicField<TBasic, TOptions...>::Type;
237
238} // namespace details
239
240} // namespace field
241
242} // namespace comms
243
Main namespace for all classes / functions of COMMS library.