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
11#include "comms/field/details/adapters.h"
12#include "comms/field/details/MembersVersionDependency.h"
13#include "comms/field/tag.h"
14#include "comms/options.h"
16
17#include <limits>
18#include <ratio>
19#include <tuple>
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
617template <typename TBase, typename T, T TMinValue, T TMaxValue>
618using MultiRangeAssemblerT =
619 typename MultiRangeAssembler<TBase::HasMultiRangeValidation>::template Type<TBase, T, TMinValue, TMaxValue>;
620
621template <std::intmax_t TMinValue, std::intmax_t TMaxValue, typename... TOptions>
622class OptionsParser<
623 comms::option::def::ValidNumValueRange<TMinValue, TMaxValue>,
624 TOptions...> : public OptionsParser<TOptions...>
625{
626 using BaseImpl = OptionsParser<TOptions...>;
627public:
628#ifdef COMMS_COMPILER_GCC47
629 static_assert(!BaseImpl::HasMultiRangeValidation,
630 "Sorry gcc-4.7 fails to compile valid C++11 code that allows multiple usage"
631 "of comms::option::def::ValidNumValueRange options. Either use it only once or"
632 "upgrade your compiler.");
633#endif
634 using MultiRangeValidationRanges = MultiRangeAssemblerT<BaseImpl, std::intmax_t, TMinValue, TMaxValue>;
635 static constexpr bool HasMultiRangeValidation = true;
636
637 template <typename TField>
638 using AdaptMultiRangeValidation =
639 comms::field::adapter::NumValueMultiRangeValidator<MultiRangeValidationRanges, TField>;
640};
641
642template <typename... TOptions>
643class OptionsParser<
644 comms::option::def::ValidRangesClear,
645 TOptions...> : public OptionsParser<TOptions...>
646{
647 using BaseImpl = OptionsParser<TOptions...>;
648public:
649 using MultiRangeValidationRanges = void;
650 static constexpr bool HasMultiRangeValidation = false;
651
652 template <typename TField>
653 using AdaptMultiRangeValidation = TField;
654};
655
656template <std::uintmax_t TMinValue, std::uintmax_t TMaxValue, typename... TOptions>
657class OptionsParser<
658 comms::option::def::ValidBigUnsignedNumValueRange<TMinValue, TMaxValue>,
659 TOptions...> : public OptionsParser<TOptions...>
660{
661 using BaseImpl = OptionsParser<TOptions...>;
662public:
663#ifdef COMMS_COMPILER_GCC47
664 static_assert(!BaseImpl::HasMultiRangeValidation,
665 "Sorry gcc-4.7 fails to compile valid C++11 code that allows multiple usage"
666 "of comms::option::def::ValidNumValueRange options. Either use it only once or"
667 "upgrade your compiler.");
668#endif
669 using MultiRangeValidationRanges = MultiRangeAssemblerT<BaseImpl, std::uintmax_t, TMinValue, TMaxValue>;
670 static constexpr bool HasMultiRangeValidation = true;
671
672 template <typename TField>
673 using AdaptMultiRangeValidation =
674 comms::field::adapter::NumValueMultiRangeValidator<MultiRangeValidationRanges, TField>;
675};
676
677template <typename... TOptions>
678class OptionsParser<
679 comms::option::def::HasCustomVersionUpdate,
680 TOptions...> : public OptionsParser<TOptions...>
681{
682public:
683 static constexpr bool HasCustomVersionUpdate = true;
684};
685
686template <std::uintmax_t TFrom, std::uintmax_t TUntil, typename... TOptions>
687class OptionsParser<
688 comms::option::def::ExistsBetweenVersions<TFrom, TUntil>,
689 TOptions...> : public OptionsParser<TOptions...>
690{
691public:
692 static constexpr bool HasVersionsRange = true;
693 static constexpr std::uintmax_t ExistsFromVersion = TFrom;
694 static constexpr std::uintmax_t ExistsUntilVersion = TUntil;
695
696 template <typename TField>
697 using AdaptVersionsRange =
698 comms::field::adapter::ExistsBetweenVersions<ExistsFromVersion, ExistsUntilVersion, TField>;
699};
700
701template <typename... TOptions>
702class OptionsParser<
703 comms::option::def::VersionStorage,
704 TOptions...> : public OptionsParser<TOptions...>
705{
706public:
707 static constexpr bool HasVersionStorage = true;
708
709 template <typename TField>
710 using AdaptVersionStorage = comms::field::adapter::VersionStorage<TField>;
711};
712
713template <std::size_t TIdx, typename... TOptions>
714class OptionsParser<
715 comms::option::def::RemLengthMemberField<TIdx>,
716 TOptions...> : public OptionsParser<TOptions...>
717{
718 using BaseImpl = OptionsParser<TOptions...>;
719 static_assert(!BaseImpl::HasRemLengthMemberField,
720 "Option comms::def::option::RemLengthMemberField used multiple times");
721public:
722 static constexpr bool HasRemLengthMemberField = true;
723 static constexpr std::size_t RemLengthMemberFieldIdx = TIdx;
724
725 template <typename TField>
726 using AdaptRemLengthMemberField =
727 comms::field::adapter::RemLengthMemberField<RemLengthMemberFieldIdx, TField>;
728};
729
730template <typename... TOptions>
731class OptionsParser<
732 comms::option::def::HasCustomWrite,
733 TOptions...> : public OptionsParser<TOptions...>
734{
735public:
736 static constexpr bool HasCustomWrite = true;
737
738 template <typename TField>
739 using AdaptCustomWrite = comms::field::adapter::CustomWriteWrap<TField>;
740};
741
742template <typename TActField, typename... TOptions>
743class OptionsParser<
744 comms::option::def::FieldType<TActField>,
745 TOptions...> : public OptionsParser<TOptions...>
746{
747public:
748 static constexpr bool HasFieldType = true;
749 using FieldType = TActField;
750
751 template <typename TField>
752 using AdaptFieldType = comms::field::adapter::FieldType<TActField, TField>;
753};
754
755template <typename... TOptions>
756class OptionsParser<
757 comms::option::def::MissingOnReadFail,
758 TOptions...> : public OptionsParser<TOptions...>
759{
760public:
761 static constexpr bool HasMissingOnReadFail = true;
762
763 template <typename TField>
764 using AdaptMissingOnReadFail = comms::field::adapter::MissingOnReadFail<TField>;
765};
766
767template <typename... TOptions>
768class OptionsParser<
769 comms::option::def::MissingOnInvalid,
770 TOptions...> : public OptionsParser<TOptions...>
771{
772public:
773 static constexpr bool HasMissingOnInvalid = true;
774
775 template <typename TField>
776 using AdaptMissingOnInvalid = comms::field::adapter::MissingOnInvalid<TField>;
777};
778
779template <typename... TOptions>
780class OptionsParser<
781 comms::option::def::VariantHasCustomResetOnDestruct,
782 TOptions...> : public OptionsParser<TOptions...>
783{
784public:
785 static constexpr bool HasVariantCustomResetOnDestruct = true;
786
787 template <typename TField>
788 using AdaptVariantResetOnDestruct = TField;
789};
790
791template <bool TVersionDependent, typename... TOptions>
792class OptionsParser<
793 comms::option::def::HasVersionDependentMembers<TVersionDependent>,
794 TOptions...> : public OptionsParser<TOptions...>
795{
796public:
797 static constexpr bool HasVersionDependentMembersForced = true;
798 static constexpr MembersVersionDependency ForcedMembersVersionDependency =
799 TVersionDependent ? MembersVersionDependency_Dependent : MembersVersionDependency_Independent;
800};
801
802template <typename... TOptions>
803class OptionsParser<
804 comms::option::def::FixedValue,
805 TOptions...> : public OptionsParser<TOptions...>
806{
807public:
808 static constexpr bool HasFixedValue = true;
809
810 template <typename TField>
811 using AdaptFixedValue = comms::field::adapter::FixedValue<TField>;
812};
813
814template <std::intmax_t TOffset, typename... TOptions>
815class OptionsParser<
816 comms::option::def::DisplayOffset<TOffset>,
817 TOptions...> : public OptionsParser<TOptions...>
818{
819public:
820 static constexpr bool HasDisplayOffset = true;
821 static constexpr std::intmax_t DisplayOffset = TOffset;
822
823 template <typename TField>
824 using AdaptDisplayOffset = comms::field::adapter::DisplayOffset<TOffset, TField>;
825};
826
827template <typename... TOptions>
828class OptionsParser<
829 comms::option::def::HasName,
830 TOptions...> : public OptionsParser<TOptions...>
831{
832public:
833 static constexpr bool HasName = true;
834};
835
836template <typename... TOptions>
837class OptionsParser<
838 comms::option::app::EmptyOption,
839 TOptions...> : public OptionsParser<TOptions...>
840{
841};
842
843template <typename... TTupleOptions, typename... TOptions>
844class OptionsParser<
845 std::tuple<TTupleOptions...>,
846 TOptions...> : public OptionsParser<TTupleOptions..., TOptions...>
847{
848};
849
850} // namespace details
851
852} // namespace field
853
854} // namespace comms
855
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:1218
comms::option::def::SequenceTrailingFieldSuffix< TField > SequenceTrailingFieldSuffix
Same as comms::option::def::SequenceTrailingFieldSuffix.
Definition options.h:1588
comms::option::def::HasName HasName
Same as comms::option::def::HasName.
Definition options.h:1915
comms::option::def::SequenceElemFixedSerLengthFieldPrefix< TField, TReadErrorStatus > SequenceElemFixedSerLengthFieldPrefix
Same as comms::option::def::SequenceElemFixedSerLengthFieldPrefix.
Definition options.h:1578
comms::option::def::SequenceTerminationFieldSuffix< TField > SequenceTerminationFieldSuffix
Same as comms::option::def::SequenceTerminationFieldSuffix.
Definition options.h:1583
comms::option::def::SequenceSerLengthFieldPrefix< TField, TReadErrorStatus > SequenceSerLengthFieldPrefix
Same as comms::option::def::SequenceSerLengthFieldPrefix.
Definition options.h:1566
comms::option::def::DefaultValueInitialiser< T > DefaultValueInitialiser
Same as comms::option::def::DefaultValueInitialiser.
Definition options.h:1610
comms::option::def::FixedLength< TLen, TSignExtend > FixedLength
Same as comms::option::def::FixedLength.
Definition options.h:1535
comms::option::def::SequenceFixedSize< TSize > SequenceFixedSize
Same as comms::option::def::SequenceFixedSize.
Definition options.h:1605
comms::option::def::HasCustomVersionUpdate HasCustomVersionUpdate
Same as comms::option::def::HasCustomVersionUpdate.
Definition options.h:1932
comms::option::def::HasCustomRead HasCustomRead
Same as comms::option::def::HasCustomRead.
Definition options.h:1907
comms::option::def::FieldType< TMsg > FieldType
Same as comms::option::def::FieldType.
Definition options.h:1503
comms::option::def::SequenceElemSerLengthFieldPrefix< TField, TReadErrorStatus > SequenceElemSerLengthFieldPrefix
Same as comms::option::def::SequenceElemSerLengthFieldPrefix.
Definition options.h:1572
comms::option::app::FixedSizeStorage< TSize > FixedSizeStorage
Same as comms::option::app::FixedSizeStorage.
Definition options.h:2044
comms::option::app::CustomStorageType< TType > CustomStorageType
Same as comms::option::app::CustomStorageType.
Definition options.h:2049
comms::option::def::HasCustomRefresh HasCustomRefresh
Same as comms::option::def::HasCustomRefresh.
Definition options.h:1911
comms::option::def::FixedBitLength< TLen, TSignExtend > FixedBitLength
Same as comms::option::def::FixedBitLength.
Definition options.h:1540
comms::option::def::SequenceSizeFieldPrefix< TField > SequenceSizeFieldPrefix
Same as comms::option::def::SequenceSizeFieldPrefix.
Definition options.h:1560
comms::option::def::ScalingRatio< TNum, TDenom > ScalingRatio
Same as comms::option::def::ScalingRatio.
Definition options.h:1555
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:29
Replacement to some types from standard type_traits.