13#include "OptionsParser.h"
33struct FieldsOptionsCompatibilityCalc
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);
46template <
typename TBasic,
typename... TOptions>
49 using ParsedOptions = OptionsParser<TOptions...>;
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;
70 static const bool VarLengthIncompatible =
71 ParsedOptions::HasFixedLengthLimit ||
72 ParsedOptions::HasFixedBitLengthLimit ||
73 ParsedOptions::HasAvailableLengthLimit;
76 (!ParsedOptions::HasVarLengthLimits) || (!VarLengthIncompatible),
77 "VarLength option is incompatible with FixedLength, FixedBitLength "
78 "and AvailableLengthLimit");
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");
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");
103 (!ParsedOptions::HasSequenceTrailingFieldSuffix) ||
104 (!ParsedOptions::HasSequenceTerminationFieldSuffix),
105 "The following options are incompatible, cannot be used together: "
106 "SequenceTrailingFieldSuffix, SequenceTerminationFieldSuffix");
109 (!ParsedOptions::HasFailOnInvalid) ||
110 (!ParsedOptions::HasIgnoreInvalid),
111 "The following options are incompatible, cannot be used together: "
112 "FailOnInvalid, IgnoreInvalid");
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");
123 (!ParsedOptions::HasSequenceFixedSizeUseFixedSizeStorage) ||
124 (ParsedOptions::HasSequenceFixedSize),
125 "The option SequenceFixedSizeUseFixedSizeStorage cannot be used without SequenceFixedSize.");
128 (!ParsedOptions::HasSequenceFixedSizeUseFixedSizeStorage) ||
129 (!ParsedOptions::HasFixedSizeStorage),
130 "The following options are incompatible, cannot be used together: "
131 "SequenceFixedSizeUseFixedSizeStorage, FixedSizeStorage");
133 using FieldTypeAdapted =
134 typename ParsedOptions::template AdaptFieldType<TBasic>;
136 using InvalidByDefaultAdapted =
137 typename ParsedOptions::template AdaptInvalidByDefault<FieldTypeAdapted>;
139 using VersionStorageAdapted =
140 typename ParsedOptions::template AdaptVersionStorage<InvalidByDefaultAdapted>;
142 using SerOffsetAdapted =
143 typename ParsedOptions::template AdaptSerOffset<VersionStorageAdapted>;
145 using DisplayOffsetAdapted =
146 typename ParsedOptions::template AdaptDisplayOffset<SerOffsetAdapted>;
148 using VersionsRangeAdapted =
149 typename ParsedOptions::template AdaptVersionsRange<DisplayOffsetAdapted>;
151 using FixedLengthLimitAdapted =
152 typename ParsedOptions::template AdaptFixedLengthLimit<VersionsRangeAdapted>;
154 using FixedBitLengthLimitAdapted =
155 typename ParsedOptions::template AdaptFixedBitLengthLimit<FixedLengthLimitAdapted>;
157 using VarLengthLimitsAdapted =
158 typename ParsedOptions::template AdaptVarLengthLimits<FixedBitLengthLimitAdapted>;
160 using AvailableLengthLimitAdapted =
161 typename ParsedOptions::template AdaptAvailableLengthLimit<VarLengthLimitsAdapted>;
163 using SequenceElemLengthForcingAdapted =
164 typename ParsedOptions::template AdaptSequenceElemLengthForcing<AvailableLengthLimitAdapted>;
166 using SequenceElemSerLengthFieldPrefixAdapted =
167 typename ParsedOptions::template AdaptSequenceElemSerLengthFieldPrefix<SequenceElemLengthForcingAdapted>;
169 using SequenceElemFixedSerLengthFieldPrefixAdapted =
170 typename ParsedOptions::template AdaptSequenceElemFixedSerLengthFieldPrefix<SequenceElemSerLengthFieldPrefixAdapted>;
172 using SequenceSizeForcingAdapted =
173 typename ParsedOptions::template AdaptSequenceSizeForcing<SequenceElemFixedSerLengthFieldPrefixAdapted>;
175 using SequenceLengthForcingAdapted =
176 typename ParsedOptions::template AdaptSequenceLengthForcing<SequenceSizeForcingAdapted>;
178 using SequenceFixedSizeAdapted =
179 typename ParsedOptions::template AdaptSequenceFixedSize<SequenceLengthForcingAdapted>;
181 using SequenceSizeFieldPrefixAdapted =
182 typename ParsedOptions::template AdaptSequenceSizeFieldPrefix<SequenceFixedSizeAdapted>;
184 using SequenceSerLengthFieldPrefixAdapted =
185 typename ParsedOptions::template AdaptSequenceSerLengthFieldPrefix<SequenceSizeFieldPrefixAdapted>;
187 using SequenceTrailingFieldSuffixAdapted =
188 typename ParsedOptions::template AdaptSequenceTrailingFieldSuffix<SequenceSerLengthFieldPrefixAdapted>;
190 using SequenceTerminationFieldSuffixAdapted =
191 typename ParsedOptions::template AdaptSequenceTerminationFieldSuffix<SequenceTrailingFieldSuffixAdapted>;
193 using RemLengthMemberFieldAdapted =
194 typename ParsedOptions::template AdaptRemLengthMemberField<SequenceTerminationFieldSuffixAdapted>;
196 using DefaultValueInitialiserAdapted =
197 typename ParsedOptions::template AdaptDefaultValueInitialiser<RemLengthMemberFieldAdapted>;
199 using MultiRangeValidationAdapted =
200 typename ParsedOptions::template AdaptMultiRangeValidation<DefaultValueInitialiserAdapted>;
202 using CustomValidatorAdapted =
203 typename ParsedOptions::template AdaptCustomValidator<MultiRangeValidationAdapted>;
205 using FailOnInvalidAdapted =
206 typename ParsedOptions::template AdaptFailOnInvalid<CustomValidatorAdapted>;
208 using IgnoreInvalidAdapted =
209 typename ParsedOptions::template AdaptIgnoreInvalid<FailOnInvalidAdapted>;
211 using EmptySerializationAdapted =
212 typename ParsedOptions::template AdaptEmptySerialization<IgnoreInvalidAdapted>;
214 using CustomReadWrapAdapted =
215 typename ParsedOptions::template AdaptCustomRead<EmptySerializationAdapted>;
217 using CustomRefreshWrapAdapted =
218 typename ParsedOptions::template AdaptCustomRefresh<CustomReadWrapAdapted>;
220 using CustomWriteWrapAdapted =
221 typename ParsedOptions::template AdaptCustomWrite<CustomRefreshWrapAdapted>;
223 using MissingOnInvalidAdapted =
224 typename ParsedOptions::template AdaptMissingOnInvalid<CustomWriteWrapAdapted>;
226 using MissingOnReadFailAdapted =
227 typename ParsedOptions::template AdaptMissingOnReadFail<MissingOnInvalidAdapted>;
229 using VariantResetOnDestructAdapted =
230 typename ParsedOptions::template AdaptVariantResetOnDestruct<MissingOnReadFailAdapted>;
232 using FixedValueAdapted =
233 typename ParsedOptions::template AdaptFixedValue<VariantResetOnDestructAdapted>;
236 using Type = FixedValueAdapted;
239template <
typename TBasic,
typename... TOptions>
240using AdaptBasicFieldT =
typename AdaptBasicField<TBasic, TOptions...>::Type;
Main namespace for all classes / functions of COMMS library.