swift
units.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #ifndef SWIFT_MISC_PQ_UNITS_H
7 #define SWIFT_MISC_PQ_UNITS_H
8 
9 #pragma push_macro("min")
10 #undef min
11 
12 #include <cmath>
13 #include <cstddef>
14 
15 #include <QDBusArgument>
16 #include <QList>
17 #include <QMetaType>
18 #include <QString>
19 #include <QtGlobal>
20 #include <QtMath>
21 
22 #include "misc/mixin/mixindbus.h"
23 #include "misc/mixin/mixinindex.h"
26 #include "misc/swiftmiscexport.h"
27 
29 #define SWIFT_TEMPLATE_UNIT_MIXINS(MU, Extern, Export) \
30  namespace swift::misc::physical_quantities \
31  { \
32  class MU; \
33  } \
34  namespace swift::misc::private_ns \
35  { \
36  Extern template struct Export CValueObjectMetaInfo<physical_quantities::MU>; \
37  Extern template struct Export MetaTypeHelper<physical_quantities::MU>; \
38  } \
39  namespace swift::misc::mixin \
40  { \
41  Extern template class Export MetaType<physical_quantities::MU>; \
42  Extern template class Export DBusOperators<physical_quantities::MU>; \
43  Extern template class Export DataStreamOperators<physical_quantities::MU>; \
44  Extern template class Export Index<physical_quantities::MU>; \
45  }
47 
58 #if defined(Q_OS_WIN) && defined(Q_CC_GNU)
59 # define SWIFT_DECLARE_UNIT_MIXINS(MU)
60 # define SWIFT_DEFINE_UNIT_MIXINS(MU)
61 #elif defined(Q_OS_WIN) && defined(Q_CC_CLANG)
62 # define SWIFT_DECLARE_UNIT_MIXINS(MU) SWIFT_TEMPLATE_UNIT_MIXINS(MU, extern, )
63 # define SWIFT_DEFINE_UNIT_MIXINS(MU) SWIFT_TEMPLATE_UNIT_MIXINS(MU, , SWIFT_MISC_EXPORT)
64 #else
65 # define SWIFT_DECLARE_UNIT_MIXINS(MU) SWIFT_TEMPLATE_UNIT_MIXINS(MU, extern, )
66 # define SWIFT_DEFINE_UNIT_MIXINS(MU) SWIFT_TEMPLATE_UNIT_MIXINS(MU, , )
67 #endif
68 
69 SWIFT_DECLARE_UNIT_MIXINS(CAngleUnit)
70 SWIFT_DECLARE_UNIT_MIXINS(CLengthUnit)
71 SWIFT_DECLARE_UNIT_MIXINS(CPressureUnit)
72 SWIFT_DECLARE_UNIT_MIXINS(CFrequencyUnit)
74 SWIFT_DECLARE_UNIT_MIXINS(CTemperatureUnit)
75 SWIFT_DECLARE_UNIT_MIXINS(CSpeedUnit)
77 SWIFT_DECLARE_UNIT_MIXINS(CAccelerationUnit)
78 
79 //
80 // Used with the template for quantities. This is the reason for
81 // having all units in one file, since template requires concrete instantiations
82 //
83 // I18N:
84 // http://qt-project.org/doc/qt-4.8/linguist-programmers.html#translating-text-that-is-outside-of-a-qobject-subclass
85 //
86 namespace swift::misc::physical_quantities
87 {
90  public CMeasurementUnit,
91  public mixin::MetaType<CLengthUnit>,
92  public mixin::DBusOperators<CLengthUnit>,
93  public mixin::DataStreamOperators<CLengthUnit>,
94  public mixin::Index<CLengthUnit>
95  {
96  private:
98 
99  struct NauticalMilesToMeters
100  {
101  static double factor() { return 1852.0; }
102  };
103  struct FeetToMeters
104  {
105  static double factor() { return 0.3048; }
106  };
107  struct MilesToMeters
108  {
109  static double factor() { return 1609.344; }
110  };
111  struct StatuteMilesToMeters
112  {
113  static double factor() { return 1609.3472; }
114  };
115  using MetersToMeters = One;
116 
117  public:
120 
122 
123 
124  CLengthUnit() : CMeasurementUnit(defaultUnit()) {}
125 
127  CLengthUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
128 
130  static CLengthUnit defaultUnit() { return m(); }
131 
134  {
135  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
136  return nu;
137  }
138 
140  static CLengthUnit m()
141  {
142  static constexpr CMeasurementUnit::Data m(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter")),
143  constQLatin1("m"), IdentityConverter());
144  return m;
145  }
146 
148  static CLengthUnit NM()
149  {
150  static constexpr CMeasurementUnit::Data NM(
151  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "nautical mile")), constQLatin1("NM"),
153  return NM;
154  }
155 
157  static CLengthUnit ft()
158  {
159  static constexpr CMeasurementUnit::Data ft(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot")),
160  constQLatin1("ft"), LinearConverter<FeetToMeters>(), 1);
161  return ft;
162  }
163 
165  static CLengthUnit km()
166  {
167  static constexpr CMeasurementUnit::Data km(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilometer")),
168  constQLatin1("km"), LinearConverter<Kilo<MetersToMeters>>(), 3);
169  return km;
170  }
171 
173  static CLengthUnit cm()
174  {
175  static constexpr CMeasurementUnit::Data cm(
176  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "centimeter")), constQLatin1("cm"),
178  return cm;
179  }
180 
182  static CLengthUnit mi()
183  {
184  static constexpr CMeasurementUnit::Data mi(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "mile")),
185  constQLatin1("mi"), LinearConverter<MilesToMeters>(), 3);
186  return mi;
187  }
188 
190  static CLengthUnit SM()
191  {
192  static constexpr CMeasurementUnit::Data sm(
193  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "statute mile")), constQLatin1("SM"),
195  return sm;
196  }
197 
199  static const QList<CLengthUnit> &allUnits()
200  {
204  return u;
205  }
206 
208  void unmarshallFromDbus(const QDBusArgument &argument)
209  {
210  QString unitName;
211  argument >> unitName;
212  (*this) = CMeasurementUnit::unitFromSymbol<CLengthUnit>(unitName);
213  }
214 
217  {
218  QString unitName;
219  stream >> unitName;
220  *this = CMeasurementUnit::unitFromSymbol<CLengthUnit>(unitName);
221  }
222  };
223 
226  public CMeasurementUnit,
227  public mixin::MetaType<CAngleUnit>,
228  public mixin::DBusOperators<CAngleUnit>,
229  public mixin::DataStreamOperators<CAngleUnit>,
230  public mixin::Index<CAngleUnit>
231  {
232  private:
234 
235  struct RadiansToDegrees
236  {
237  static double factor() { return 180.0 / M_PI; }
238  };
239  using DegreesToDegrees = One;
240 
241  public:
244 
246 
247 
248  CAngleUnit() : CMeasurementUnit(defaultUnit()) {}
249 
251  CAngleUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
252 
254  static CAngleUnit defaultUnit() { return deg(); }
255 
258  {
259  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
260  return nu;
261  }
262 
264  QString makeRoundedQStringWithUnit(double value, int digits = -1, bool withGroupSeparator = false,
265  bool i18n = false) const override;
266 
268  static CAngleUnit rad()
269  {
270  static constexpr CMeasurementUnit::Data rad(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "radian")),
271  constQLatin1("rad"), LinearConverter<RadiansToDegrees>());
272  return rad;
273  }
274 
276  static CAngleUnit deg()
277  {
278  static constexpr CMeasurementUnit::Data deg(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree")),
279  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "deg")),
281  return deg;
282  }
283 
286  {
287  static constexpr CMeasurementUnit::Data deg(
288  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree, minute, second")), constQLatin1("DMS"),
290  return deg;
291  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1 %L2 %L3");
292  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1 %L2 %L3");
293  }
294 
297  {
298  static constexpr CMeasurementUnit::Data deg(
299  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree, minute")), constQLatin1("MinDec"),
301  return deg;
302  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1 %L2");
303  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1 %L2");
304  }
305 
307  static const QList<CAngleUnit> &allUnits()
308  {
311  return u;
312  }
313 
315  void unmarshallFromDbus(const QDBusArgument &argument)
316  {
317  QString unitName;
318  argument >> unitName;
319  (*this) = CMeasurementUnit::unitFromSymbol<CAngleUnit>(unitName);
320  }
321 
324  {
325  QString unitName;
326  stream >> unitName;
327  *this = CMeasurementUnit::unitFromSymbol<CAngleUnit>(unitName);
328  }
329  };
330 
333  public CMeasurementUnit,
334  public mixin::MetaType<CFrequencyUnit>,
335  public mixin::DBusOperators<CFrequencyUnit>,
336  public mixin::DataStreamOperators<CFrequencyUnit>,
337  public mixin::Index<CFrequencyUnit>
338  {
339  private:
341 
342  using HertzToHertz = One;
343 
344  public:
347 
349 
350 
351  CFrequencyUnit() : CMeasurementUnit(defaultUnit()) {}
352 
354  CFrequencyUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
355 
357  static CFrequencyUnit defaultUnit() { return Hz(); }
358 
361  {
362  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
363  return nu;
364  }
365 
368  {
369  static constexpr CMeasurementUnit::Data Hz(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hertz")),
370  constQLatin1("Hz"), IdentityConverter());
371  return Hz;
372  }
373 
376  {
377  static constexpr CMeasurementUnit::Data kHz(
378  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilohertz")), constQLatin1("kHz"),
380  return kHz;
381  }
382 
385  {
386  static constexpr CMeasurementUnit::Data MHz(
387  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "megahertz")), constQLatin1("MHz"),
389  return MHz;
390  }
391 
394  {
395  static constexpr CMeasurementUnit::Data GHz(
396  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "gigahertz")), constQLatin1("GHz"),
398  return GHz;
399  }
400 
403  {
406  return u;
407  }
408 
410  void unmarshallFromDbus(const QDBusArgument &argument)
411  {
412  QString unitName;
413  argument >> unitName;
414  (*this) = CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unitName);
415  }
416 
419  {
420  QString unitName;
421  stream >> unitName;
422  *this = CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unitName);
423  }
424  };
425 
428  public CMeasurementUnit,
429  public mixin::MetaType<CMassUnit>,
430  public mixin::DBusOperators<CMassUnit>,
431  public mixin::DataStreamOperators<CMassUnit>,
432  public mixin::Index<CMassUnit>
433  {
434  private:
436 
438  struct PoundsToKilograms
439  {
440  static double factor() { return 0.45359237; }
441  };
442 
443  public:
446 
448 
449 
450  CMassUnit() : CMeasurementUnit(defaultUnit()) {}
451 
453  CMassUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
454 
456  static CMassUnit defaultUnit() { return kg(); }
457 
460  {
461  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
462  return nu;
463  }
464 
466  static CMassUnit kg()
467  {
468  static constexpr CMeasurementUnit::Data kg(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilogram")),
469  constQLatin1("kg"), IdentityConverter(), 1);
470  return kg;
471  }
472 
474  static CMassUnit g()
475  {
476  static constexpr CMeasurementUnit::Data g(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "gram")),
477  constQLatin1("g"), LinearConverter<GramsToKilograms>(), 0);
478  return g;
479  }
480 
482  static CMassUnit tonne()
483  {
484  static constexpr CMeasurementUnit::Data t(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "tonne")),
485  constQLatin1("t"), LinearConverter<Mega<GramsToKilograms>>(), 3);
486  return t;
487  }
488 
491  {
492  static constexpr CMeasurementUnit::Data ton(
493  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "short ton")), constQLatin1("ton"),
495  return ton;
496  }
497 
499  static CMassUnit lb()
500  {
501  static constexpr CMeasurementUnit::Data lbs(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "pound")),
502  constQLatin1("lb"), LinearConverter<PoundsToKilograms>(), 1);
503  return lbs;
504  }
505 
507  static const QList<CMassUnit> &allUnits()
508  {
511  return u;
512  }
513 
515  void unmarshallFromDbus(const QDBusArgument &argument)
516  {
517  QString unitName;
518  argument >> unitName;
519  (*this) = CMeasurementUnit::unitFromSymbol<CMassUnit>(unitName);
520  }
521 
524  {
525  QString unitName;
526  stream >> unitName;
527  *this = CMeasurementUnit::unitFromSymbol<CMassUnit>(unitName);
528  }
529  };
530 
533  public CMeasurementUnit,
534  public mixin::MetaType<CPressureUnit>,
535  public mixin::DBusOperators<CPressureUnit>,
536  public mixin::DataStreamOperators<CPressureUnit>,
537  public mixin::Index<CPressureUnit>
538  {
539  private:
541 
543  struct PsiToHectopascals
544  {
545  static double factor() { return 68.948; }
546  };
547  struct InchesToHectopascals
548  {
549  static double factor() { return 33.86389; }
550  };
551  struct MillimetersToHectopascals
552  {
553  static double factor() { return 860.142806; }
554  };
555 
556  public:
559 
561 
562 
563  CPressureUnit() : CMeasurementUnit(defaultUnit()) {}
564 
566  CPressureUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
567 
569  static CPressureUnit defaultUnit() { return hPa(); }
570 
573  {
574  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
575  return nu;
576  }
577 
579  static CPressureUnit Pa()
580  {
581  static constexpr CMeasurementUnit::Data Pa(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "pascal")),
582  constQLatin1("Pa"), LinearConverter<PascalsToHectopascals>());
583  return Pa;
584  }
585 
588  {
589  static constexpr CMeasurementUnit::Data hPa(
590  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hectopascal")), constQLatin1("hPa"),
592  return hPa;
593  }
594 
597  {
598  static constexpr CMeasurementUnit::Data psi(
599  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "pound per square inch")), constQLatin1("psi"),
601  return psi;
602  }
603 
606  {
607  static constexpr CMeasurementUnit::Data bar(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "bar")),
608  constQLatin1("bar"), LinearConverter<Kilo<One>>(), 1);
609  return bar;
610  }
611 
614  {
615  static constexpr CMeasurementUnit::Data mbar(
616  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "millibar")), constQLatin1("mbar"),
617  IdentityConverter(), 1);
618  return mbar;
619  }
620 
623  {
624  static constexpr CMeasurementUnit::Data inHg(
625  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "inch of mercury")), constQLatin1("inHg"),
627  return inHg;
628  }
629 
632  {
633  static constexpr CMeasurementUnit::Data mmhg(
634  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "millimeter of mercury")), constQLatin1("mmHg"),
636  return mmhg;
637  }
638 
641  {
645  CPressureUnit::psi() };
646  return u;
647  }
648 
650  void unmarshallFromDbus(const QDBusArgument &argument)
651  {
652  QString unitName;
653  argument >> unitName;
654  (*this) = CMeasurementUnit::unitFromSymbol<CPressureUnit>(unitName);
655  }
656 
659  {
660  QString unitName;
661  stream >> unitName;
662  *this = CMeasurementUnit::unitFromSymbol<CPressureUnit>(unitName);
663  }
664  };
665 
668  public CMeasurementUnit,
669  public mixin::MetaType<CTemperatureUnit>,
670  public mixin::DBusOperators<CTemperatureUnit>,
671  public mixin::DataStreamOperators<CTemperatureUnit>,
672  public mixin::Index<CTemperatureUnit>
673  {
674  private:
676 
677  struct KelvinToCentigrade
678  {
679  static double factor() { return 1.0; }
680  static double offset() { return 273.15; }
681  };
682  struct FahrenheitToCentigrade
683  {
684  static double factor() { return 5.0 / 9.0; }
685  static double offset() { return 32.0; }
686  };
687 
688  public:
691 
693 
694 
695  CTemperatureUnit() : CMeasurementUnit(defaultUnit()) {}
696 
698  CTemperatureUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
699 
701  static CTemperatureUnit defaultUnit() { return C(); }
702 
705  {
706  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
707  return nu;
708  }
709 
712  {
713  static constexpr CMeasurementUnit::Data K(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "Kelvin")),
714  constQLatin1("K"), AffineConverter<KelvinToCentigrade>());
715  return K;
716  }
717 
720  {
721  static constexpr CMeasurementUnit::Data C(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "centigrade")),
722  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "C")),
724  return C;
725  }
726 
729  {
730  static constexpr CMeasurementUnit::Data F(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "Fahrenheit")),
731  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "F")),
733  return F;
734  }
735 
738  {
741  return u;
742  }
743 
745  void unmarshallFromDbus(const QDBusArgument &argument)
746  {
747  QString unitName;
748  argument >> unitName;
749  (*this) = CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unitName);
750  }
751 
754  {
755  QString unitName;
756  stream >> unitName;
757  *this = CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unitName);
758  }
759  };
760 
763  public CMeasurementUnit,
764  public mixin::MetaType<CSpeedUnit>,
765  public mixin::DBusOperators<CSpeedUnit>,
766  public mixin::DataStreamOperators<CSpeedUnit>,
767  public mixin::Index<CSpeedUnit>
768  {
769  private:
771 
772  struct KnotsToMps
773  {
774  static double factor() { return 1852.0 / 3600.0; }
775  };
776  struct KphToMps
777  {
778  static double factor() { return 1.0 / 3.6; }
779  };
780  struct FtPerSecToMps
781  {
782  static double factor() { return 0.3048; }
783  };
784  struct FtPerMinToMps
785  {
786  static double factor() { return 0.3048 / 60.0; }
787  };
788 
789  public:
792 
794 
795 
796  CSpeedUnit() : CMeasurementUnit(defaultUnit()) {}
797 
799  CSpeedUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
800 
802  static CSpeedUnit defaultUnit() { return m_s(); }
803 
806  {
807  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
808  return nu;
809  }
810 
812  static CSpeedUnit m_s()
813  {
814  static constexpr CMeasurementUnit::Data ms(
815  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter per second")), constQLatin1("m/s"),
817  return ms;
818  }
819 
821  static CSpeedUnit kts()
822  {
823  static constexpr CMeasurementUnit::Data kts(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "knot")),
824  constQLatin1("kts"), LinearConverter<KnotsToMps>(), 1);
825  return kts;
826  }
827 
829  static CSpeedUnit NM_h()
830  {
831  static constexpr CMeasurementUnit::Data NMh(
832  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "nautical mile per hour")), constQLatin1("NM/h"),
834  return NMh;
835  }
836 
838  static CSpeedUnit ft_s()
839  {
840  static constexpr CMeasurementUnit::Data fts(
841  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per second")), constQLatin1("ft/s"),
843  return fts;
844  }
845 
848  {
849  static constexpr CMeasurementUnit::Data ftmin(
850  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per minute")), constQLatin1("ft/min"),
852  return ftmin;
853  }
854 
856  static CSpeedUnit km_h()
857  {
858  static constexpr CMeasurementUnit::Data kmh(
859  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilometer per hour")), constQLatin1("km/h"),
861  return kmh;
862  }
863 
865  static const QList<CSpeedUnit> &allUnits()
866  {
869  CSpeedUnit::NM_h() };
870  return u;
871  }
872 
874  void unmarshallFromDbus(const QDBusArgument &argument)
875  {
876  QString unitName;
877  argument >> unitName;
878  (*this) = CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unitName);
879  }
880 
883  {
884  QString unitName;
885  stream >> unitName;
886  *this = CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unitName);
887  }
888  };
889 
892  public CMeasurementUnit,
893  public mixin::MetaType<CTimeUnit>,
894  public mixin::DBusOperators<CTimeUnit>,
895  public mixin::DataStreamOperators<CTimeUnit>,
896  public mixin::Index<CTimeUnit>
897  {
898  private:
900 
901  using SecondsToSeconds = One;
902  struct DaysToSeconds
903  {
904  static double factor() { return 60.0 * 60.0 * 24.0; }
905  };
906  struct HoursToSeconds
907  {
908  static double factor() { return 60.0 * 60.0; }
909  };
910  struct MinutesToSeconds
911  {
912  static double factor() { return 60.0; }
913  };
914 
915  public:
918 
920 
921 
922  CTimeUnit() : CMeasurementUnit(defaultUnit()) {}
923 
925  CTimeUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
926 
928  static CTimeUnit defaultUnit() { return s(); }
929 
932  {
933  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
934  return nu;
935  }
936 
938  QString makeRoundedQStringWithUnit(double value, int digits = -1, bool withGroupSeparator = false,
939  bool i18n = false) const override;
940 
942  static CTimeUnit s()
943  {
944  static constexpr CMeasurementUnit::Data s(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "second")),
945  constQLatin1("s"), IdentityConverter(), 1);
946  return s;
947  }
948 
950  static CTimeUnit ms()
951  {
952  static constexpr CMeasurementUnit::Data ms(
953  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "millisecond")), constQLatin1("ms"),
955  return ms;
956  }
957 
959  static CTimeUnit h()
960  {
961  static constexpr CMeasurementUnit::Data h(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour")),
962  constQLatin1("h"), LinearConverter<HoursToSeconds>(), 1);
963  return h;
964  }
965 
967  static CTimeUnit min()
968  {
969  static constexpr CMeasurementUnit::Data minute(
970  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "minute")), constQLatin1("min"),
972  return minute;
973  }
974 
976  static CTimeUnit d()
977  {
978  static constexpr CMeasurementUnit::Data day(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "day")),
979  constQLatin1("d"), LinearConverter<DaysToSeconds>(), 1);
980  return day;
981  }
982 
984  static CTimeUnit hms()
985  {
986  static constexpr CMeasurementUnit::Data hms(
987  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour, minute, second")), constQLatin1("hms"),
988  SubdivisionConverter2<HoursToSeconds, InEachHundred<60>>(), 4);
989  return hms;
990  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1h%L2m%L3s");
991  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%-L1h%L2m%L3s");
992  }
993 
995  static CTimeUnit hrmin()
996  {
997  static constexpr CMeasurementUnit::Data hrmin(
998  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour, minute")), constQLatin1("hm"),
999  SubdivisionConverter<HoursToSeconds, InEachHundred<60>>(), 3);
1000  return hrmin;
1001  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1h%L2m");
1002  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1h%L2m");
1003  }
1004 
1007  {
1008  static constexpr CMeasurementUnit::Data minsec(
1009  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "minute, second")), constQLatin1("minsec"),
1010  SubdivisionConverter<MinutesToSeconds, InEachHundred<60>>(), 2);
1011  return minsec;
1012  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1m%L2s");
1013  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1m%L2s");
1014  }
1015 
1017  static const QList<CTimeUnit> &allUnits()
1018  {
1021  CTimeUnit::ms(), CTimeUnit::s() };
1022  return u;
1023  }
1024 
1026  void unmarshallFromDbus(const QDBusArgument &argument)
1027  {
1028  QString unitName;
1029  argument >> unitName;
1030  (*this) = CMeasurementUnit::unitFromSymbol<CTimeUnit>(unitName);
1031  }
1032 
1035  {
1036  QString unitName;
1037  stream >> unitName;
1038  *this = CMeasurementUnit::unitFromSymbol<CTimeUnit>(unitName);
1039  }
1040  };
1041 
1044  public CMeasurementUnit,
1045  public mixin::MetaType<CAccelerationUnit>,
1046  public mixin::DBusOperators<CAccelerationUnit>,
1047  public mixin::DataStreamOperators<CAccelerationUnit>,
1048  public mixin::Index<CAccelerationUnit>
1049  {
1050  private:
1052 
1053  struct FeetToMeters
1054  {
1055  static double factor() { return 0.3048; }
1056  };
1057 
1058  public:
1061 
1063 
1064 
1065  CAccelerationUnit() : CMeasurementUnit(defaultUnit()) {}
1066 
1068  CAccelerationUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
1069 
1071  static CAccelerationUnit defaultUnit() { return m_s2(); }
1072 
1075  {
1076  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
1077  return nu;
1078  }
1079 
1082  {
1083  static constexpr CMeasurementUnit::Data ms2(
1084  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter per second per second")),
1085  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "m/s^2")), IdentityConverter(), 1);
1086  return ms2;
1087  }
1088 
1091  {
1092  static constexpr CMeasurementUnit::Data fts2(
1093  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per second per second")),
1094  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "ft/s^2")), LinearConverter<FeetToMeters>(), 0);
1095  return fts2;
1096  }
1097 
1100  {
1103  return u;
1104  }
1105 
1107  void unmarshallFromDbus(const QDBusArgument &argument)
1108  {
1109  QString unitName;
1110  argument >> unitName;
1111  (*this) = CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unitName);
1112  }
1113 
1116  {
1117  QString unitName;
1118  stream >> unitName;
1119  *this = CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unitName);
1120  }
1121  };
1122 
1123 } // namespace swift::misc::physical_quantities
1124 
1134 
1135 #pragma pop_macro("min")
1136 
1137 #endif // SWIFT_MISC_PQ_UNITS_H
CRTP class template which will generate marshalling operators for a derived class with its own marsha...
Definition: mixindbus.h:39
CRTP class template to generate non-member QDataStream streaming operators.
CRTP class template from which a derived class can inherit property indexing functions.
Definition: mixinindex.h:40
CRTP class template from which a derived class can inherit common methods dealing with the metatype o...
Definition: mixinmetatype.h:27
Specialized class for acceleration units (m/s2, ft/s2).
Definition: units.h:1049
static CAccelerationUnit defaultUnit()
Default unit.
Definition: units.h:1071
static CAccelerationUnit ft_s2()
Feet/second^2.
Definition: units.h:1090
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:1107
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:1115
static CAccelerationUnit nullUnit()
Null unit.
Definition: units.h:1074
CAccelerationUnit(std::nullptr_t)
Null constructor.
Definition: units.h:1068
static CAccelerationUnit m_s2()
Meter/second^2 (m/s^2)
Definition: units.h:1081
static const QList< CAccelerationUnit > & allUnits()
All units.
Definition: units.h:1099
Specialized class for angles (degrees, radian).
Definition: units.h:231
static CAngleUnit sexagesimalDegMin()
Sexagesimal degree (degrees, minutes, decimal minutes)
Definition: units.h:296
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:315
static CAngleUnit rad()
Radians.
Definition: units.h:268
static CAngleUnit nullUnit()
Null unit.
Definition: units.h:257
static const QList< CAngleUnit > & allUnits()
All units.
Definition: units.h:307
static CAngleUnit deg()
Degrees.
Definition: units.h:276
static CAngleUnit sexagesimalDeg()
Sexagesimal degree (degrees, minutes, seconds, decimal seconds)
Definition: units.h:285
static CAngleUnit defaultUnit()
Default unit.
Definition: units.h:254
CAngleUnit(std::nullptr_t)
Null constructor.
Definition: units.h:251
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:323
Specialized class for frequency (hertz, mega hertz, kilo hertz).
Definition: units.h:338
static CFrequencyUnit Hz()
Hertz.
Definition: units.h:367
static CFrequencyUnit nullUnit()
Null unit.
Definition: units.h:360
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:410
static CFrequencyUnit MHz()
Megahertz.
Definition: units.h:384
static const QList< CFrequencyUnit > & allUnits()
All units.
Definition: units.h:402
CFrequencyUnit(std::nullptr_t)
Null constructor.
Definition: units.h:354
static CFrequencyUnit defaultUnit()
Default unit.
Definition: units.h:357
static CFrequencyUnit kHz()
Kilohertz.
Definition: units.h:375
static CFrequencyUnit GHz()
Gigahertz.
Definition: units.h:393
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:418
Specialized class for distance units (meter, foot, nautical miles).
Definition: units.h:95
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:216
static CLengthUnit km()
Kilometer km.
Definition: units.h:165
static CLengthUnit nullUnit()
Null unit.
Definition: units.h:133
static const QList< CLengthUnit > & allUnits()
All units.
Definition: units.h:199
static CLengthUnit m()
Meter m.
Definition: units.h:140
static CLengthUnit SM()
Statute mile.
Definition: units.h:190
static CLengthUnit NM()
Nautical miles NM.
Definition: units.h:148
static CLengthUnit ft()
Foot ft.
Definition: units.h:157
CLengthUnit(std::nullptr_t)
Null constructor.
Definition: units.h:127
static CLengthUnit mi()
International mile.
Definition: units.h:182
static CLengthUnit defaultUnit()
Default unit.
Definition: units.h:130
static CLengthUnit cm()
Centimeter cm.
Definition: units.h:173
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:208
Specialized class for mass units (kg, lbs).
Definition: units.h:433
static const QList< CMassUnit > & allUnits()
All units.
Definition: units.h:507
CMassUnit(std::nullptr_t)
Null constructor.
Definition: units.h:453
static CMassUnit tonne()
Tonne, aka metric ton (1000kg)
Definition: units.h:482
static CMassUnit defaultUnit()
Default unit.
Definition: units.h:456
static CMassUnit shortTon()
Short ton (2000lb) used in the United States.
Definition: units.h:490
static CMassUnit g()
Gram, SI unit.
Definition: units.h:474
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:523
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:515
static CMassUnit nullUnit()
Null unit.
Definition: units.h:459
static CMassUnit lb()
Pound, aka mass pound.
Definition: units.h:499
static CMassUnit kg()
Kilogram, SI base unit.
Definition: units.h:466
Base class for all units, such as meter, hertz.
Specialized class for pressure (psi, hPa, bar).
Definition: units.h:538
static CPressureUnit nullUnit()
Null unit.
Definition: units.h:572
static CPressureUnit bar()
Bar.
Definition: units.h:605
CPressureUnit(std::nullptr_t)
Null constructor.
Definition: units.h:566
static CPressureUnit mbar()
Millibar, actually the same as hPa.
Definition: units.h:613
static CPressureUnit mmHg()
Millimeter of mercury.
Definition: units.h:631
static CPressureUnit Pa()
Pascal.
Definition: units.h:579
static CPressureUnit inHg()
Inch of mercury at 0°C.
Definition: units.h:622
static const QList< CPressureUnit > & allUnits()
All units.
Definition: units.h:640
static CPressureUnit psi()
Pounds per square inch.
Definition: units.h:596
static CPressureUnit defaultUnit()
Default unit.
Definition: units.h:569
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:658
static CPressureUnit hPa()
Hectopascal.
Definition: units.h:587
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:650
Specialized class for speed units (m/s, ft/s, NM/h).
Definition: units.h:768
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:874
static CSpeedUnit NM_h()
Nautical miles per hour NM/h (same as kts)
Definition: units.h:829
static const QList< CSpeedUnit > & allUnits()
All units.
Definition: units.h:865
static CSpeedUnit ft_s()
Feet/second ft/s.
Definition: units.h:838
static CSpeedUnit ft_min()
Feet/min ft/min.
Definition: units.h:847
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:882
static CSpeedUnit km_h()
Kilometer/hour km/h.
Definition: units.h:856
CSpeedUnit(std::nullptr_t)
Null constructor.
Definition: units.h:799
static CSpeedUnit m_s()
Meter/second m/s.
Definition: units.h:812
static CSpeedUnit kts()
Knots.
Definition: units.h:821
static CSpeedUnit defaultUnit()
Default unit.
Definition: units.h:802
static CSpeedUnit nullUnit()
Null unit.
Definition: units.h:805
Specialized class for temperatur units (kelvin, centidegree).
Definition: units.h:673
static const QList< CTemperatureUnit > & allUnits()
All units.
Definition: units.h:737
static CTemperatureUnit defaultUnit()
Default unit.
Definition: units.h:701
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:745
static CTemperatureUnit nullUnit()
Null unit.
Definition: units.h:704
static CTemperatureUnit C()
Centigrade C.
Definition: units.h:719
static CTemperatureUnit K()
Kelvin.
Definition: units.h:711
CTemperatureUnit(std::nullptr_t)
Null constructor.
Definition: units.h:698
static CTemperatureUnit F()
Fahrenheit F.
Definition: units.h:728
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:753
Specialized class for time units (ms, hour, min).
Definition: units.h:897
static CTimeUnit min()
Minute.
Definition: units.h:967
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:1034
static CTimeUnit nullUnit()
Null unit.
Definition: units.h:931
static CTimeUnit defaultUnit()
Default unit.
Definition: units.h:928
static CTimeUnit hrmin()
Hours, minutes.
Definition: units.h:995
CTimeUnit(std::nullptr_t)
Null constructor.
Definition: units.h:925
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:1026
static CTimeUnit hms()
Hours, minutes, seconds.
Definition: units.h:984
static CTimeUnit s()
Second s.
Definition: units.h:942
static CTimeUnit minsec()
Minutes, seconds.
Definition: units.h:1006
static const QList< CTimeUnit > & allUnits()
All units.
Definition: units.h:1017
static CTimeUnit ms()
Millisecond ms.
Definition: units.h:950
#define SWIFT_MISC_DECLARE_USING_MIXIN_METATYPE(DERIVED)
When a derived class and a base class both inherit from mixin::MetaType, the derived class uses this ...
Concrete strategy pattern for converting unit with offset linear conversion.
Metapolicy that can be used to modify template parameters of converters.
Metapolicy that can be used to modify template parameters of converters.
Concrete strategy pattern for converting unit that does nothing.
Metapolicy that can be used to modify template parameters of converters.
Metapolicy that can be used to modify template parameters of converters.
Concrete strategy pattern for converting unit with linear conversion.
Metapolicy that can be used to modify template parameters of converters.
Metapolicy that can be used to modify template parameters of converters.
Metapolicy that can be used to modify template parameters of converters.
Concrete strategy pattern for converting unit with two subdivision conversions.
Concrete strategy pattern for converting unit with one subdivision conversion.
Metapolicy that can be used to modify template parameters of converters.
#define SWIFT_MISC_EXPORT
Export a class or function from the library.
#define SWIFT_DECLARE_UNIT_MIXINS(MU)
Explicit template declaration of mixins for a CMeasurementUnit subclass to be placed near the top of ...
Definition: units.h:65