COMMS
Template library intended to help with implementation of communication protocols.
Loading...
Searching...
No Matches
units.h
Go to the documentation of this file.
1//
2// Copyright 2017 - 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
12
13#pragma once
14
16#include "comms/details/tag.h"
17#include "comms/traits.h"
19
20#include <ratio>
21#include <type_traits>
22#include <utility>
23
24COMMS_MSVC_WARNING_PUSH
25COMMS_MSVC_WARNING_DISABLE(4100) // Disable unreferenced parameter warning
26COMMS_MSVC_WARNING_DISABLE(4127) // Disable warning about constant conditional expressions
27
28namespace comms
29{
30
31namespace units
32{
33
34namespace details
35{
36
37template <typename TField>
38using ScalingRatioOf = typename TField::ScalingRatio;
39
40template <typename TField, typename TConvRatio>
41using FullUnitsRatioOf =
42 typename std::ratio_divide<
43 typename std::ratio_multiply<
44 ScalingRatioOf<TField>,
45 typename TField::UnitsRatio
46 >::type,
47 TConvRatio
48 >::type;
49
50template <typename...>
51struct UnitsValueConverter
52{
53 template <typename TRet, typename TConvRatio, typename TField>
54 static TRet getValue(const TField& field)
55 {
56 using Ratio = FullUnitsRatioOf<TField, TConvRatio>;
57 using Tag = RatioTag<TField, TConvRatio>;
58 return getValueInternal<TRet, Ratio>(field, Tag());
59 }
60
61 template <typename TConvRatio, typename TField, typename TVal>
62 static void setValue(TField& field, TVal&& value)
63 {
64 using Ratio = FullUnitsRatioOf<TField, TConvRatio>;
65 using Tag = RatioTag<TField, TConvRatio>;
66 return setValueInternal<Ratio>(field, std::forward<TVal>(value), Tag());
67 }
68
69private:
70 template <typename...>
71 using HasConversionTag = comms::details::tag::Tag1<>;
72
73 template <typename...>
74 using NoConversionTag = comms::details::tag::Tag2<>;
75
76 template <typename...>
77 using ConvertToFpTag = comms::details::tag::Tag3<>;
78
79 template <typename...>
80 using ConvertToIntTag = comms::details::tag::Tag4<>;
81
82 template <typename TField, typename TConvRatio>
83 using RatioTag =
84 typename comms::util::LazyShallowConditional<
85 std::is_same<FullUnitsRatioOf<TField, TConvRatio>, std::ratio<1, 1> >::value
86 >::template Type<
87 NoConversionTag,
88 HasConversionTag
89 >;
90
91 template <typename TRet>
92 using TypeTag =
93 typename comms::util::LazyShallowConditional<
94 std::is_floating_point<TRet>::value
95 >::template Type<
96 ConvertToFpTag,
97 ConvertToIntTag
98 >;
99
100 template <typename TRet, typename TRatio, typename TField, typename... TParams>
101 static TRet getValueInternal(const TField& field, NoConversionTag<TParams...>)
102 {
103 return static_cast<TRet>(field.value());
104 }
105
106 template <typename TRet, typename TRatio, typename TField, typename... TParams>
107 static TRet getValueInternal(const TField& field, HasConversionTag<TParams...>)
108 {
109 using Tag = TypeTag<TRet>;
110 return getValueInternal<TRet, TRatio>(field, Tag());
111 }
112
113 template <typename TRet, typename TRatio, typename TField, typename... TParams>
114 static TRet getValueInternal(const TField& field, ConvertToFpTag<TParams...>)
115 {
116 static_assert(std::is_floating_point<TRet>::value,
117 "TRet is expected to be floating point type");
118 return static_cast<TRet>(field.value()) * (static_cast<TRet>(TRatio::num) / static_cast<TRet>(TRatio::den));
119 }
120
121 template <typename TRet, typename TRatio, typename TField, typename... TParams>
122 static TRet getValueInternal(const TField& field, ConvertToIntTag<TParams...>)
123 {
124 static_assert(std::is_integral<TRet>::value,
125 "TRet is expected to be integral type");
126
127 using FieldType = typename std::decay<decltype(field)>::type;
128 using ValueType = typename FieldType::ValueType;
129
130 static_assert(
131 std::is_integral<ValueType>::value ||
132 std::is_floating_point<ValueType>::value ||
133 std::is_enum<ValueType>::value,
134 "Unexpected field in units conversion");
135
136 using CastType =
138 std::is_floating_point<ValueType>::value
139 >::template Type<
141 std::is_same<ValueType, float>::value
142 >::template Type<
143 double,
144 ValueType
145 >,
147 std::is_signed<TRet>::value
148 >::template Type<
149 std::intmax_t,
150 std::uintmax_t
151 >
152 >;
153
154 return
155 static_cast<TRet>(
156 (static_cast<CastType>(field.value()) * TRatio::num) / TRatio::den);
157 }
158
159 template <typename TRatio, typename TField, typename TVal, typename... TParams>
160 static void setValueInternal(TField& field, TVal&& value, NoConversionTag<TParams...>)
161 {
162 using FieldType = typename std::decay<decltype(field)>::type;
163 using ValueType = typename FieldType::ValueType;
164 field.value() = static_cast<ValueType>(value);
165 }
166
167 template <typename TRatio, typename TField, typename TVal, typename... TParams>
168 static void setValueInternal(TField& field, TVal&& value, HasConversionTag<TParams...>)
169 {
170 using Tag = TypeTag<typename std::decay<decltype(value)>::type>;
171 setValueInternal<TRatio>(field, std::forward<TVal>(value), Tag());
172 }
173
174 template <typename TRatio, typename TField, typename TVal, typename... TParams>
175 static void setValueInternal(TField& field, TVal&& value, ConvertToIntTag<TParams...>)
176 {
177 using FieldType = typename std::decay<decltype(field)>::type;
178 using ValueType = typename FieldType::ValueType;
179
180 static_assert(
181 std::is_integral<ValueType>::value ||
182 std::is_floating_point<ValueType>::value ||
183 std::is_enum<ValueType>::value,
184 "Unexpected field in units conversion");
185
186 using CastType =
188 std::is_floating_point<ValueType>::value
189 >::template Type<
191 std::is_same<ValueType, float>::value
192 >::template Type<
193 double,
194 ValueType
195 >,
197 std::is_signed<typename std::decay<decltype(value)>::type>::value
198 >::template Type<
199 std::intmax_t,
200 std::uintmax_t
201 >
202 >;
203
204 field.value() =
205 static_cast<ValueType>(
206 (static_cast<CastType>(value) * TRatio::den) / static_cast<CastType>(TRatio::num));
207 }
208
209 template <typename TRatio, typename TField, typename TVal, typename... TParams>
210 static void setValueInternal(TField& field, TVal&& value, ConvertToFpTag<TParams...>)
211 {
212 using DecayedType = typename std::decay<decltype(value)>::type;
213 using FieldType = typename std::decay<decltype(field)>::type;
214 using ValueType = typename FieldType::ValueType;
215
216 auto epsilon = DecayedType(0);
217 if ((TRatio::num < TRatio::den) && std::is_integral<ValueType>::value) {
218 epsilon = static_cast<DecayedType>(TRatio::num) / static_cast<DecayedType>(TRatio::den + 1);
219 }
220
221 if (epsilon < DecayedType(0)) {
222 epsilon = -epsilon;
223 }
224
225 if (value < DecayedType(0)) {
226 epsilon = -epsilon;
227 }
228
229 field.value() =
230 static_cast<ValueType>(
231 ((value + epsilon) * static_cast<DecayedType>(TRatio::den)) / static_cast<DecayedType>(TRatio::num));
232 }
233
234};
235
236template <typename TField, typename TType>
237constexpr bool hasExpectedUnits()
238{
239 return std::is_same<typename TField::UnitsType, TType>::value;
240}
241
242template <typename TRet, typename TConvRatio, typename TField>
243TRet getTime(const TField& field)
244{
245 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Time>(),
246 "The field is expected to contain \"time\" units.");
247 return UnitsValueConverter<>::getValue<TRet, TConvRatio>(field);
248}
249
250template <typename TConvRatio, typename TField, typename TVal>
251void setTime(TField& field, TVal&& val)
252{
253 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Time>(),
254 "The field is expected to contain \"time\" units.");
255 UnitsValueConverter<>::setValue<TConvRatio>(field, std::forward<TVal>(val));
256}
257
258template <typename TRet, typename TConvRatio, typename TField>
259TRet getDistance(const TField& field)
260{
261 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Distance>(),
262 "The field is expected to contain \"distance\" units.");
263 return UnitsValueConverter<>::getValue<TRet, TConvRatio>(field);
264}
265
266template <typename TConvRatio, typename TField, typename TVal>
267void setDistance(TField& field, TVal&& val)
268{
269 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Distance>(),
270 "The field is expected to contain \"distance\" units.");
271 UnitsValueConverter<>::setValue<TConvRatio>(field, std::forward<TVal>(val));
272}
273
274template <typename TRet, typename TConvRatio, typename TField>
275TRet getSpeed(const TField& field)
276{
277 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Speed>(),
278 "The field is expected to contain \"speed\" units.");
279 return UnitsValueConverter<>::getValue<TRet, TConvRatio>(field);
280}
281
282template <typename TConvRatio, typename TField, typename TVal>
283void setSpeed(TField& field, TVal&& val)
284{
285 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Speed>(),
286 "The field is expected to contain \"speed\" units.");
287 UnitsValueConverter<>::setValue<TConvRatio>(field, std::forward<TVal>(val));
288}
289
290template <typename TRet, typename TConvRatio, typename TField>
291TRet getFrequency(const TField& field)
292{
293 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Frequency>(),
294 "The field is expected to contain \"frequency\" units.");
295 return UnitsValueConverter<>::getValue<TRet, TConvRatio>(field);
296}
297
298template <typename TConvRatio, typename TField, typename TVal>
299void setFrequency(TField& field, TVal&& val)
300{
301 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Frequency>(),
302 "The field is expected to contain \"frequency\" units.");
303 UnitsValueConverter<>::setValue<TConvRatio>(field, std::forward<TVal>(val));
304}
305
306template <typename T>
307struct PI
308{
309 static constexpr T Value = static_cast<T>(3.14159265358979323846264338327950288419716939937510582097494459230781640628620899L);
310};
311
312template <typename...>
313struct AngleValueConverter
314{
315 template <typename TRet, typename TConvRatio, typename TField>
316 static TRet getValue(const TField& field)
317 {
318 using FieldType = typename std::decay<decltype(field)>::type;
319 static_assert(details::hasExpectedUnits<FieldType, comms::traits::units::Angle>(),
320 "The field is expected to contain \"angle\" units.");
321
322 using Tag = GetTag<FieldType, TConvRatio>;
323 return getValueInternal<TRet, TConvRatio>(field, Tag());
324 }
325
326 template <typename TConvRatio, typename TField, typename TVal>
327 static void setValue(TField& field, TVal&& val)
328 {
329 using FieldType = typename std::decay<decltype(field)>::type;
330 static_assert(details::hasExpectedUnits<FieldType, comms::traits::units::Angle>(),
331 "The field is expected to contain \"angle\" units.");
332
333 using Tag = SetTag<FieldType, TConvRatio>;
334 setValueInternal<TConvRatio>(field, std::forward<TVal>(val), Tag());
335 }
336
337private:
338 template <typename... TParams>
339 using SameUnitsTag = comms::details::tag::Tag1<>;
340
341 template <typename... TParams>
342 using DegreesToRadiansTag = comms::details::tag::Tag2<>;
343
344 template <typename... TParams>
345 using RadiansToDegreesTag = comms::details::tag::Tag3<>;
346
347 template <typename TConvRatio>
348 using SetUnitsTag =
349 typename comms::util::LazyShallowConditional<
350 std::is_same<TConvRatio, typename comms::traits::units::RadiansRatio>::value
351 >::template Type<
352 RadiansToDegreesTag,
353 DegreesToRadiansTag
354 >;
355
356 template <typename TConvRatio>
357 using GetUnitsTag =
358 typename comms::util::LazyShallowConditional<
359 std::is_same<TConvRatio, typename comms::traits::units::RadiansRatio>::value
360 >::template Type<
361 DegreesToRadiansTag,
362 RadiansToDegreesTag
363 >;
364
365 template <typename TField, typename TConvRatio>
366 using GetTag =
367 typename comms::util::LazyShallowConditional<
368 std::is_same<TConvRatio, typename TField::UnitsRatio>::value
369 >::template Type<
370 SameUnitsTag,
371 GetUnitsTag,
372 TConvRatio
373 >;
374
375 template <typename TField, typename TConvRatio>
376 using SetTag =
377 typename comms::util::LazyShallowConditional<
378 std::is_same<TConvRatio, typename TField::UnitsRatio>::value
379 >::template Type<
380 SameUnitsTag,
381 SetUnitsTag,
382 TConvRatio
383 >;
384
385 template <typename TRet, typename TConvRatio, typename TField, typename... TParams>
386 static TRet getValueInternal(const TField& field, SameUnitsTag<TParams...>)
387 {
388 return field.template getScaled<TRet>();
389 }
390
391 template <typename TRet, typename TConvRatio, typename TField, typename... TParams>
392 static TRet getValueInternal(const TField& field, DegreesToRadiansTag<TParams...>)
393 {
394 using FieldType = typename std::decay<decltype(field)>::type;
395 static_assert(std::is_same<typename FieldType::UnitsRatio, comms::traits::units::DegreesRatio>::value,
396 "The field is expected to contain degrees.");
397
398 return PI<TRet>::Value * UnitsValueConverter<>::getValue<TRet, TConvRatio>(field);
399 }
400
401 template <typename TRet, typename TConvRatio, typename TField, typename... TParams>
402 static TRet getValueInternal(const TField& field, RadiansToDegreesTag<TParams...>)
403 {
404 using FieldType = typename std::decay<decltype(field)>::type;
405 static_assert(std::is_same<typename FieldType::UnitsRatio, comms::traits::units::RadiansRatio>::value,
406 "The field is expected to contain radians.");
407
408 return UnitsValueConverter<>::getValue<TRet, TConvRatio>(field) / PI<TRet>::Value;
409 }
410
411 template <typename TConvRatio, typename TField, typename TVal, typename... TParams>
412 static void setValueInternal(TField& field, TVal&& val, SameUnitsTag<TParams...>)
413 {
414 field.setScaled(std::forward<TVal>(val));
415 }
416
417 template <typename TConvRatio, typename TField, typename TVal, typename... TParams>
418 static void setValueInternal(TField& field, TVal&& val, DegreesToRadiansTag<TParams...>)
419 {
420 using FieldType = typename std::decay<decltype(field)>::type;
421 static_assert(std::is_same<typename FieldType::UnitsRatio, comms::traits::units::RadiansRatio>::value,
422 "The field is expected to contain radians.");
423
424 using ValueType = typename std::decay<decltype(val)>::type;
425 using PiType =
427 std::is_floating_point<ValueType>::value
428 >::template Type<
429 ValueType,
430 double
431 >;
432
433 UnitsValueConverter<>::setValue<TConvRatio>(field, val * PI<PiType>::Value);
434 }
435
436 template <typename TConvRatio, typename TField, typename TVal, typename... TParams>
437 static void setValueInternal(TField& field, TVal&& val, RadiansToDegreesTag<TParams...>)
438 {
439 using FieldType = typename std::decay<decltype(field)>::type;
440 static_assert(std::is_same<typename FieldType::UnitsRatio, comms::traits::units::DegreesRatio>::value,
441 "The field is expected to contain degrees.");
442
443 using ValueType = typename std::decay<decltype(val)>::type;
444 using PiType =
446 std::is_floating_point<ValueType>::value
447 >::template Type<
448 ValueType,
449 double
450 >;
451
452 UnitsValueConverter<>::setValue<TConvRatio>(field, static_cast<PiType>(val) / PI<PiType>::Value);
453 }
454};
455
456template <typename TRet, typename TConvRatio, typename TField>
457TRet getAngle(const TField& field)
458{
459 return AngleValueConverter<>::getValue<TRet, TConvRatio>(field);
460}
461
462template <typename TConvRatio, typename TField, typename TVal>
463void setAngle(TField& field, TVal&& val)
464{
465 AngleValueConverter<>::setValue<TConvRatio>(field, std::forward<TVal>(val));
466}
467
468template <typename TRet, typename TConvRatio, typename TField>
469TRet getCurrent(const TField& field)
470{
471 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Current>(),
472 "The field is expected to contain \"current\" units.");
473 return UnitsValueConverter<>::getValue<TRet, TConvRatio>(field);
474}
475
476template <typename TConvRatio, typename TField, typename TVal>
477void setCurrent(TField& field, TVal&& val)
478{
479 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Current>(),
480 "The field is expected to contain \"current\" units.");
481 UnitsValueConverter<>::setValue<TConvRatio>(field, std::forward<TVal>(val));
482}
483
484template <typename TRet, typename TConvRatio, typename TField>
485TRet getVoltage(const TField& field)
486{
487 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Voltage>(),
488 "The field is expected to contain \"voltage\" units.");
489 return UnitsValueConverter<>::getValue<TRet, TConvRatio>(field);
490}
491
492template <typename TConvRatio, typename TField, typename TVal>
493void setVoltage(TField& field, TVal&& val)
494{
495 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Voltage>(),
496 "The field is expected to contain \"voltage\" units.");
497 UnitsValueConverter<>::setValue<TConvRatio>(field, std::forward<TVal>(val));
498}
499
500template <typename TRet, typename TConvRatio, typename TField>
501TRet getMemory(const TField& field)
502{
503 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Memory>(),
504 "The field is expected to contain \"memory\" units.");
505 return UnitsValueConverter<>::getValue<TRet, TConvRatio>(field);
506}
507
508template <typename TConvRatio, typename TField, typename TVal>
509void setMemory(TField& field, TVal&& val)
510{
511 static_assert(details::hasExpectedUnits<typename std::decay<decltype(field)>::type, comms::traits::units::Memory>(),
512 "The field is expected to contain \"memory\" units.");
513 UnitsValueConverter<>::setValue<TConvRatio>(field, std::forward<TVal>(val));
514}
515
516} // namespace details
517
528template <typename TRet, typename TField>
529TRet getNanoseconds(const TField& field)
530{
531 return details::getTime<TRet, comms::traits::units::NanosecondsRatio>(field);
532}
533
544template <typename TField, typename TVal>
545void setNanoseconds(TField& field, TVal&& val)
546{
547 details::setTime<comms::traits::units::NanosecondsRatio>(field, std::forward<TVal>(val));
548}
549
552template <typename TField>
553constexpr bool isNanoseconds()
554{
555 return
556 TField::hasUnits() &&
557 std::is_same<typename TField::UnitsType, comms::traits::units::Time>::value &&
558 std::is_same<typename TField::UnitsRatio, comms::traits::units::NanosecondsRatio>::value;
559}
560
565template <typename TField>
566constexpr bool isNanoseconds(const TField& field)
567{
568 return isNanoseconds<typename std::decay<decltype(field)>::type>();
569}
570
581template <typename TRet, typename TField>
582TRet getMicroseconds(const TField& field)
583{
584 return details::getTime<TRet, comms::traits::units::MicrosecondsRatio>(field);
585}
586
597template <typename TField, typename TVal>
598void setMicroseconds(TField& field, TVal&& val)
599{
600 details::setTime<comms::traits::units::MicrosecondsRatio>(field, std::forward<TVal>(val));
601}
602
605template <typename TField>
606constexpr bool isMicroseconds()
607{
608 return
609 TField::hasUnits() &&
610 std::is_same<typename TField::UnitsType, comms::traits::units::Time>::value &&
611 std::is_same<typename TField::UnitsRatio, comms::traits::units::MicrosecondsRatio>::value;
612}
613
618template <typename TField>
619constexpr bool isMicroseconds(const TField& field)
620{
621 return isMicroseconds<typename std::decay<decltype(field)>::type>();
622}
623
634template <typename TRet, typename TField>
635TRet getMilliseconds(const TField& field)
636{
637 return details::getTime<TRet, comms::traits::units::MillisecondsRatio>(field);
638}
639
650template <typename TField, typename TVal>
651void setMilliseconds(TField& field, TVal&& val)
652{
653 details::setTime<comms::traits::units::MillisecondsRatio>(field, std::forward<TVal>(val));
654}
655
658template <typename TField>
659constexpr bool isMilliseconds()
660{
661 return
662 TField::hasUnits() &&
663 std::is_same<typename TField::UnitsType, comms::traits::units::Time>::value &&
664 std::is_same<typename TField::UnitsRatio, comms::traits::units::MillisecondsRatio>::value;
665}
666
671template <typename TField>
672constexpr bool isMilliseconds(const TField& field)
673{
674 return isMilliseconds<typename std::decay<decltype(field)>::type>();
675}
676
687template <typename TRet, typename TField>
688TRet getSeconds(const TField& field)
689{
690 return details::getTime<TRet, comms::traits::units::SecondsRatio>(field);
691}
692
703template <typename TField, typename TVal>
704void setSeconds(TField& field, TVal&& val)
705{
706 details::setTime<comms::traits::units::SecondsRatio>(field, std::forward<TVal>(val));
707}
708
711template <typename TField>
712constexpr bool isSeconds()
713{
714 return
715 TField::hasUnits() &&
716 std::is_same<typename TField::UnitsType, comms::traits::units::Time>::value &&
717 std::is_same<typename TField::UnitsRatio, comms::traits::units::SecondsRatio>::value;
718}
719
724template <typename TField>
725constexpr bool isSeconds(const TField& field)
726{
727 return isSeconds<typename std::decay<decltype(field)>::type>();
728}
729
740template <typename TRet, typename TField>
741TRet getMinutes(const TField& field)
742{
743 return details::getTime<TRet, comms::traits::units::MinutesRatio>(field);
744}
745
756template <typename TField, typename TVal>
757void setMinutes(TField& field, TVal&& val)
758{
759 details::setTime<comms::traits::units::MinutesRatio>(field, std::forward<TVal>(val));
760}
761
764template <typename TField>
765constexpr bool isMinutes()
766{
767 return
768 TField::hasUnits() &&
769 std::is_same<typename TField::UnitsType, comms::traits::units::Time>::value &&
770 std::is_same<typename TField::UnitsRatio, comms::traits::units::MinutesRatio>::value;
771}
772
777template <typename TField>
778constexpr bool isMinutes(const TField& field)
779{
780 return isMinutes<typename std::decay<decltype(field)>::type>();
781}
782
793template <typename TRet, typename TField>
794TRet getHours(const TField& field)
795{
796 return details::getTime<TRet, comms::traits::units::HoursRatio>(field);
797}
798
809template <typename TField, typename TVal>
810void setHours(TField& field, TVal&& val)
811{
812 details::setTime<comms::traits::units::HoursRatio>(field, std::forward<TVal>(val));
813}
814
817template <typename TField>
818constexpr bool isHours()
819{
820 return
821 TField::hasUnits() &&
822 std::is_same<typename TField::UnitsType, comms::traits::units::Time>::value &&
823 std::is_same<typename TField::UnitsRatio, comms::traits::units::HoursRatio>::value;
824}
825
830template <typename TField>
831constexpr bool isHours(const TField& field)
832{
833 return isHours<typename std::decay<decltype(field)>::type>();
834}
835
846template <typename TRet, typename TField>
847TRet getDays(const TField& field)
848{
849 return details::getTime<TRet, comms::traits::units::DaysRatio>(field);
850}
851
862template <typename TField, typename TVal>
863void setDays(TField& field, TVal&& val)
864{
865 details::setTime<comms::traits::units::DaysRatio>(field, std::forward<TVal>(val));
866}
867
870template <typename TField>
871constexpr bool isDays()
872{
873 return
874 TField::hasUnits() &&
875 std::is_same<typename TField::UnitsType, comms::traits::units::Time>::value &&
876 std::is_same<typename TField::UnitsRatio, comms::traits::units::DaysRatio>::value;
877}
878
883template <typename TField>
884constexpr bool isDays(const TField& field)
885{
886 return isDays<typename std::decay<decltype(field)>::type>();
887}
888
899template <typename TRet, typename TField>
900TRet getWeeks(const TField& field)
901{
902 return details::getTime<TRet, comms::traits::units::WeeksRatio>(field);
903}
904
915template <typename TField, typename TVal>
916void setWeeks(TField& field, TVal&& val)
917{
918 details::setTime<comms::traits::units::WeeksRatio>(field, std::forward<TVal>(val));
919}
920
923template <typename TField>
924constexpr bool isWeeks()
925{
926 return
927 TField::hasUnits() &&
928 std::is_same<typename TField::UnitsType, comms::traits::units::Time>::value &&
929 std::is_same<typename TField::UnitsRatio, comms::traits::units::WeeksRatio>::value;
930}
931
936template <typename TField>
937constexpr bool isWeeks(const TField& field)
938{
939 return isWeeks<typename std::decay<decltype(field)>::type>();
940}
941
952template <typename TRet, typename TField>
953TRet getNanometers(const TField& field)
954{
955 return details::getDistance<TRet, comms::traits::units::NanometersRatio>(field);
956}
957
968template <typename TField, typename TVal>
969void setNanometers(TField& field, TVal&& val)
970{
971 details::setDistance<comms::traits::units::NanometersRatio>(field, std::forward<TVal>(val));
972}
973
976template <typename TField>
977constexpr bool isNanometers()
978{
979 return
980 TField::hasUnits() &&
981 std::is_same<typename TField::UnitsType, comms::traits::units::Distance>::value &&
982 std::is_same<typename TField::UnitsRatio, comms::traits::units::NanometersRatio>::value;
983}
984
989template <typename TField>
990constexpr bool isNanometers(const TField& field)
991{
992 return isNanometers<typename std::decay<decltype(field)>::type>();
993}
994
1005template <typename TRet, typename TField>
1006TRet getMicrometers(const TField& field)
1007{
1008 return details::getDistance<TRet, comms::traits::units::MicrometersRatio>(field);
1009}
1010
1021template <typename TField, typename TVal>
1022void setMicrometers(TField& field, TVal&& val)
1023{
1024 details::setDistance<comms::traits::units::MicrometersRatio>(field, std::forward<TVal>(val));
1025}
1026
1029template <typename TField>
1030constexpr bool isMicrometers()
1031{
1032 return
1033 TField::hasUnits() &&
1034 std::is_same<typename TField::UnitsType, comms::traits::units::Distance>::value &&
1035 std::is_same<typename TField::UnitsRatio, comms::traits::units::MicrometersRatio>::value;
1036}
1037
1042template <typename TField>
1043constexpr bool isMicrometers(const TField& field)
1044{
1045 return isMicrometers<typename std::decay<decltype(field)>::type>();
1046}
1047
1058template <typename TRet, typename TField>
1059TRet getMillimeters(const TField& field)
1060{
1061 return details::getDistance<TRet, comms::traits::units::MillimetersRatio>(field);
1062}
1063
1074template <typename TField, typename TVal>
1075void setMillimeters(TField& field, TVal&& val)
1076{
1077 details::setDistance<comms::traits::units::MillimetersRatio>(field, std::forward<TVal>(val));
1078}
1079
1082template <typename TField>
1083constexpr bool isMillimeters()
1084{
1085 return
1086 TField::hasUnits() &&
1087 std::is_same<typename TField::UnitsType, comms::traits::units::Distance>::value &&
1088 std::is_same<typename TField::UnitsRatio, comms::traits::units::MillimetersRatio>::value;
1089}
1090
1095template <typename TField>
1096constexpr bool isMillimeters(const TField& field)
1097{
1098 return isMillimeters<typename std::decay<decltype(field)>::type>();
1099}
1100
1111template <typename TRet, typename TField>
1112TRet getCentimeters(const TField& field)
1113{
1114 return details::getDistance<TRet, comms::traits::units::CentimetersRatio>(field);
1115}
1116
1127template <typename TField, typename TVal>
1128void setCentimeters(TField& field, TVal&& val)
1129{
1130 details::setDistance<comms::traits::units::CentimetersRatio>(field, std::forward<TVal>(val));
1131}
1132
1135template <typename TField>
1136constexpr bool isCentimeters()
1137{
1138 return
1139 TField::hasUnits() &&
1140 std::is_same<typename TField::UnitsType, comms::traits::units::Distance>::value &&
1141 std::is_same<typename TField::UnitsRatio, comms::traits::units::CentimetersRatio>::value;
1142}
1143
1148template <typename TField>
1149constexpr bool isCentimeters(const TField& field)
1150{
1151 return isCentimeters<typename std::decay<decltype(field)>::type>();
1152}
1153
1164template <typename TRet, typename TField>
1165TRet getMeters(const TField& field)
1166{
1167 return details::getDistance<TRet, comms::traits::units::MetersRatio>(field);
1168}
1169
1180template <typename TField, typename TVal>
1181void setMeters(TField& field, TVal&& val)
1182{
1183 details::setDistance<comms::traits::units::MetersRatio>(field, std::forward<TVal>(val));
1184}
1185
1188template <typename TField>
1189constexpr bool isMeters()
1190{
1191 return
1192 TField::hasUnits() &&
1193 std::is_same<typename TField::UnitsType, comms::traits::units::Distance>::value &&
1194 std::is_same<typename TField::UnitsRatio, comms::traits::units::MetersRatio>::value;
1195}
1196
1201template <typename TField>
1202constexpr bool isMeters(const TField& field)
1203{
1204 return isMeters<typename std::decay<decltype(field)>::type>();
1205}
1206
1217template <typename TRet, typename TField>
1218TRet getKilometers(const TField& field)
1219{
1220 return details::getDistance<TRet, comms::traits::units::KilometersRatio>(field);
1221}
1222
1233template <typename TField, typename TVal>
1234void setKilometers(TField& field, TVal&& val)
1235{
1236 details::setDistance<comms::traits::units::KilometersRatio>(field, std::forward<TVal>(val));
1237}
1238
1241template <typename TField>
1242constexpr bool isKilometers()
1243{
1244 return
1245 TField::hasUnits() &&
1246 std::is_same<typename TField::UnitsType, comms::traits::units::Distance>::value &&
1247 std::is_same<typename TField::UnitsRatio, comms::traits::units::KilometersRatio>::value;
1248}
1249
1254template <typename TField>
1255constexpr bool isKilometers(const TField& field)
1256{
1257 return isKilometers<typename std::decay<decltype(field)>::type>();
1258}
1259
1270template <typename TRet, typename TField>
1271TRet getNanometersPerSecond(const TField& field)
1272{
1273 return details::getSpeed<TRet, comms::traits::units::NanometersPerSecondRatio>(field);
1274}
1275
1286template <typename TField, typename TVal>
1287void setNanometersPerSecond(TField& field, TVal&& val)
1288{
1289 details::setSpeed<comms::traits::units::NanometersPerSecondRatio>(field, std::forward<TVal>(val));
1290}
1291
1294template <typename TField>
1296{
1297 return
1298 TField::hasUnits() &&
1299 std::is_same<typename TField::UnitsType, comms::traits::units::Speed>::value &&
1300 std::is_same<typename TField::UnitsRatio, comms::traits::units::NanometersPerSecondRatio>::value;
1301}
1302
1307template <typename TField>
1308constexpr bool isNanometersPerSecond(const TField& field)
1309{
1310 return isNanometersPerSecond<typename std::decay<decltype(field)>::type>();
1311}
1312
1323template <typename TRet, typename TField>
1324TRet getMicrometersPerSecond(const TField& field)
1325{
1326 return details::getSpeed<TRet, comms::traits::units::MicrometersPerSecondRatio>(field);
1327}
1328
1339template <typename TField, typename TVal>
1340void setMicrometersPerSecond(TField& field, TVal&& val)
1341{
1342 details::setSpeed<comms::traits::units::MicrometersPerSecondRatio>(field, std::forward<TVal>(val));
1343}
1344
1347template <typename TField>
1349{
1350 return
1351 TField::hasUnits() &&
1352 std::is_same<typename TField::UnitsType, comms::traits::units::Speed>::value &&
1353 std::is_same<typename TField::UnitsRatio, comms::traits::units::MicrometersPerSecondRatio>::value;
1354}
1355
1360template <typename TField>
1361constexpr bool isMicrometersPerSecond(const TField& field)
1362{
1363 return isMicrometersPerSecond<typename std::decay<decltype(field)>::type>();
1364}
1365
1376template <typename TRet, typename TField>
1377TRet getMillimetersPerSecond(const TField& field)
1378{
1379 return details::getSpeed<TRet, comms::traits::units::MillimetersPerSecondRatio>(field);
1380}
1381
1392template <typename TField, typename TVal>
1393void setMillimetersPerSecond(TField& field, TVal&& val)
1394{
1395 details::setSpeed<comms::traits::units::MillimetersPerSecondRatio>(field, std::forward<TVal>(val));
1396}
1397
1400template <typename TField>
1402{
1403 return
1404 TField::hasUnits() &&
1405 std::is_same<typename TField::UnitsType, comms::traits::units::Speed>::value &&
1406 std::is_same<typename TField::UnitsRatio, comms::traits::units::MillimetersPerSecondRatio>::value;
1407}
1408
1413template <typename TField>
1414constexpr bool isMillimetersPerSecond(const TField& field)
1415{
1416 return isMillimetersPerSecond<typename std::decay<decltype(field)>::type>();
1417}
1418
1429template <typename TRet, typename TField>
1430TRet getCentimetersPerSecond(const TField& field)
1431{
1432 return details::getSpeed<TRet, comms::traits::units::CentimetersPerSecondRatio>(field);
1433}
1434
1445template <typename TField, typename TVal>
1446void setCentimetersPerSecond(TField& field, TVal&& val)
1447{
1448 details::setSpeed<comms::traits::units::CentimetersPerSecondRatio>(field, std::forward<TVal>(val));
1449}
1450
1453template <typename TField>
1455{
1456 return
1457 TField::hasUnits() &&
1458 std::is_same<typename TField::UnitsType, comms::traits::units::Speed>::value &&
1459 std::is_same<typename TField::UnitsRatio, comms::traits::units::CentimetersPerSecondRatio>::value;
1460}
1461
1466template <typename TField>
1467constexpr bool isCentimetersPerSecond(const TField& field)
1468{
1469 return isCentimetersPerSecond<typename std::decay<decltype(field)>::type>();
1470}
1471
1482template <typename TRet, typename TField>
1483TRet getMetersPerSecond(const TField& field)
1484{
1485 return details::getSpeed<TRet, comms::traits::units::MetersPerSecondRatio>(field);
1486}
1487
1498template <typename TField, typename TVal>
1499void setMetersPerSecond(TField& field, TVal&& val)
1500{
1501 details::setSpeed<comms::traits::units::MetersPerSecondRatio>(field, std::forward<TVal>(val));
1502}
1503
1506template <typename TField>
1507constexpr bool isMetersPerSecond()
1508{
1509 return
1510 TField::hasUnits() &&
1511 std::is_same<typename TField::UnitsType, comms::traits::units::Speed>::value &&
1512 std::is_same<typename TField::UnitsRatio, comms::traits::units::MetersPerSecondRatio>::value;
1513}
1514
1519template <typename TField>
1520constexpr bool isMetersPerSecond(const TField& field)
1521{
1522 return isMetersPerSecond<typename std::decay<decltype(field)>::type>();
1523}
1524
1535template <typename TRet, typename TField>
1536TRet getKilometersPerSecond(const TField& field)
1537{
1538 return details::getSpeed<TRet, comms::traits::units::KilometersPerSecondRatio>(field);
1539}
1540
1551template <typename TField, typename TVal>
1552void setKilometersPerSecond(TField& field, TVal&& val)
1553{
1554 details::setSpeed<comms::traits::units::KilometersPerSecondRatio>(field, std::forward<TVal>(val));
1555}
1556
1559template <typename TField>
1561{
1562 return
1563 TField::hasUnits() &&
1564 std::is_same<typename TField::UnitsType, comms::traits::units::Speed>::value &&
1565 std::is_same<typename TField::UnitsRatio, comms::traits::units::KilometersPerSecondRatio>::value;
1566}
1567
1572template <typename TField>
1573constexpr bool isKilometersPerSecond(const TField& field)
1574{
1575 return isKilometersPerSecond<typename std::decay<decltype(field)>::type>();
1576}
1577
1588template <typename TRet, typename TField>
1589TRet getKilometersPerHour(const TField& field)
1590{
1591 return details::getSpeed<TRet, comms::traits::units::KilometersPerHourRatio>(field);
1592}
1593
1604template <typename TField, typename TVal>
1605void setKilometersPerHour(TField& field, TVal&& val)
1606{
1607 details::setSpeed<comms::traits::units::KilometersPerHourRatio>(field, std::forward<TVal>(val));
1608}
1609
1612template <typename TField>
1613constexpr bool isKilometersPerHour()
1614{
1615 return
1616 TField::hasUnits() &&
1617 std::is_same<typename TField::UnitsType, comms::traits::units::Speed>::value &&
1618 std::is_same<typename TField::UnitsRatio, comms::traits::units::KilometersPerHourRatio>::value;
1619}
1620
1625template <typename TField>
1626constexpr bool isKilometersPerHour(const TField& field)
1627{
1628 return isKilometersPerHour<typename std::decay<decltype(field)>::type>();
1629}
1630
1641template <typename TRet, typename TField>
1642TRet getHertz(const TField& field)
1643{
1644 return details::getFrequency<TRet, comms::traits::units::HzRatio>(field);
1645}
1646
1657template <typename TField, typename TVal>
1658void setHertz(TField& field, TVal&& val)
1659{
1660 details::setFrequency<comms::traits::units::HzRatio>(field, std::forward<TVal>(val));
1661}
1662
1665template <typename TField>
1666constexpr bool isHertz()
1667{
1668 return
1669 TField::hasUnits() &&
1670 std::is_same<typename TField::UnitsType, comms::traits::units::Frequency>::value &&
1671 std::is_same<typename TField::UnitsRatio, comms::traits::units::HzRatio>::value;
1672}
1673
1678template <typename TField>
1679constexpr bool isHertz(const TField& field)
1680{
1681 return isHertz<typename std::decay<decltype(field)>::type>();
1682}
1683
1694template <typename TRet, typename TField>
1695TRet getKilohertz(const TField& field)
1696{
1697 return details::getFrequency<TRet, comms::traits::units::KiloHzRatio>(field);
1698}
1699
1710template <typename TField, typename TVal>
1711void setKilohertz(TField& field, TVal&& val)
1712{
1713 details::setFrequency<comms::traits::units::KiloHzRatio>(field, std::forward<TVal>(val));
1714}
1715
1718template <typename TField>
1719constexpr bool isKilohertz()
1720{
1721 return
1722 TField::hasUnits() &&
1723 std::is_same<typename TField::UnitsType, comms::traits::units::Frequency>::value &&
1724 std::is_same<typename TField::UnitsRatio, comms::traits::units::KiloHzRatio>::value;
1725}
1726
1731template <typename TField>
1732constexpr bool isKilohertz(const TField& field)
1733{
1734 return isKilohertz<typename std::decay<decltype(field)>::type>();
1735}
1736
1747template <typename TRet, typename TField>
1748TRet getMegahertz(const TField& field)
1749{
1750 return details::getFrequency<TRet, comms::traits::units::MegaHzRatio>(field);
1751}
1752
1763template <typename TField, typename TVal>
1764void setMegahertz(TField& field, TVal&& val)
1765{
1766 details::setFrequency<comms::traits::units::MegaHzRatio>(field, std::forward<TVal>(val));
1767}
1768
1771template <typename TField>
1772constexpr bool isMegahertz()
1773{
1774 return
1775 TField::hasUnits() &&
1776 std::is_same<typename TField::UnitsType, comms::traits::units::Frequency>::value &&
1777 std::is_same<typename TField::UnitsRatio, comms::traits::units::MegaHzRatio>::value;
1778}
1779
1784template <typename TField>
1785constexpr bool isMegahertz(const TField& field)
1786{
1787 return isMegahertz<typename std::decay<decltype(field)>::type>();
1788}
1789
1800template <typename TRet, typename TField>
1801TRet getGigahertz(const TField& field)
1802{
1803 return details::getFrequency<TRet, comms::traits::units::GigaHzRatio>(field);
1804}
1805
1816template <typename TField, typename TVal>
1817void setGigahertz(TField& field, TVal&& val)
1818{
1819 details::setFrequency<comms::traits::units::GigaHzRatio>(field, std::forward<TVal>(val));
1820}
1821
1824template <typename TField>
1825constexpr bool isGigahertz()
1826{
1827 return
1828 TField::hasUnits() &&
1829 std::is_same<typename TField::UnitsType, comms::traits::units::Frequency>::value &&
1830 std::is_same<typename TField::UnitsRatio, comms::traits::units::GigaHzRatio>::value;
1831}
1832
1837template <typename TField>
1838constexpr bool isGigahertz(const TField& field)
1839{
1840 return isGigahertz<typename std::decay<decltype(field)>::type>();
1841}
1842
1853template <typename TRet, typename TField>
1854TRet getDegrees(const TField& field)
1855{
1856 return details::getAngle<TRet, comms::traits::units::DegreesRatio>(field);
1857}
1858
1869template <typename TField, typename TVal>
1870void setDegrees(TField& field, TVal&& val)
1871{
1872 details::setAngle<comms::traits::units::DegreesRatio>(field, std::forward<TVal>(val));
1873}
1874
1877template <typename TField>
1878constexpr bool isDegrees()
1879{
1880 return
1881 TField::hasUnits() &&
1882 std::is_same<typename TField::UnitsType, comms::traits::units::Angle>::value &&
1883 std::is_same<typename TField::UnitsRatio, comms::traits::units::DegreesRatio>::value;
1884}
1885
1890template <typename TField>
1891constexpr bool isDegrees(const TField& field)
1892{
1893 return isDegrees<typename std::decay<decltype(field)>::type>();
1894}
1895
1906template <typename TRet, typename TField>
1907TRet getRadians(const TField& field)
1908{
1909 return details::getAngle<TRet, comms::traits::units::RadiansRatio>(field);
1910}
1911
1922template <typename TField, typename TVal>
1923void setRadians(TField& field, TVal&& val)
1924{
1925 details::setAngle<comms::traits::units::RadiansRatio>(field, std::forward<TVal>(val));
1926}
1927
1930template <typename TField>
1931constexpr bool isRadians()
1932{
1933 return
1934 TField::hasUnits() &&
1935 std::is_same<typename TField::UnitsType, comms::traits::units::Angle>::value &&
1936 std::is_same<typename TField::UnitsRatio, comms::traits::units::RadiansRatio>::value;
1937}
1938
1943template <typename TField>
1944constexpr bool isRadians(const TField& field)
1945{
1946 return isRadians<typename std::decay<decltype(field)>::type>();
1947}
1948
1959template <typename TRet, typename TField>
1960TRet getNanoamps(const TField& field)
1961{
1962 return details::getCurrent<TRet, comms::traits::units::NanoampsRatio>(field);
1963}
1964
1975template <typename TField, typename TVal>
1976void setNanoamps(TField& field, TVal&& val)
1977{
1978 details::setCurrent<comms::traits::units::NanoampsRatio>(field, std::forward<TVal>(val));
1979}
1980
1983template <typename TField>
1984constexpr bool isNanoamps()
1985{
1986 return
1987 TField::hasUnits() &&
1988 std::is_same<typename TField::UnitsType, comms::traits::units::Current>::value &&
1989 std::is_same<typename TField::UnitsRatio, comms::traits::units::NanoampsRatio>::value;
1990}
1991
1996template <typename TField>
1997constexpr bool isNanoamps(const TField& field)
1998{
1999 return isNanoamps<typename std::decay<decltype(field)>::type>();
2000}
2001
2012template <typename TRet, typename TField>
2013TRet getMicroamps(const TField& field)
2014{
2015 return details::getCurrent<TRet, comms::traits::units::MicroampsRatio>(field);
2016}
2017
2028template <typename TField, typename TVal>
2029void setMicroamps(TField& field, TVal&& val)
2030{
2031 details::setCurrent<comms::traits::units::MicroampsRatio>(field, std::forward<TVal>(val));
2032}
2033
2036template <typename TField>
2037constexpr bool isMicroamps()
2038{
2039 return
2040 TField::hasUnits() &&
2041 std::is_same<typename TField::UnitsType, comms::traits::units::Current>::value &&
2042 std::is_same<typename TField::UnitsRatio, comms::traits::units::MicroampsRatio>::value;
2043}
2044
2049template <typename TField>
2050constexpr bool isMicroamps(const TField& field)
2051{
2052 return isMicroamps<typename std::decay<decltype(field)>::type>();
2053}
2054
2065template <typename TRet, typename TField>
2066TRet getMilliamps(const TField& field)
2067{
2068 return details::getCurrent<TRet, comms::traits::units::MilliampsRatio>(field);
2069}
2070
2081template <typename TField, typename TVal>
2082void setMilliamps(TField& field, TVal&& val)
2083{
2084 details::setCurrent<comms::traits::units::MilliampsRatio>(field, std::forward<TVal>(val));
2085}
2086
2089template <typename TField>
2090constexpr bool isMilliamps()
2091{
2092 return
2093 TField::hasUnits() &&
2094 std::is_same<typename TField::UnitsType, comms::traits::units::Current>::value &&
2095 std::is_same<typename TField::UnitsRatio, comms::traits::units::MilliampsRatio>::value;
2096}
2097
2102template <typename TField>
2103constexpr bool isMilliamps(const TField& field)
2104{
2105 return isMilliamps<typename std::decay<decltype(field)>::type>();
2106}
2107
2118template <typename TRet, typename TField>
2119TRet getAmps(const TField& field)
2120{
2121 return details::getCurrent<TRet, comms::traits::units::AmpsRatio>(field);
2122}
2123
2134template <typename TField, typename TVal>
2135void setAmps(TField& field, TVal&& val)
2136{
2137 details::setCurrent<comms::traits::units::AmpsRatio>(field, std::forward<TVal>(val));
2138}
2139
2142template <typename TField>
2143constexpr bool isAmps()
2144{
2145 return
2146 TField::hasUnits() &&
2147 std::is_same<typename TField::UnitsType, comms::traits::units::Current>::value &&
2148 std::is_same<typename TField::UnitsRatio, comms::traits::units::AmpsRatio>::value;
2149}
2150
2155template <typename TField>
2156constexpr bool isAmps(const TField& field)
2157{
2158 return isAmps<typename std::decay<decltype(field)>::type>();
2159}
2160
2171template <typename TRet, typename TField>
2172TRet getKiloamps(const TField& field)
2173{
2174 return details::getCurrent<TRet, comms::traits::units::KiloampsRatio>(field);
2175}
2176
2187template <typename TField, typename TVal>
2188void setKiloamps(TField& field, TVal&& val)
2189{
2190 details::setCurrent<comms::traits::units::KiloampsRatio>(field, std::forward<TVal>(val));
2191}
2192
2195template <typename TField>
2196constexpr bool isKiloamps()
2197{
2198 return
2199 TField::hasUnits() &&
2200 std::is_same<typename TField::UnitsType, comms::traits::units::Current>::value &&
2201 std::is_same<typename TField::UnitsRatio, comms::traits::units::KiloampsRatio>::value;
2202}
2203
2208template <typename TField>
2209constexpr bool isKiloamps(const TField& field)
2210{
2211 return isKiloamps<typename std::decay<decltype(field)>::type>();
2212}
2213
2224template <typename TRet, typename TField>
2225TRet getNanovolts(const TField& field)
2226{
2227 return details::getVoltage<TRet, comms::traits::units::NanovoltsRatio>(field);
2228}
2229
2240template <typename TField, typename TVal>
2241void setNanovolts(TField& field, TVal&& val)
2242{
2243 details::setVoltage<comms::traits::units::NanovoltsRatio>(field, std::forward<TVal>(val));
2244}
2245
2248template <typename TField>
2249constexpr bool isNanovolts()
2250{
2251 return
2252 TField::hasUnits() &&
2253 std::is_same<typename TField::UnitsType, comms::traits::units::Voltage>::value &&
2254 std::is_same<typename TField::UnitsRatio, comms::traits::units::NanovoltsRatio>::value;
2255}
2256
2261template <typename TField>
2262constexpr bool isNanovolts(const TField& field)
2263{
2264 return isNanovolts<typename std::decay<decltype(field)>::type>();
2265}
2266
2277template <typename TRet, typename TField>
2278TRet getMicrovolts(const TField& field)
2279{
2280 return details::getVoltage<TRet, comms::traits::units::MicrovoltsRatio>(field);
2281}
2282
2293template <typename TField, typename TVal>
2294void setMicrovolts(TField& field, TVal&& val)
2295{
2296 details::setVoltage<comms::traits::units::MicrovoltsRatio>(field, std::forward<TVal>(val));
2297}
2298
2301template <typename TField>
2302constexpr bool isMicrovolts()
2303{
2304 return
2305 TField::hasUnits() &&
2306 std::is_same<typename TField::UnitsType, comms::traits::units::Voltage>::value &&
2307 std::is_same<typename TField::UnitsRatio, comms::traits::units::MicrovoltsRatio>::value;
2308}
2309
2314template <typename TField>
2315constexpr bool isMicrovolts(const TField& field)
2316{
2317 return isMicrovolts<typename std::decay<decltype(field)>::type>();
2318}
2319
2330template <typename TRet, typename TField>
2331TRet getMillivolts(const TField& field)
2332{
2333 return details::getVoltage<TRet, comms::traits::units::MillivoltsRatio>(field);
2334}
2335
2346template <typename TField, typename TVal>
2347void setMillivolts(TField& field, TVal&& val)
2348{
2349 details::setVoltage<comms::traits::units::MillivoltsRatio>(field, std::forward<TVal>(val));
2350}
2351
2354template <typename TField>
2355constexpr bool isMillivolts()
2356{
2357 return
2358 TField::hasUnits() &&
2359 std::is_same<typename TField::UnitsType, comms::traits::units::Voltage>::value &&
2360 std::is_same<typename TField::UnitsRatio, comms::traits::units::MillivoltsRatio>::value;
2361}
2362
2367template <typename TField>
2368constexpr bool isMillivolts(const TField& field)
2369{
2370 return isMillivolts<typename std::decay<decltype(field)>::type>();
2371}
2372
2383template <typename TRet, typename TField>
2384TRet getVolts(const TField& field)
2385{
2386 return details::getVoltage<TRet, comms::traits::units::VoltsRatio>(field);
2387}
2388
2399template <typename TField, typename TVal>
2400void setVolts(TField& field, TVal&& val)
2401{
2402 details::setVoltage<comms::traits::units::VoltsRatio>(field, std::forward<TVal>(val));
2403}
2404
2407template <typename TField>
2408constexpr bool isVolts()
2409{
2410 return
2411 TField::hasUnits() &&
2412 std::is_same<typename TField::UnitsType, comms::traits::units::Voltage>::value &&
2413 std::is_same<typename TField::UnitsRatio, comms::traits::units::VoltsRatio>::value;
2414}
2415
2420template <typename TField>
2421constexpr bool isVolts(const TField& field)
2422{
2423 return isVolts<typename std::decay<decltype(field)>::type>();
2424}
2425
2436template <typename TRet, typename TField>
2437TRet getKilovolts(const TField& field)
2438{
2439 return details::getVoltage<TRet, comms::traits::units::KilovoltsRatio>(field);
2440}
2441
2452template <typename TField, typename TVal>
2453void setKilovolts(TField& field, TVal&& val)
2454{
2455 details::setVoltage<comms::traits::units::KilovoltsRatio>(field, std::forward<TVal>(val));
2456}
2457
2460template <typename TField>
2461constexpr bool isKilovolts()
2462{
2463 return
2464 TField::hasUnits() &&
2465 std::is_same<typename TField::UnitsType, comms::traits::units::Voltage>::value &&
2466 std::is_same<typename TField::UnitsRatio, comms::traits::units::KilovoltsRatio>::value;
2467}
2468
2473template <typename TField>
2474constexpr bool isKilovolts(const TField& field)
2475{
2476 return isKilovolts<typename std::decay<decltype(field)>::type>();
2477}
2478
2489template <typename TRet, typename TField>
2490TRet getBytes(const TField& field)
2491{
2492 return details::getMemory<TRet, comms::traits::units::BytesRatio>(field);
2493}
2494
2505template <typename TField, typename TVal>
2506void setBytes(TField& field, TVal&& val)
2507{
2508 details::setMemory<comms::traits::units::BytesRatio>(field, std::forward<TVal>(val));
2509}
2510
2513template <typename TField>
2514constexpr bool isBytes()
2515{
2516 return
2517 TField::hasUnits() &&
2518 std::is_same<typename TField::UnitsType, comms::traits::units::Memory>::value &&
2519 std::is_same<typename TField::UnitsRatio, comms::traits::units::BytesRatio>::value;
2520}
2521
2526template <typename TField>
2527constexpr bool isBytes(const TField& field)
2528{
2529 return isBytes<typename std::decay<decltype(field)>::type>();
2530}
2531
2542template <typename TRet, typename TField>
2543TRet getKilobytes(const TField& field)
2544{
2545 return details::getMemory<TRet, comms::traits::units::KilobytesRatio>(field);
2546}
2547
2558template <typename TField, typename TVal>
2559void setKilobytes(TField& field, TVal&& val)
2560{
2561 details::setMemory<comms::traits::units::KilobytesRatio>(field, std::forward<TVal>(val));
2562}
2563
2566template <typename TField>
2567constexpr bool isKilobytes()
2568{
2569 return
2570 TField::hasUnits() &&
2571 std::is_same<typename TField::UnitsType, comms::traits::units::Memory>::value &&
2572 std::is_same<typename TField::UnitsRatio, comms::traits::units::KilobytesRatio>::value;
2573}
2574
2579template <typename TField>
2580constexpr bool isKilobytes(const TField& field)
2581{
2582 return isKilobytes<typename std::decay<decltype(field)>::type>();
2583}
2584
2595template <typename TRet, typename TField>
2596TRet getMegabytes(const TField& field)
2597{
2598 return details::getMemory<TRet, comms::traits::units::MegabytesRatio>(field);
2599}
2600
2611template <typename TField, typename TVal>
2612void setMegabytes(TField& field, TVal&& val)
2613{
2614 details::setMemory<comms::traits::units::MegabytesRatio>(field, std::forward<TVal>(val));
2615}
2616
2619template <typename TField>
2620constexpr bool isMegabytes()
2621{
2622 return
2623 TField::hasUnits() &&
2624 std::is_same<typename TField::UnitsType, comms::traits::units::Memory>::value &&
2625 std::is_same<typename TField::UnitsRatio, comms::traits::units::MegabytesRatio>::value;
2626}
2627
2632template <typename TField>
2633constexpr bool isMegabytes(const TField& field)
2634{
2635 return isMegabytes<typename std::decay<decltype(field)>::type>();
2636}
2637
2648template <typename TRet, typename TField>
2649TRet getGigabytes(const TField& field)
2650{
2651 return details::getMemory<TRet, comms::traits::units::GigabytesRatio>(field);
2652}
2653
2664template <typename TField, typename TVal>
2665void setGigabytes(TField& field, TVal&& val)
2666{
2667 details::setMemory<comms::traits::units::GigabytesRatio>(field, std::forward<TVal>(val));
2668}
2669
2672template <typename TField>
2673constexpr bool isGigabytes()
2674{
2675 return
2676 TField::hasUnits() &&
2677 std::is_same<typename TField::UnitsType, comms::traits::units::Memory>::value &&
2678 std::is_same<typename TField::UnitsRatio, comms::traits::units::GigabytesRatio>::value;
2679}
2680
2685template <typename TField>
2686constexpr bool isGigabytes(const TField& field)
2687{
2688 return isGigabytes<typename std::decay<decltype(field)>::type>();
2689}
2690
2701template <typename TRet, typename TField>
2702TRet getTerabytes(const TField& field)
2703{
2704 return details::getMemory<TRet, comms::traits::units::TerabytesRatio>(field);
2705}
2706
2717template <typename TField, typename TVal>
2718void setTerabytes(TField& field, TVal&& val)
2719{
2720 details::setMemory<comms::traits::units::TerabytesRatio>(field, std::forward<TVal>(val));
2721}
2722
2725template <typename TField>
2726constexpr bool isTerabytes()
2727{
2728 return
2729 TField::hasUnits() &&
2730 std::is_same<typename TField::UnitsType, comms::traits::units::Memory>::value &&
2731 std::is_same<typename TField::UnitsRatio, comms::traits::units::TerabytesRatio>::value;
2732}
2733
2738template <typename TField>
2739constexpr bool isTerabytes(const TField& field)
2740{
2741 return isTerabytes<typename std::decay<decltype(field)>::type>();
2742}
2743
2744} // namespace units
2745
2746} // namespace comms
2747
2748COMMS_MSVC_WARNING_POP
Contains various compiler related definitions.
comms::option::def::FieldType< TMsg > FieldType
Same as comms::option::def::FieldType.
Definition options.h:1505
constexpr bool isMinutes()
Compile time check whether the field type holds minutes.
Definition units.h:765
TRet getNanovolts(const TField &field)
Retrieve field's value as nanovolts.
Definition units.h:2225
constexpr bool isMillimetersPerSecond()
Compile time check whether the field type holds millimeters per second.
Definition units.h:1401
TRet getMicrovolts(const TField &field)
Retrieve field's value as microvolts.
Definition units.h:2278
void setMicroamps(TField &field, TVal &&val)
Update field's value accordingly, while providing microamps value.
Definition units.h:2029
TRet getMilliseconds(const TField &field)
Retrieve field's value as milliseconds.
Definition units.h:635
constexpr bool isMegahertz()
Compile time check whether the field type holds megahertz.
Definition units.h:1772
void setBytes(TField &field, TVal &&val)
Update field's value accordingly, while providing bytes value.
Definition units.h:2506
void setMillimetersPerSecond(TField &field, TVal &&val)
Update field's value accordingly, while providing millimeters per second value.
Definition units.h:1393
TRet getGigabytes(const TField &field)
Retrieve field's value as gigabytes.
Definition units.h:2649
TRet getVolts(const TField &field)
Retrieve field's value as volts.
Definition units.h:2384
void setHours(TField &field, TVal &&val)
Update field's value accordingly, while providing hours value.
Definition units.h:810
void setMillivolts(TField &field, TVal &&val)
Update field's value accordingly, while providing millivolts value.
Definition units.h:2347
constexpr bool isMegabytes()
Compile time check whether the field type holds megabytes.
Definition units.h:2620
void setNanometersPerSecond(TField &field, TVal &&val)
Update field's value accordingly, while providing nanometers per second value.
Definition units.h:1287
TRet getCentimeters(const TField &field)
Retrieve field's value as centimeters.
Definition units.h:1112
constexpr bool isMeters()
Compile time check whether the field type holds meters.
Definition units.h:1189
constexpr bool isMillimeters()
Compile time check whether the field type holds millimeters.
Definition units.h:1083
TRet getMillivolts(const TField &field)
Retrieve field's value as millivolts.
Definition units.h:2331
TRet getHertz(const TField &field)
Retrieve field's value as hertz.
Definition units.h:1642
void setKilobytes(TField &field, TVal &&val)
Update field's value accordingly, while providing kilobytes value.
Definition units.h:2559
TRet getNanoamps(const TField &field)
Retrieve field's value as nanoamps.
Definition units.h:1960
constexpr bool isKilovolts()
Compile time check whether the field type holds kilovolts.
Definition units.h:2461
constexpr bool isCentimetersPerSecond()
Compile time check whether the field type holds centimeters per second.
Definition units.h:1454
constexpr bool isBytes()
Compile time check whether the field type holds bytes.
Definition units.h:2514
TRet getDays(const TField &field)
Retrieve field's value as days.
Definition units.h:847
constexpr bool isNanometers()
Compile time check whether the field type holds nanometers.
Definition units.h:977
void setWeeks(TField &field, TVal &&val)
Update field's value accordingly, while providing weeks value.
Definition units.h:916
TRet getMinutes(const TField &field)
Retrieve field's value as minutes.
Definition units.h:741
void setGigahertz(TField &field, TVal &&val)
Update field's value accordingly, while providing gigahertz value.
Definition units.h:1817
void setGigabytes(TField &field, TVal &&val)
Update field's value accordingly, while providing gigabytes value.
Definition units.h:2665
void setMicrometersPerSecond(TField &field, TVal &&val)
Update field's value accordingly, while providing micrometers per second value.
Definition units.h:1340
TRet getNanometersPerSecond(const TField &field)
Retrieve field's value as nanometers per second.
Definition units.h:1271
TRet getNanometers(const TField &field)
Retrieve field's value as nanometers.
Definition units.h:953
void setTerabytes(TField &field, TVal &&val)
Update field's value accordingly, while providing terabytes value.
Definition units.h:2718
TRet getMilliamps(const TField &field)
Retrieve field's value as milliamps.
Definition units.h:2066
TRet getMicroseconds(const TField &field)
Retrieve field's value as microseconds.
Definition units.h:582
TRet getMicrometers(const TField &field)
Retrieve field's value as micrometers.
Definition units.h:1006
constexpr bool isMicrometersPerSecond()
Compile time check whether the field type holds micrometers per second.
Definition units.h:1348
constexpr bool isKilometers()
Compile time check whether the field type holds kilometers.
Definition units.h:1242
constexpr bool isKilometersPerHour()
Compile time check whether the field type holds kilometers per hour.
Definition units.h:1613
TRet getMicroamps(const TField &field)
Retrieve field's value as microamps.
Definition units.h:2013
TRet getKiloamps(const TField &field)
Retrieve field's value as kiloamps.
Definition units.h:2172
constexpr bool isTerabytes()
Compile time check whether the field type holds terabytes.
Definition units.h:2726
void setMilliamps(TField &field, TVal &&val)
Update field's value accordingly, while providing milliamps value.
Definition units.h:2082
void setAmps(TField &field, TVal &&val)
Update field's value accordingly, while providing amps value.
Definition units.h:2135
TRet getKilohertz(const TField &field)
Retrieve field's value as kilohertz.
Definition units.h:1695
constexpr bool isMetersPerSecond()
Compile time check whether the field type holds meters per second.
Definition units.h:1507
constexpr bool isMicrometers()
Compile time check whether the field type holds micrometers.
Definition units.h:1030
void setDays(TField &field, TVal &&val)
Update field's value accordingly, while providing days value.
Definition units.h:863
constexpr bool isGigabytes()
Compile time check whether the field type holds gigabytes.
Definition units.h:2673
constexpr bool isVolts()
Compile time check whether the field type holds volts.
Definition units.h:2408
TRet getKilometersPerSecond(const TField &field)
Retrieve field's value as kilometers per second.
Definition units.h:1536
constexpr bool isHours()
Compile time check whether the field type holds hours.
Definition units.h:818
TRet getHours(const TField &field)
Retrieve field's value as hours.
Definition units.h:794
void setMetersPerSecond(TField &field, TVal &&val)
Update field's value accordingly, while providing meters per second value.
Definition units.h:1499
TRet getWeeks(const TField &field)
Retrieve field's value as weeks.
Definition units.h:900
TRet getNanoseconds(const TField &field)
Retrieve field's value as nanoseconds.
Definition units.h:529
constexpr bool isMicroamps()
Compile time check whether the field type holds microamps.
Definition units.h:2037
TRet getMeters(const TField &field)
Retrieve field's value as meters.
Definition units.h:1165
void setCentimeters(TField &field, TVal &&val)
Update field's value accordingly, while providing centimeters value.
Definition units.h:1128
void setKilovolts(TField &field, TVal &&val)
Update field's value accordingly, while providing kilovolts value.
Definition units.h:2453
void setMilliseconds(TField &field, TVal &&val)
Update field's value accordingly, while providing milliseconds value.
Definition units.h:651
constexpr bool isNanometersPerSecond()
Compile time check whether the field type holds nanometers per second.
Definition units.h:1295
TRet getKilometersPerHour(const TField &field)
Retrieve field's value as kilometers per hour.
Definition units.h:1589
void setSeconds(TField &field, TVal &&val)
Update field's value accordingly, while providing seconds value.
Definition units.h:704
void setMillimeters(TField &field, TVal &&val)
Update field's value accordingly, while providing millimeters value.
Definition units.h:1075
constexpr bool isMicrovolts()
Compile time check whether the field type holds microvolts.
Definition units.h:2302
constexpr bool isMicroseconds()
Compile time check whether the field type holds microseconds.
Definition units.h:606
TRet getTerabytes(const TField &field)
Retrieve field's value as terabytes.
Definition units.h:2702
constexpr bool isNanoamps()
Compile time check whether the field type holds nanoamps.
Definition units.h:1984
void setKilometers(TField &field, TVal &&val)
Update field's value accordingly, while providing kilometers value.
Definition units.h:1234
void setKiloamps(TField &field, TVal &&val)
Update field's value accordingly, while providing kiloamps value.
Definition units.h:2188
TRet getAmps(const TField &field)
Retrieve field's value as amps.
Definition units.h:2119
constexpr bool isMilliseconds()
Compile time check whether the field type holds milliseconds.
Definition units.h:659
constexpr bool isWeeks()
Compile time check whether the field type holds weeks.
Definition units.h:924
void setCentimetersPerSecond(TField &field, TVal &&val)
Update field's value accordingly, while providing centimeters per second value.
Definition units.h:1446
void setNanoamps(TField &field, TVal &&val)
Update field's value accordingly, while providing nanoamps value.
Definition units.h:1976
constexpr bool isKilohertz()
Compile time check whether the field type holds kilohertz.
Definition units.h:1719
constexpr bool isGigahertz()
Compile time check whether the field type holds gigahertz.
Definition units.h:1825
TRet getKilovolts(const TField &field)
Retrieve field's value as kilovolts.
Definition units.h:2437
TRet getBytes(const TField &field)
Retrieve field's value as bytes.
Definition units.h:2490
TRet getMetersPerSecond(const TField &field)
Retrieve field's value as meters per second.
Definition units.h:1483
void setMegahertz(TField &field, TVal &&val)
Update field's value accordingly, while providing megahertz value.
Definition units.h:1764
constexpr bool isNanoseconds()
Compile time check whether the field type holds nanoseconds.
Definition units.h:553
constexpr bool isKilobytes()
Compile time check whether the field type holds kilobytes.
Definition units.h:2567
void setHertz(TField &field, TVal &&val)
Update field's value accordingly, while providing hertz value.
Definition units.h:1658
TRet getMillimetersPerSecond(const TField &field)
Retrieve field's value as millimeters per second.
Definition units.h:1377
constexpr bool isMilliamps()
Compile time check whether the field type holds milliamps.
Definition units.h:2090
constexpr bool isKiloamps()
Compile time check whether the field type holds kiloamps.
Definition units.h:2196
TRet getKilobytes(const TField &field)
Retrieve field's value as kilobytes.
Definition units.h:2543
TRet getGigahertz(const TField &field)
Retrieve field's value as gigahertz.
Definition units.h:1801
void setMinutes(TField &field, TVal &&val)
Update field's value accordingly, while providing minutes value.
Definition units.h:757
void setDegrees(TField &field, TVal &&val)
Update field's value accordingly, while providing degrees value.
Definition units.h:1870
void setNanometers(TField &field, TVal &&val)
Update field's value accordingly, while providing nanometers value.
Definition units.h:969
void setMicroseconds(TField &field, TVal &&val)
Update field's value accordingly, while providing microseconds value.
Definition units.h:598
TRet getSeconds(const TField &field)
Retrieve field's value as seconds.
Definition units.h:688
void setMicrometers(TField &field, TVal &&val)
Update field's value accordingly, while providing micrometers value.
Definition units.h:1022
TRet getMicrometersPerSecond(const TField &field)
Retrieve field's value as micrometers per second.
Definition units.h:1324
void setMeters(TField &field, TVal &&val)
Update field's value accordingly, while providing meters value.
Definition units.h:1181
void setNanoseconds(TField &field, TVal &&val)
Update field's value accordingly, while providing nanoseconds value.
Definition units.h:545
void setRadians(TField &field, TVal &&val)
Update field's value accordingly, while providing radians value.
Definition units.h:1923
constexpr bool isDegrees()
Compile time check whether the field type holds degrees.
Definition units.h:1878
TRet getKilometers(const TField &field)
Retrieve field's value as kilometers.
Definition units.h:1218
TRet getCentimetersPerSecond(const TField &field)
Retrieve field's value as centimeters per second.
Definition units.h:1430
TRet getMegahertz(const TField &field)
Retrieve field's value as megahertz.
Definition units.h:1748
void setMegabytes(TField &field, TVal &&val)
Update field's value accordingly, while providing megabytes value.
Definition units.h:2612
void setKilometersPerSecond(TField &field, TVal &&val)
Update field's value accordingly, while providing kilometers per second value.
Definition units.h:1552
void setNanovolts(TField &field, TVal &&val)
Update field's value accordingly, while providing nanovolts value.
Definition units.h:2241
void setVolts(TField &field, TVal &&val)
Update field's value accordingly, while providing volts value.
Definition units.h:2400
constexpr bool isRadians()
Compile time check whether the field type holds radians.
Definition units.h:1931
constexpr bool isCentimeters()
Compile time check whether the field type holds centimeters.
Definition units.h:1136
void setKilometersPerHour(TField &field, TVal &&val)
Update field's value accordingly, while providing kilometers per hour value.
Definition units.h:1605
void setMicrovolts(TField &field, TVal &&val)
Update field's value accordingly, while providing microvolts value.
Definition units.h:2294
TRet getMegabytes(const TField &field)
Retrieve field's value as megabytes.
Definition units.h:2596
constexpr bool isDays()
Compile time check whether the field type holds days.
Definition units.h:871
constexpr bool isHertz()
Compile time check whether the field type holds hertz.
Definition units.h:1666
constexpr bool isSeconds()
Compile time check whether the field type holds seconds.
Definition units.h:712
void setKilohertz(TField &field, TVal &&val)
Update field's value accordingly, while providing kilohertz value.
Definition units.h:1711
constexpr bool isNanovolts()
Compile time check whether the field type holds nanovolts.
Definition units.h:2249
TRet getDegrees(const TField &field)
Retrieve field's value as degrees.
Definition units.h:1854
TRet getRadians(const TField &field)
Retrieve field's value as radians.
Definition units.h:1907
constexpr bool isMillivolts()
Compile time check whether the field type holds millivolts.
Definition units.h:2355
TRet getMillimeters(const TField &field)
Retrieve field's value as millimeters.
Definition units.h:1059
constexpr bool isAmps()
Compile time check whether the field type holds amps.
Definition units.h:2143
constexpr bool isKilometersPerSecond()
Compile time check whether the field type holds kilometers per second.
Definition units.h:1560
Main namespace for all classes / functions of COMMS library.
Tag class used to indicate electrical current value.
Definition traits.h:56
Tag class used to indicate distance value.
Definition traits.h:44
Tag class used to indicate frequency value.
Definition traits.h:50
Tag class used to indicate memory size value.
Definition traits.h:62
Tag class used to indicate speed value.
Definition traits.h:47
Tag class used to indicate time value.
Definition traits.h:41
Tag class used to indicate electrical voltage value.
Definition traits.h:59
Replacement to std::conditional.
Definition type_traits.h:32
This file contains all the classes necessary to properly define message traits.
Replacement to some types from standard type_traits.