COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
OptionsParser.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
13#include "comms/field/details/adapters.h"
14#include "comms/field/details/MembersVersionDependency.h"
15#include "comms/field/tag.h"
16#include "comms/options.h"
18
19#include <cstddef>
20#include <limits>
21#include <ratio>
22#include <tuple>
23#include <type_traits>
24#include <utility>
25
26namespace comms
27{
28
29namespace field
30{
31
32namespace details
33{
34
35template <typename... TOptions>
36class OptionsParser;
37
38template <>
39class OptionsParser<>
40{
41public:
42 static constexpr bool HasInvalidByDefault = false;
43 static constexpr bool HasVersionStorage = false;
44 static constexpr bool HasSerOffset = false;
45 static constexpr bool HasVersionsRange = false;
46 static constexpr bool HasFixedLengthLimit = false;
47 static constexpr bool HasFixedBitLengthLimit = false;
48 static constexpr bool HasVarLengthLimits = false;
49 static constexpr bool HasAvailableLengthLimit = false;
50 static constexpr bool HasSequenceElemLengthForcing = false;
51 static constexpr bool HasSequenceElemSerLengthFieldPrefix = false;
52 static constexpr bool HasSequenceElemFixedSerLengthFieldPrefix = false;
53 static constexpr bool HasSequenceSizeForcing = false;
54 static constexpr bool HasSequenceLengthForcing = false;
55 static constexpr bool HasSequenceFixedSize = false;
56 static constexpr bool HasSequenceSizeFieldPrefix = false;
57 static constexpr bool HasSequenceSerLengthFieldPrefix = false;
58 static constexpr bool HasSequenceTrailingFieldSuffix = false;
59 static constexpr bool HasSequenceTerminationFieldSuffix = false;
60 static constexpr bool HasRemLengthMemberField = false;
61 static constexpr bool HasDefaultValueInitialiser = false;
62 static constexpr bool HasMultiRangeValidation = false;
63 static constexpr bool HasCustomValidator = false;
64 static constexpr bool HasFailOnInvalid = false;
65 static constexpr bool HasIgnoreInvalid = false;
66 static constexpr bool HasEmptySerialization = false;
67 static constexpr bool HasCustomRead = false;
68 static constexpr bool HasCustomRefresh = false;
69 static constexpr bool HasCustomWrite = false;
70 static constexpr bool HasSequenceFixedSizeUseFixedSizeStorage = false;
71 static constexpr bool HasFixedSizeStorage = false;
72 static constexpr bool HasCustomStorageType = false;
73 static constexpr bool HasScalingRatio = false;
74 static constexpr bool HasUnits = false;
75 static constexpr bool HasOrigDataView = false;
76 static constexpr bool HasCustomVersionUpdate = false;
77 static constexpr bool HasFieldType = false;
78 static constexpr bool HasMissingOnReadFail = false;
79 static constexpr bool HasMissingOnInvalid = false;
80 static constexpr bool HasVariantCustomResetOnDestruct = false;
81 static constexpr bool HasVersionDependentMembersForced = false;
82 static constexpr bool HasFixedValue = false;
83 static constexpr bool HasDisplayOffset = false;
84 static constexpr bool HasName = false;
85
86 using UnitsType = void;
87 using ScalingRatio = std::ratio<1, 1>;
88 using UnitsRatio = std::ratio<1, 1>;
89 using FieldType = void;
90 using SequenceSizeFieldPrefix = void;
93 using SequenceTrailingFieldSuffix = void;
96
97 static constexpr std::size_t SequenceFixedSize = std::numeric_limits<std::size_t>::max();
98 static constexpr MembersVersionDependency ForcedMembersVersionDependency = MembersVersionDependency_NotSpecified;
99
100 template <typename TField>
101 using AdaptInvalidByDefault = TField;
102
103 template <typename TField>
104 using AdaptVersionStorage = TField;
105
106 template <typename TField>
107 using AdaptSerOffset = TField;
108
109 template <typename TField>
110 using AdaptVersionsRange = TField;
111
112 template <typename TField>
113 using AdaptFixedLengthLimit = TField;
114
115 template <typename TField>
116 using AdaptFixedBitLengthLimit = TField;
117
118 template <typename TField>
119 using AdaptVarLengthLimits = TField;
120
121 template <typename TField>
122 using AdaptAvailableLengthLimit = TField;
123
124 template <typename TField>
125 using AdaptSequenceElemLengthForcing = TField;
126
127 template <typename TField>
128 using AdaptSequenceElemSerLengthFieldPrefix = TField;
129
130 template <typename TField>
131 using AdaptSequenceElemFixedSerLengthFieldPrefix = TField;
132
133 template <typename TField>
134 using AdaptSequenceSizeForcing = TField;
135
136 template <typename TField>
137 using AdaptSequenceLengthForcing = TField;
138
139 template <typename TField>
140 using AdaptSequenceFixedSize = TField;
141
142 template <typename TField>
143 using AdaptSequenceSizeFieldPrefix = TField;
144
145 template <typename TField>
146 using AdaptSequenceSerLengthFieldPrefix = TField;
147
148 template <typename TField>
149 using AdaptSequenceTrailingFieldSuffix = TField;
150
151 template <typename TField>
152 using AdaptSequenceTerminationFieldSuffix = TField;
153
154 template <typename TField>
155 using AdaptRemLengthMemberField = TField;
156
157 template <typename TField>
158 using AdaptDefaultValueInitialiser = TField;
159
160 template <typename TField>
161 using AdaptMultiRangeValidation = TField;
162
163 template <typename TField>
164 using AdaptCustomValidator = TField;
165
166 template <typename TField>
167 using AdaptFailOnInvalid = TField;
168
169 template <typename TField>
170 using AdaptIgnoreInvalid = TField;
171
172 template <typename TField>
173 using AdaptEmptySerialization = TField;
174
175 template <typename TField>
176 using AdaptCustomRead = TField;
177
178 template <typename TField>
179 using AdaptCustomRefresh = TField;
180
181 template <typename TField>
182 using AdaptCustomWrite = TField;
183
184 template <typename TField>
185 using AdaptFieldType = TField;
186
187 template <typename TField>
188 using AdaptMissingOnReadFail = TField;
189
190 template <typename TField>
191 using AdaptMissingOnInvalid = TField;
192
193 template <typename TField>
194 using AdaptVariantResetOnDestruct =
196 std::is_same<typename TField::CommsTag, comms::field::tag::Variant>::value
197 >::template Type<
198 comms::field::adapter::VariantResetOnDestruct<TField>,
199 TField
200 >;
201
202 template <typename TField>
203 using AdaptFixedValue = TField;
204
205 template <typename TField>
206 using AdaptDisplayOffset = TField;
207};
208
209template <typename... TOptions>
210class OptionsParser<
211 comms::option::def::HasCustomRead,
212 TOptions...> : public OptionsParser<TOptions...>
213{
214public:
215 static constexpr bool HasCustomRead = true;
216
217 template <typename TField>
218 using AdaptCustomRead = comms::field::adapter::CustomReadWrap<TField>;
219};
220
221template <std::intmax_t TOffset, typename... TOptions>
222class OptionsParser<
223 comms::option::def::NumValueSerOffset<TOffset>,
224 TOptions...> : public OptionsParser<TOptions...>
225{
226public:
227 static constexpr bool HasSerOffset = true;
228 static const std::intmax_t SerOffset = TOffset;
229
230 template <typename TField>
231 using AdaptSerOffset = comms::field::adapter::SerOffset<SerOffset, TField>;
232};
233
234template <std::size_t TLen, bool TSignExtend, typename... TOptions>
235class OptionsParser<
236 comms::option::def::FixedLength<TLen, TSignExtend>,
237 TOptions...> : public OptionsParser<TOptions...>
238{
239public:
240 static constexpr bool HasFixedLengthLimit = true;
241 static constexpr std::size_t FixedLength = TLen;
242 static constexpr bool FixedLengthSignExtend = TSignExtend;
243
244 template <typename TField>
245 using AdaptFixedLengthLimit =
246 comms::field::adapter::FixedLength<
248 FixedLengthSignExtend,
249 TField
250 >;
251};
252
253template <std::size_t TLen, bool TSignExtend, typename... TOptions>
254class OptionsParser<
255 comms::option::def::FixedBitLength<TLen, TSignExtend>,
256 TOptions...> : public OptionsParser<TOptions...>
257{
258public:
259 static constexpr bool HasFixedBitLengthLimit = true;
260 static constexpr std::size_t FixedBitLength = TLen;
261 static constexpr bool FixedBitLengthSignExtend = TSignExtend;
262
263 template <typename TField>
264 using AdaptFixedBitLengthLimit =
265 comms::field::adapter::FixedBitLength<
267 FixedBitLengthSignExtend,
268 TField>;
269};
270
271template <std::size_t TMinLen, std::size_t TMaxLen, typename... TOptions>
272class OptionsParser<
273 comms::option::def::VarLength<TMinLen, TMaxLen>,
274 TOptions...> : public OptionsParser<TOptions...>
275{
276public:
277 static constexpr bool HasVarLengthLimits = true;
278 static constexpr std::size_t MinVarLength = TMinLen;
279 static constexpr std::size_t MaxVarLength = TMaxLen;
280
281 template <typename TField>
282 using AdaptVarLengthLimits =
283 comms::field::adapter::VarLength<MinVarLength, MaxVarLength, TField>;
284};
285
286template <typename... TOptions>
287class OptionsParser<
288 comms::option::def::AvailableLengthLimit,
289 TOptions...> : public OptionsParser<TOptions...>
290{
291public:
292 static constexpr bool HasAvailableLengthLimit = true;
293
294 template <typename TField>
295 using AdaptAvailableLengthLimit =
296 comms::field::adapter::AvailableLength<TField>;
297};
298
299template <typename... TOptions>
300class OptionsParser<
301 comms::option::def::SequenceSizeForcingEnabled,
302 TOptions...> : public OptionsParser<TOptions...>
303{
304public:
305 static constexpr bool HasSequenceSizeForcing = true;
306
307 template <typename TField>
308 using AdaptSequenceSizeForcing = comms::field::adapter::SequenceSizeForcing<TField>;
309};
310
311template <typename... TOptions>
312class OptionsParser<
313 comms::option::def::SequenceLengthForcingEnabled,
314 TOptions...> : public OptionsParser<TOptions...>
315{
316public:
317 static constexpr bool HasSequenceLengthForcing = true;
318
319 template <typename TField>
320 using AdaptSequenceLengthForcing = comms::field::adapter::SequenceLengthForcing<TField>;
321};
322
323template <typename... TOptions>
324class OptionsParser<
325 comms::option::def::SequenceElemLengthForcingEnabled,
326 TOptions...> : public OptionsParser<TOptions...>
327{
328public:
329 static constexpr bool HasSequenceElemLengthForcing = true;
330
331 template <typename TField>
332 using AdaptSequenceElemLengthForcing = comms::field::adapter::SequenceElemLengthForcing<TField>;
333};
334
335template <std::size_t TSize, typename... TOptions>
336class OptionsParser<
337 comms::option::def::SequenceFixedSize<TSize>,
338 TOptions...> : public OptionsParser<TOptions...>
339{
340public:
341 static constexpr bool HasSequenceFixedSize = true;
342 static constexpr std::size_t SequenceFixedSize = TSize;
343
344 template <typename TField>
345 using AdaptSequenceFixedSize = comms::field::adapter::SequenceFixedSize<SequenceFixedSize, TField>;
346};
347
348template <typename... TOptions>
349class OptionsParser<
350 comms::option::app::SequenceFixedSizeUseFixedSizeStorage,
351 TOptions...> : public OptionsParser<TOptions...>
352{
353public:
354 static constexpr bool HasSequenceFixedSizeUseFixedSizeStorage = true;
355};
356
357template <typename TSizeField, typename... TOptions>
358class OptionsParser<
359 comms::option::def::SequenceSizeFieldPrefix<TSizeField>,
360 TOptions...> : public OptionsParser<TOptions...>
361{
362public:
363 static constexpr bool HasSequenceSizeFieldPrefix = true;
364 using SequenceSizeFieldPrefix = TSizeField;
365
366 template <typename TField>
367 using AdaptSequenceSizeFieldPrefix = comms::field::adapter::SequenceSizeFieldPrefix<SequenceSizeFieldPrefix, TField>;
368};
369
370template <typename TField, comms::ErrorStatus TReadErrorStatus, typename... TOptions>
371class OptionsParser<
372 comms::option::def::SequenceSerLengthFieldPrefix<TField, TReadErrorStatus>,
373 TOptions...> : public OptionsParser<TOptions...>
374{
375public:
376 static constexpr bool HasSequenceSerLengthFieldPrefix = true;
377 using SequenceSerLengthFieldPrefix = TField;
378 static constexpr comms::ErrorStatus SequenceSerLengthFieldReadErrorStatus = TReadErrorStatus;
379
380 template <typename TWrappedField>
381 using AdaptSequenceSerLengthFieldPrefix =
382 comms::field::adapter::SequenceSerLengthFieldPrefix<
384 SequenceSerLengthFieldReadErrorStatus,
385 TWrappedField
386 >;
387};
388
389template <typename TField, comms::ErrorStatus TReadErrorStatus, typename... TOptions>
390class OptionsParser<
391 comms::option::def::SequenceElemSerLengthFieldPrefix<TField, TReadErrorStatus>,
392 TOptions...> : public OptionsParser<TOptions...>
393{
394public:
395 static constexpr bool HasSequenceElemSerLengthFieldPrefix = true;
397 static constexpr comms::ErrorStatus SequenceElemSerLengthFieldReadErrorStatus = TReadErrorStatus;
398
399 template <typename TWrappedField>
400 using AdaptSequenceElemSerLengthFieldPrefix =
401 comms::field::adapter::SequenceElemSerLengthFieldPrefix<
403 SequenceElemSerLengthFieldReadErrorStatus,
404 TWrappedField
405 >;
406};
407
408template <typename TField, comms::ErrorStatus TReadErrorStatus, typename... TOptions>
409class OptionsParser<
410 comms::option::def::SequenceElemFixedSerLengthFieldPrefix<TField, TReadErrorStatus>,
411 TOptions...> : public OptionsParser<TOptions...>
412{
413public:
414 static constexpr bool HasSequenceElemFixedSerLengthFieldPrefix = true;
416 static constexpr comms::ErrorStatus SequenceElemFixedSerLengthFieldReadErrorStatus = TReadErrorStatus;
417
418 template <typename TWrappedField>
419 using AdaptSequenceElemFixedSerLengthFieldPrefix =
420 comms::field::adapter::SequenceElemFixedSerLengthFieldPrefix<
422 SequenceElemFixedSerLengthFieldReadErrorStatus,
423 TWrappedField
424 >;
425};
426
427template <typename TTrailField, typename... TOptions>
428class OptionsParser<
429 comms::option::def::SequenceTrailingFieldSuffix<TTrailField>,
430 TOptions...> : public OptionsParser<TOptions...>
431{
432public:
433 static constexpr bool HasSequenceTrailingFieldSuffix = true;
434 using SequenceTrailingFieldSuffix = TTrailField;
435
436 template <typename TField>
437 using AdaptSequenceTrailingFieldSuffix = comms::field::adapter::SequenceTrailingFieldSuffix<SequenceTrailingFieldSuffix, TField>;
438};
439
440template <typename TTermField, typename... TOptions>
441class OptionsParser<
442 comms::option::def::SequenceTerminationFieldSuffix<TTermField>,
443 TOptions...> : public OptionsParser<TOptions...>
444{
445public:
446 static constexpr bool HasSequenceTerminationFieldSuffix = true;
447 using SequenceTerminationFieldSuffix = TTermField;
448
449 template <typename TField>
450 using AdaptSequenceTerminationFieldSuffix =
451 comms::field::adapter::SequenceTerminationFieldSuffix<SequenceTerminationFieldSuffix, TField>;
452};
453
454template <typename TInitialiser, typename... TOptions>
455class OptionsParser<
456 comms::option::def::DefaultValueInitialiser<TInitialiser>,
457 TOptions...> : public OptionsParser<TOptions...>
458{
459public:
460 static constexpr bool HasDefaultValueInitialiser = true;
461 using DefaultValueInitialiser = TInitialiser;
462
463 template <typename TField>
464 using AdaptDefaultValueInitialiser =
465 comms::field::adapter::DefaultValueInitialiser<DefaultValueInitialiser, TField>;
466};
467
468template <typename TValidator, typename... TOptions>
469class OptionsParser<
470 comms::option::def::ContentsValidator<TValidator>,
471 TOptions...> : public OptionsParser<TOptions...>
472{
473public:
474 static constexpr bool HasCustomValidator = true;
475 using CustomValidator = TValidator;
476
477 template <typename TField>
478 using AdaptCustomValidator = comms::field::adapter::CustomValidator<CustomValidator, TField>;
479};
480
481template <typename... TOptions>
482class OptionsParser<
483 comms::option::def::HasCustomRefresh,
484 TOptions...> : public OptionsParser<TOptions...>
485{
486public:
487 static constexpr bool HasCustomRefresh = true;
488
489 template <typename TField>
490 using AdaptCustomRefresh = comms::field::adapter::CustomRefreshWrap<TField>;
491};
492
493template <comms::ErrorStatus TStatus, typename... TOptions>
494class OptionsParser<
495 comms::option::def::FailOnInvalid<TStatus>,
496 TOptions...> : public OptionsParser<TOptions...>
497{
498public:
499 static constexpr bool HasFailOnInvalid = true;
500 static constexpr comms::ErrorStatus FailOnInvalidStatus = TStatus;
501
502 template <typename TField>
503 using AdaptFailOnInvalid = comms::field::adapter::FailOnInvalid<FailOnInvalidStatus, TField>;
504};
505
506template <typename... TOptions>
507class OptionsParser<
508 comms::option::def::IgnoreInvalid,
509 TOptions...> : public OptionsParser<TOptions...>
510{
511public:
512 static constexpr bool HasIgnoreInvalid = true;
513
514 template <typename TField>
515 using AdaptIgnoreInvalid = comms::field::adapter::IgnoreInvalid<TField>;
516};
517
518template <typename... TOptions>
519class OptionsParser<
520 comms::option::def::InvalidByDefault,
521 TOptions...> : public OptionsParser<TOptions...>
522{
523public:
524 static constexpr bool HasInvalidByDefault = true;
525
526 template <typename TField>
527 using AdaptInvalidByDefault = comms::field::adapter::InvalidByDefault<TField>;
528};
529
530template <std::size_t TSize, typename... TOptions>
531class OptionsParser<
532 comms::option::app::FixedSizeStorage<TSize>,
533 TOptions...> : public OptionsParser<TOptions...>
534{
535public:
536 static constexpr bool HasFixedSizeStorage = true;
537 static constexpr std::size_t FixedSizeStorage = TSize;
538};
539
540template <typename TType, typename... TOptions>
541class OptionsParser<
542 comms::option::app::CustomStorageType<TType>,
543 TOptions...> : public OptionsParser<TOptions...>
544{
545public:
546 static constexpr bool HasCustomStorageType = true;
547 using CustomStorageType = TType;
548};
549
550template <std::intmax_t TNum, std::intmax_t TDenom, typename... TOptions>
551class OptionsParser<
552 comms::option::def::ScalingRatio<TNum, TDenom>,
553 TOptions...> : public OptionsParser<TOptions...>
554{
555public:
556 static constexpr bool HasScalingRatio = true;
557 using ScalingRatio = std::ratio<TNum, TDenom>;
558};
559
560template <typename TType, typename TRatio, typename... TOptions>
561class OptionsParser<
562 comms::option::def::Units<TType, TRatio>,
563 TOptions...> : public OptionsParser<TOptions...>
564{
565public:
566 static constexpr bool HasUnits = true;
567 using UnitsType = TType;
568 using UnitsRatio = TRatio;
569};
570
571template <typename... TOptions>
572class OptionsParser<
573 comms::option::app::OrigDataView,
574 TOptions...> : public OptionsParser<TOptions...>
575{
576public:
577 static constexpr bool HasOrigDataView = true;
578};
579
580template <typename... TOptions>
581class OptionsParser<
582 comms::option::def::EmptySerialization,
583 TOptions...> : public OptionsParser<TOptions...>
584{
585public:
586 static constexpr bool HasEmptySerialization = true;
587
588 template <typename TField>
589 using AdaptEmptySerialization = comms::field::adapter::EmptySerialization<TField>;
590};
591
592template <bool THasMultiRangeValidation>
593struct MultiRangeAssembler
594{
595 template <typename TBase, typename T, T TMinValue, T TMaxValue>
596 using Type =
597 std::tuple<
598 std::tuple<
599 std::integral_constant<T, TMinValue>,
600 std::integral_constant<T, TMaxValue>
601 >
602 >;
603};
604
605template <>
606struct MultiRangeAssembler<true>
607{
608 using FalseAssembler = MultiRangeAssembler<false>;
609
610 template <typename TBase, typename T, T TMinValue, T TMaxValue>
611 using Type =
612 typename std::decay<
613 decltype(
614 std::tuple_cat(
615 std::declval<typename TBase::MultiRangeValidationRanges>(),
616 std::declval<typename FalseAssembler::template Type<TBase, T, TMinValue, TMaxValue> >()
617 )
618 )
619 >::type;
620};
621
622template <typename TBase, typename T, T TMinValue, T TMaxValue>
623using MultiRangeAssemblerT =
624 typename MultiRangeAssembler<TBase::HasMultiRangeValidation>::template Type<TBase, T, TMinValue, TMaxValue>;
625
626template <std::intmax_t TMinValue, std::intmax_t TMaxValue, typename... TOptions>
627class OptionsParser<
628 comms::option::def::ValidNumValueRange<TMinValue, TMaxValue>,
629 TOptions...> : public OptionsParser<TOptions...>
630{
631 using BaseImpl = OptionsParser<TOptions...>;
632public:
633#ifdef COMMS_COMPILER_GCC47
634 static_assert(!BaseImpl::HasMultiRangeValidation,
635 "Sorry gcc-4.7 fails to compile valid C++11 code that allows multiple usage"
636 "of comms::option::def::ValidNumValueRange options. Either use it only once or"
637 "upgrade your compiler.");
638#endif
639 using MultiRangeValidationRanges = MultiRangeAssemblerT<BaseImpl, std::intmax_t, TMinValue, TMaxValue>;
640 static constexpr bool HasMultiRangeValidation = true;
641
642 template <typename TField>
643 using AdaptMultiRangeValidation =
644 comms::field::adapter::NumValueMultiRangeValidator<MultiRangeValidationRanges, TField>;
645};
646
647template <typename... TOptions>
648class OptionsParser<
649 comms::option::def::ValidRangesClear,
650 TOptions...> : public OptionsParser<TOptions...>
651{
652 using BaseImpl = OptionsParser<TOptions...>;
653public:
654 using MultiRangeValidationRanges = void;
655 static constexpr bool HasMultiRangeValidation = false;
656
657 template <typename TField>
658 using AdaptMultiRangeValidation = TField;
659};
660
661template <std::uintmax_t TMinValue, std::uintmax_t TMaxValue, typename... TOptions>
662class OptionsParser<
663 comms::option::def::ValidBigUnsignedNumValueRange<TMinValue, TMaxValue>,
664 TOptions...> : public OptionsParser<TOptions...>
665{
666 using BaseImpl = OptionsParser<TOptions...>;
667public:
668#ifdef COMMS_COMPILER_GCC47
669 static_assert(!BaseImpl::HasMultiRangeValidation,
670 "Sorry gcc-4.7 fails to compile valid C++11 code that allows multiple usage"
671 "of comms::option::def::ValidNumValueRange options. Either use it only once or"
672 "upgrade your compiler.");
673#endif
674 using MultiRangeValidationRanges = MultiRangeAssemblerT<BaseImpl, std::uintmax_t, TMinValue, TMaxValue>;
675 static constexpr bool HasMultiRangeValidation = true;
676
677 template <typename TField>
678 using AdaptMultiRangeValidation =
679 comms::field::adapter::NumValueMultiRangeValidator<MultiRangeValidationRanges, TField>;
680};
681
682template <typename... TOptions>
683class OptionsParser<
684 comms::option::def::HasCustomVersionUpdate,
685 TOptions...> : public OptionsParser<TOptions...>
686{
687public:
688 static constexpr bool HasCustomVersionUpdate = true;
689};
690
691template <std::uintmax_t TFrom, std::uintmax_t TUntil, typename... TOptions>
692class OptionsParser<
693 comms::option::def::ExistsBetweenVersions<TFrom, TUntil>,
694 TOptions...> : public OptionsParser<TOptions...>
695{
696public:
697 static constexpr bool HasVersionsRange = true;
698 static constexpr std::uintmax_t ExistsFromVersion = TFrom;
699 static constexpr std::uintmax_t ExistsUntilVersion = TUntil;
700
701 template <typename TField>
702 using AdaptVersionsRange =
703 comms::field::adapter::ExistsBetweenVersions<ExistsFromVersion, ExistsUntilVersion, TField>;
704};
705
706template <typename... TOptions>
707class OptionsParser<
708 comms::option::def::VersionStorage,
709 TOptions...> : public OptionsParser<TOptions...>
710{
711public:
712 static constexpr bool HasVersionStorage = true;
713
714 template <typename TField>
715 using AdaptVersionStorage = comms::field::adapter::VersionStorage<TField>;
716};
717
718template <std::size_t TIdx, typename... TOptions>
719class OptionsParser<
720 comms::option::def::RemLengthMemberField<TIdx>,
721 TOptions...> : public OptionsParser<TOptions...>
722{
723 using BaseImpl = OptionsParser<TOptions...>;
724 static_assert(!BaseImpl::HasRemLengthMemberField,
725 "Option comms::def::option::RemLengthMemberField used multiple times");
726public:
727 static constexpr bool HasRemLengthMemberField = true;
728 static constexpr std::size_t RemLengthMemberFieldIdx = TIdx;
729
730 template <typename TField>
731 using AdaptRemLengthMemberField =
732 comms::field::adapter::RemLengthMemberField<RemLengthMemberFieldIdx, TField>;
733};
734
735template <typename... TOptions>
736class OptionsParser<
737 comms::option::def::HasCustomWrite,
738 TOptions...> : public OptionsParser<TOptions...>
739{
740public:
741 static constexpr bool HasCustomWrite = true;
742
743 template <typename TField>
744 using AdaptCustomWrite = comms::field::adapter::CustomWriteWrap<TField>;
745};
746
747template <typename TActField, typename... TOptions>
748class OptionsParser<
749 comms::option::def::FieldType<TActField>,
750 TOptions...> : public OptionsParser<TOptions...>
751{
752public:
753 static constexpr bool HasFieldType = true;
754 using FieldType = TActField;
755
756 template <typename TField>
757 using AdaptFieldType = comms::field::adapter::FieldType<TActField, TField>;
758};
759
760template <typename... TOptions>
761class OptionsParser<
762 comms::option::def::MissingOnReadFail,
763 TOptions...> : public OptionsParser<TOptions...>
764{
765public:
766 static constexpr bool HasMissingOnReadFail = true;
767
768 template <typename TField>
769 using AdaptMissingOnReadFail = comms::field::adapter::MissingOnReadFail<TField>;
770};
771
772template <typename... TOptions>
773class OptionsParser<
774 comms::option::def::MissingOnInvalid,
775 TOptions...> : public OptionsParser<TOptions...>
776{
777public:
778 static constexpr bool HasMissingOnInvalid = true;
779
780 template <typename TField>
781 using AdaptMissingOnInvalid = comms::field::adapter::MissingOnInvalid<TField>;
782};
783
784template <typename... TOptions>
785class OptionsParser<
786 comms::option::def::VariantHasCustomResetOnDestruct,
787 TOptions...> : public OptionsParser<TOptions...>
788{
789public:
790 static constexpr bool HasVariantCustomResetOnDestruct = true;
791
792 template <typename TField>
793 using AdaptVariantResetOnDestruct = TField;
794};
795
796template <bool TVersionDependent, typename... TOptions>
797class OptionsParser<
798 comms::option::def::HasVersionDependentMembers<TVersionDependent>,
799 TOptions...> : public OptionsParser<TOptions...>
800{
801public:
802 static constexpr bool HasVersionDependentMembersForced = true;
803 static constexpr MembersVersionDependency ForcedMembersVersionDependency =
804 TVersionDependent ? MembersVersionDependency_Dependent : MembersVersionDependency_Independent;
805};
806
807template <typename... TOptions>
808class OptionsParser<
809 comms::option::def::FixedValue,
810 TOptions...> : public OptionsParser<TOptions...>
811{
812public:
813 static constexpr bool HasFixedValue = true;
814
815 template <typename TField>
816 using AdaptFixedValue = comms::field::adapter::FixedValue<TField>;
817};
818
819template <std::intmax_t TOffset, typename... TOptions>
820class OptionsParser<
821 comms::option::def::DisplayOffset<TOffset>,
822 TOptions...> : public OptionsParser<TOptions...>
823{
824public:
825 static constexpr bool HasDisplayOffset = true;
826 static constexpr std::intmax_t DisplayOffset = TOffset;
827
828 template <typename TField>
829 using AdaptDisplayOffset = comms::field::adapter::DisplayOffset<TOffset, TField>;
830};
831
832template <typename... TOptions>
833class OptionsParser<
834 comms::option::def::HasName,
835 TOptions...> : public OptionsParser<TOptions...>
836{
837public:
838 static constexpr bool HasName = true;
839};
840
841template <typename... TOptions>
842class OptionsParser<
843 comms::option::app::EmptyOption,
844 TOptions...> : public OptionsParser<TOptions...>
845{
846};
847
848template <typename... TTupleOptions, typename... TOptions>
849class OptionsParser<
850 std::tuple<TTupleOptions...>,
851 TOptions...> : public OptionsParser<TTupleOptions..., TOptions...>
852{
853};
854
855} // namespace details
856
857} // namespace field
858
859} // namespace comms
860
Contains various compiler related definitions.
Contains definition of various tag classes.
ExistsBetweenVersions< 0, TVer > ExistsUntilVersion
Mark an comms::field::Optional field as existing only until specified version.
Definition options.h:1220
comms::option::def::SequenceTrailingFieldSuffix< TField > SequenceTrailingFieldSuffix
Same as comms::option::def::SequenceTrailingFieldSuffix.
Definition options.h:1590
comms::option::def::HasName HasName
Same as comms::option::def::HasName.
Definition options.h:1917
comms::option::def::SequenceElemFixedSerLengthFieldPrefix< TField, TReadErrorStatus > SequenceElemFixedSerLengthFieldPrefix
Same as comms::option::def::SequenceElemFixedSerLengthFieldPrefix.
Definition options.h:1580
comms::option::def::SequenceTerminationFieldSuffix< TField > SequenceTerminationFieldSuffix
Same as comms::option::def::SequenceTerminationFieldSuffix.
Definition options.h:1585
comms::option::def::SequenceSerLengthFieldPrefix< TField, TReadErrorStatus > SequenceSerLengthFieldPrefix
Same as comms::option::def::SequenceSerLengthFieldPrefix.
Definition options.h:1568
comms::option::def::DefaultValueInitialiser< T > DefaultValueInitialiser
Same as comms::option::def::DefaultValueInitialiser.
Definition options.h:1612
comms::option::def::FixedLength< TLen, TSignExtend > FixedLength
Same as comms::option::def::FixedLength.
Definition options.h:1537
comms::option::def::SequenceFixedSize< TSize > SequenceFixedSize
Same as comms::option::def::SequenceFixedSize.
Definition options.h:1607
comms::option::def::HasCustomVersionUpdate HasCustomVersionUpdate
Same as comms::option::def::HasCustomVersionUpdate.
Definition options.h:1934
comms::option::def::HasCustomRead HasCustomRead
Same as comms::option::def::HasCustomRead.
Definition options.h:1909
comms::option::def::FieldType< TMsg > FieldType
Same as comms::option::def::FieldType.
Definition options.h:1505
comms::option::def::SequenceElemSerLengthFieldPrefix< TField, TReadErrorStatus > SequenceElemSerLengthFieldPrefix
Same as comms::option::def::SequenceElemSerLengthFieldPrefix.
Definition options.h:1574
comms::option::app::FixedSizeStorage< TSize > FixedSizeStorage
Same as comms::option::app::FixedSizeStorage.
Definition options.h:2046
comms::option::app::CustomStorageType< TType > CustomStorageType
Same as comms::option::app::CustomStorageType.
Definition options.h:2051
comms::option::def::HasCustomRefresh HasCustomRefresh
Same as comms::option::def::HasCustomRefresh.
Definition options.h:1913
comms::option::def::FixedBitLength< TLen, TSignExtend > FixedBitLength
Same as comms::option::def::FixedBitLength.
Definition options.h:1542
comms::option::def::SequenceSizeFieldPrefix< TField > SequenceSizeFieldPrefix
Same as comms::option::def::SequenceSizeFieldPrefix.
Definition options.h:1562
comms::option::def::ScalingRatio< TNum, TDenom > ScalingRatio
Same as comms::option::def::ScalingRatio.
Definition options.h:1557
Main namespace for all classes / functions of COMMS library.
ErrorStatus
Error statuses reported by the Communication module.
Definition ErrorStatus.h:19
STL namespace.
Contains definition of all the options used by the COMMS library.
Replacement to std::conditional.
Definition type_traits.h:32
Replacement to some types from standard type_traits.