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