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