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  virtual void anchor();
118 
119  public:
122 
124 
125 
126  CLengthUnit() : CMeasurementUnit(defaultUnit()) {}
127 
129  CLengthUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
130 
132  static CLengthUnit defaultUnit() { return m(); }
133 
136  {
137  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
138  return nu;
139  }
140 
142  static CLengthUnit m()
143  {
144  static constexpr CMeasurementUnit::Data m(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter")),
145  constQLatin1("m"), IdentityConverter());
146  return m;
147  }
148 
150  static CLengthUnit NM()
151  {
152  static constexpr CMeasurementUnit::Data NM(
153  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "nautical mile")), constQLatin1("NM"),
155  return NM;
156  }
157 
159  static CLengthUnit ft()
160  {
161  static constexpr CMeasurementUnit::Data ft(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot")),
162  constQLatin1("ft"), LinearConverter<FeetToMeters>(), 1);
163  return ft;
164  }
165 
167  static CLengthUnit km()
168  {
169  static constexpr CMeasurementUnit::Data km(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilometer")),
170  constQLatin1("km"), LinearConverter<Kilo<MetersToMeters>>(), 3);
171  return km;
172  }
173 
175  static CLengthUnit cm()
176  {
177  static constexpr CMeasurementUnit::Data cm(
178  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "centimeter")), constQLatin1("cm"),
180  return cm;
181  }
182 
184  static CLengthUnit mi()
185  {
186  static constexpr CMeasurementUnit::Data mi(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "mile")),
187  constQLatin1("mi"), LinearConverter<MilesToMeters>(), 3);
188  return mi;
189  }
190 
192  static CLengthUnit SM()
193  {
194  static constexpr CMeasurementUnit::Data sm(
195  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "statute mile")), constQLatin1("SM"),
197  return sm;
198  }
199 
201  static const QList<CLengthUnit> &allUnits()
202  {
203  static const QList<CLengthUnit> u { CLengthUnit::nullUnit(), CLengthUnit::cm(), CLengthUnit::ft(),
206  return u;
207  }
208 
210  void unmarshallFromDbus(const QDBusArgument &argument)
211  {
212  QString unitName;
213  argument >> unitName;
214  (*this) = CMeasurementUnit::unitFromSymbol<CLengthUnit>(unitName);
215  }
216 
218  void unmarshalFromDataStream(QDataStream &stream)
219  {
220  QString unitName;
221  stream >> unitName;
222  *this = CMeasurementUnit::unitFromSymbol<CLengthUnit>(unitName);
223  }
224  };
225 
228  public CMeasurementUnit,
229  public mixin::MetaType<CAngleUnit>,
230  public mixin::DBusOperators<CAngleUnit>,
231  public mixin::DataStreamOperators<CAngleUnit>,
232  public mixin::Index<CAngleUnit>
233  {
234  private:
236 
237  struct RadiansToDegrees
238  {
239  static double factor() { return 180.0 / M_PI; }
240  };
241  using DegreesToDegrees = One;
242 
243  public:
246 
248 
249 
250  CAngleUnit() : CMeasurementUnit(defaultUnit()) {}
251 
253  CAngleUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
254 
256  static CAngleUnit defaultUnit() { return deg(); }
257 
260  {
261  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
262  return nu;
263  }
264 
266  virtual QString makeRoundedQStringWithUnit(double value, int digits = -1, bool withGroupSeparator = false,
267  bool i18n = false) const override;
268 
270  static CAngleUnit rad()
271  {
272  static constexpr CMeasurementUnit::Data rad(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "radian")),
273  constQLatin1("rad"), LinearConverter<RadiansToDegrees>());
274  return rad;
275  }
276 
278  static CAngleUnit deg()
279  {
280  static constexpr CMeasurementUnit::Data deg(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree")),
281  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "deg")),
283  return deg;
284  }
285 
288  {
289  static constexpr CMeasurementUnit::Data deg(
290  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree, minute, second")), constQLatin1("DMS"),
292  return deg;
293  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1 %L2 %L3");
294  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1 %L2 %L3");
295  }
296 
299  {
300  static constexpr CMeasurementUnit::Data deg(
301  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree, minute")), constQLatin1("MinDec"),
303  return deg;
304  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1 %L2");
305  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1 %L2");
306  }
307 
309  static const QList<CAngleUnit> &allUnits()
310  {
311  static const QList<CAngleUnit> u { CAngleUnit::nullUnit(), CAngleUnit::deg(), CAngleUnit::rad(),
313  return u;
314  }
315 
317  void unmarshallFromDbus(const QDBusArgument &argument)
318  {
319  QString unitName;
320  argument >> unitName;
321  (*this) = CMeasurementUnit::unitFromSymbol<CAngleUnit>(unitName);
322  }
323 
325  void unmarshalFromDataStream(QDataStream &stream)
326  {
327  QString unitName;
328  stream >> unitName;
329  *this = CMeasurementUnit::unitFromSymbol<CAngleUnit>(unitName);
330  }
331  };
332 
335  public CMeasurementUnit,
336  public mixin::MetaType<CFrequencyUnit>,
337  public mixin::DBusOperators<CFrequencyUnit>,
338  public mixin::DataStreamOperators<CFrequencyUnit>,
339  public mixin::Index<CFrequencyUnit>
340  {
341  private:
343 
344  using HertzToHertz = One;
345 
346  virtual void anchor();
347 
348  public:
351 
353 
354 
355  CFrequencyUnit() : CMeasurementUnit(defaultUnit()) {}
356 
358  CFrequencyUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
359 
361  static CFrequencyUnit defaultUnit() { return Hz(); }
362 
365  {
366  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
367  return nu;
368  }
369 
372  {
373  static constexpr CMeasurementUnit::Data Hz(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hertz")),
374  constQLatin1("Hz"), IdentityConverter());
375  return Hz;
376  }
377 
380  {
381  static constexpr CMeasurementUnit::Data kHz(
382  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilohertz")), constQLatin1("kHz"),
384  return kHz;
385  }
386 
389  {
390  static constexpr CMeasurementUnit::Data MHz(
391  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "megahertz")), constQLatin1("MHz"),
393  return MHz;
394  }
395 
398  {
399  static constexpr CMeasurementUnit::Data GHz(
400  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "gigahertz")), constQLatin1("GHz"),
402  return GHz;
403  }
404 
406  static const QList<CFrequencyUnit> &allUnits()
407  {
408  static const QList<CFrequencyUnit> u { CFrequencyUnit::nullUnit(), CFrequencyUnit::GHz(),
410  return u;
411  }
412 
414  void unmarshallFromDbus(const QDBusArgument &argument)
415  {
416  QString unitName;
417  argument >> unitName;
418  (*this) = CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unitName);
419  }
420 
422  void unmarshalFromDataStream(QDataStream &stream)
423  {
424  QString unitName;
425  stream >> unitName;
426  *this = CMeasurementUnit::unitFromSymbol<CFrequencyUnit>(unitName);
427  }
428  };
429 
432  public CMeasurementUnit,
433  public mixin::MetaType<CMassUnit>,
434  public mixin::DBusOperators<CMassUnit>,
435  public mixin::DataStreamOperators<CMassUnit>,
436  public mixin::Index<CMassUnit>
437  {
438  private:
440 
442  struct PoundsToKilograms
443  {
444  static double factor() { return 0.45359237; }
445  };
446 
447  virtual void anchor();
448 
449  public:
452 
454 
455 
456  CMassUnit() : CMeasurementUnit(defaultUnit()) {}
457 
459  CMassUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
460 
462  static CMassUnit defaultUnit() { return kg(); }
463 
466  {
467  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
468  return nu;
469  }
470 
472  static CMassUnit kg()
473  {
474  static constexpr CMeasurementUnit::Data kg(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilogram")),
475  constQLatin1("kg"), IdentityConverter(), 1);
476  return kg;
477  }
478 
480  static CMassUnit g()
481  {
482  static constexpr CMeasurementUnit::Data g(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "gram")),
483  constQLatin1("g"), LinearConverter<GramsToKilograms>(), 0);
484  return g;
485  }
486 
488  static CMassUnit tonne()
489  {
490  static constexpr CMeasurementUnit::Data t(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "tonne")),
491  constQLatin1("t"), LinearConverter<Mega<GramsToKilograms>>(), 3);
492  return t;
493  }
494 
497  {
498  static constexpr CMeasurementUnit::Data ton(
499  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "short ton")), constQLatin1("ton"),
501  return ton;
502  }
503 
505  static CMassUnit lb()
506  {
507  static constexpr CMeasurementUnit::Data lbs(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "pound")),
508  constQLatin1("lb"), LinearConverter<PoundsToKilograms>(), 1);
509  return lbs;
510  }
511 
513  static const QList<CMassUnit> &allUnits()
514  {
515  static const QList<CMassUnit> u { CMassUnit::nullUnit(), CMassUnit::g(), CMassUnit::kg(),
517  return u;
518  }
519 
521  void unmarshallFromDbus(const QDBusArgument &argument)
522  {
523  QString unitName;
524  argument >> unitName;
525  (*this) = CMeasurementUnit::unitFromSymbol<CMassUnit>(unitName);
526  }
527 
529  void unmarshalFromDataStream(QDataStream &stream)
530  {
531  QString unitName;
532  stream >> unitName;
533  *this = CMeasurementUnit::unitFromSymbol<CMassUnit>(unitName);
534  }
535  };
536 
539  public CMeasurementUnit,
540  public mixin::MetaType<CPressureUnit>,
541  public mixin::DBusOperators<CPressureUnit>,
542  public mixin::DataStreamOperators<CPressureUnit>,
543  public mixin::Index<CPressureUnit>
544  {
545  private:
547 
549  struct PsiToHectopascals
550  {
551  static double factor() { return 68.948; }
552  };
553  struct InchesToHectopascals
554  {
555  static double factor() { return 33.86389; }
556  };
557  struct MillimetersToHectopascals
558  {
559  static double factor() { return 860.142806; }
560  };
561 
562  virtual void anchor();
563 
564  public:
567 
569 
570 
571  CPressureUnit() : CMeasurementUnit(defaultUnit()) {}
572 
574  CPressureUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
575 
577  static CPressureUnit defaultUnit() { return hPa(); }
578 
581  {
582  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
583  return nu;
584  }
585 
587  static CPressureUnit Pa()
588  {
589  static constexpr CMeasurementUnit::Data Pa(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "pascal")),
590  constQLatin1("Pa"), LinearConverter<PascalsToHectopascals>());
591  return Pa;
592  }
593 
596  {
597  static constexpr CMeasurementUnit::Data hPa(
598  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hectopascal")), constQLatin1("hPa"),
600  return hPa;
601  }
602 
605  {
606  static constexpr CMeasurementUnit::Data psi(
607  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "pound per square inch")), constQLatin1("psi"),
609  return psi;
610  }
611 
614  {
615  static constexpr CMeasurementUnit::Data bar(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "bar")),
616  constQLatin1("bar"), LinearConverter<Kilo<One>>(), 1);
617  return bar;
618  }
619 
622  {
623  static constexpr CMeasurementUnit::Data mbar(
624  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "millibar")), constQLatin1("mbar"),
625  IdentityConverter(), 1);
626  return mbar;
627  }
628 
631  {
632  static constexpr CMeasurementUnit::Data inHg(
633  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "inch of mercury")), constQLatin1("inHg"),
635  return inHg;
636  }
637 
640  {
641  static constexpr CMeasurementUnit::Data mmhg(
642  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "millimeter of mercury")), constQLatin1("mmHg"),
644  return mmhg;
645  }
646 
648  static const QList<CPressureUnit> &allUnits()
649  {
650  static const QList<CPressureUnit> u { CPressureUnit::nullUnit(), CPressureUnit::bar(),
653  CPressureUnit::psi() };
654  return u;
655  }
656 
658  void unmarshallFromDbus(const QDBusArgument &argument)
659  {
660  QString unitName;
661  argument >> unitName;
662  (*this) = CMeasurementUnit::unitFromSymbol<CPressureUnit>(unitName);
663  }
664 
666  void unmarshalFromDataStream(QDataStream &stream)
667  {
668  QString unitName;
669  stream >> unitName;
670  *this = CMeasurementUnit::unitFromSymbol<CPressureUnit>(unitName);
671  }
672  };
673 
676  public CMeasurementUnit,
677  public mixin::MetaType<CTemperatureUnit>,
678  public mixin::DBusOperators<CTemperatureUnit>,
679  public mixin::DataStreamOperators<CTemperatureUnit>,
680  public mixin::Index<CTemperatureUnit>
681  {
682  private:
684 
685  struct KelvinToCentigrade
686  {
687  static double factor() { return 1.0; }
688  static double offset() { return 273.15; }
689  };
690  struct FahrenheitToCentigrade
691  {
692  static double factor() { return 5.0 / 9.0; }
693  static double offset() { return 32.0; }
694  };
695 
696  virtual void anchor();
697 
698  public:
701 
703 
704 
705  CTemperatureUnit() : CMeasurementUnit(defaultUnit()) {}
706 
708  CTemperatureUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
709 
711  static CTemperatureUnit defaultUnit() { return C(); }
712 
715  {
716  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
717  return nu;
718  }
719 
722  {
723  static constexpr CMeasurementUnit::Data K(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "Kelvin")),
724  constQLatin1("K"), AffineConverter<KelvinToCentigrade>());
725  return K;
726  }
727 
730  {
731  static constexpr CMeasurementUnit::Data C(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "centigrade")),
732  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "C")),
734  return C;
735  }
736 
739  {
740  static constexpr CMeasurementUnit::Data F(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "Fahrenheit")),
741  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "F")),
743  return F;
744  }
745 
747  static const QList<CTemperatureUnit> &allUnits()
748  {
749  static const QList<CTemperatureUnit> u { CTemperatureUnit::nullUnit(), CTemperatureUnit::C(),
751  return u;
752  }
753 
755  void unmarshallFromDbus(const QDBusArgument &argument)
756  {
757  QString unitName;
758  argument >> unitName;
759  (*this) = CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unitName);
760  }
761 
763  void unmarshalFromDataStream(QDataStream &stream)
764  {
765  QString unitName;
766  stream >> unitName;
767  *this = CMeasurementUnit::unitFromSymbol<CTemperatureUnit>(unitName);
768  }
769  };
770 
773  public CMeasurementUnit,
774  public mixin::MetaType<CSpeedUnit>,
775  public mixin::DBusOperators<CSpeedUnit>,
776  public mixin::DataStreamOperators<CSpeedUnit>,
777  public mixin::Index<CSpeedUnit>
778  {
779  private:
781 
782  struct KnotsToMps
783  {
784  static double factor() { return 1852.0 / 3600.0; }
785  };
786  struct KphToMps
787  {
788  static double factor() { return 1.0 / 3.6; }
789  };
790  struct FtPerSecToMps
791  {
792  static double factor() { return 0.3048; }
793  };
794  struct FtPerMinToMps
795  {
796  static double factor() { return 0.3048 / 60.0; }
797  };
798 
799  virtual void anchor();
800 
801  public:
804 
806 
807 
808  CSpeedUnit() : CMeasurementUnit(defaultUnit()) {}
809 
811  CSpeedUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
812 
814  static CSpeedUnit defaultUnit() { return m_s(); }
815 
818  {
819  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
820  return nu;
821  }
822 
824  static CSpeedUnit m_s()
825  {
826  static constexpr CMeasurementUnit::Data ms(
827  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter per second")), constQLatin1("m/s"),
829  return ms;
830  }
831 
833  static CSpeedUnit kts()
834  {
835  static constexpr CMeasurementUnit::Data kts(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "knot")),
836  constQLatin1("kts"), LinearConverter<KnotsToMps>(), 1);
837  return kts;
838  }
839 
841  static CSpeedUnit NM_h()
842  {
843  static constexpr CMeasurementUnit::Data NMh(
844  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "nautical mile per hour")), constQLatin1("NM/h"),
846  return NMh;
847  }
848 
850  static CSpeedUnit ft_s()
851  {
852  static constexpr CMeasurementUnit::Data fts(
853  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per second")), constQLatin1("ft/s"),
855  return fts;
856  }
857 
860  {
861  static constexpr CMeasurementUnit::Data ftmin(
862  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per minute")), constQLatin1("ft/min"),
864  return ftmin;
865  }
866 
868  static CSpeedUnit km_h()
869  {
870  static constexpr CMeasurementUnit::Data kmh(
871  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilometer per hour")), constQLatin1("km/h"),
873  return kmh;
874  }
875 
877  static const QList<CSpeedUnit> &allUnits()
878  {
879  static const QList<CSpeedUnit> u { CSpeedUnit::nullUnit(), CSpeedUnit::ft_min(), CSpeedUnit::ft_s(),
881  CSpeedUnit::NM_h() };
882  return u;
883  }
884 
886  void unmarshallFromDbus(const QDBusArgument &argument)
887  {
888  QString unitName;
889  argument >> unitName;
890  (*this) = CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unitName);
891  }
892 
894  void unmarshalFromDataStream(QDataStream &stream)
895  {
896  QString unitName;
897  stream >> unitName;
898  *this = CMeasurementUnit::unitFromSymbol<CSpeedUnit>(unitName);
899  }
900  };
901 
904  public CMeasurementUnit,
905  public mixin::MetaType<CTimeUnit>,
906  public mixin::DBusOperators<CTimeUnit>,
907  public mixin::DataStreamOperators<CTimeUnit>,
908  public mixin::Index<CTimeUnit>
909  {
910  private:
912 
913  using SecondsToSeconds = One;
914  struct DaysToSeconds
915  {
916  static double factor() { return 60.0 * 60.0 * 24.0; }
917  };
918  struct HoursToSeconds
919  {
920  static double factor() { return 60.0 * 60.0; }
921  };
922  struct MinutesToSeconds
923  {
924  static double factor() { return 60.0; }
925  };
926 
927  public:
930 
932 
933 
934  CTimeUnit() : CMeasurementUnit(defaultUnit()) {}
935 
937  CTimeUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
938 
940  static CTimeUnit defaultUnit() { return s(); }
941 
944  {
945  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
946  return nu;
947  }
948 
950  virtual QString makeRoundedQStringWithUnit(double value, int digits = -1, bool withGroupSeparator = false,
951  bool i18n = false) const override;
952 
954  static CTimeUnit s()
955  {
956  static constexpr CMeasurementUnit::Data s(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "second")),
957  constQLatin1("s"), IdentityConverter(), 1);
958  return s;
959  }
960 
962  static CTimeUnit ms()
963  {
964  static constexpr CMeasurementUnit::Data ms(
965  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "millisecond")), constQLatin1("ms"),
967  return ms;
968  }
969 
971  static CTimeUnit h()
972  {
973  static constexpr CMeasurementUnit::Data h(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour")),
974  constQLatin1("h"), LinearConverter<HoursToSeconds>(), 1);
975  return h;
976  }
977 
979  static CTimeUnit min()
980  {
981  static constexpr CMeasurementUnit::Data minute(
982  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "minute")), constQLatin1("min"),
984  return minute;
985  }
986 
988  static CTimeUnit d()
989  {
990  static constexpr CMeasurementUnit::Data day(constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "day")),
991  constQLatin1("d"), LinearConverter<DaysToSeconds>(), 1);
992  return day;
993  }
994 
996  static CTimeUnit hms()
997  {
998  static constexpr CMeasurementUnit::Data hms(
999  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour, minute, second")), constQLatin1("hms"),
1000  SubdivisionConverter2<HoursToSeconds, InEachHundred<60>>(), 4);
1001  return hms;
1002  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1h%L2m%L3s");
1003  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%-L1h%L2m%L3s");
1004  }
1005 
1007  static CTimeUnit hrmin()
1008  {
1009  static constexpr CMeasurementUnit::Data hrmin(
1010  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour, minute")), constQLatin1("hm"),
1011  SubdivisionConverter<HoursToSeconds, InEachHundred<60>>(), 3);
1012  return hrmin;
1013  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1h%L2m");
1014  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1h%L2m");
1015  }
1016 
1019  {
1020  static constexpr CMeasurementUnit::Data minsec(
1021  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "minute, second")), constQLatin1("minsec"),
1022  SubdivisionConverter<MinutesToSeconds, InEachHundred<60>>(), 2);
1023  return minsec;
1024  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1m%L2s");
1025  (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1m%L2s");
1026  }
1027 
1029  static const QList<CTimeUnit> &allUnits()
1030  {
1031  static const QList<CTimeUnit> u { CTimeUnit::nullUnit(), CTimeUnit::d(), CTimeUnit::h(),
1033  CTimeUnit::ms(), CTimeUnit::s() };
1034  return u;
1035  }
1036 
1038  void unmarshallFromDbus(const QDBusArgument &argument)
1039  {
1040  QString unitName;
1041  argument >> unitName;
1042  (*this) = CMeasurementUnit::unitFromSymbol<CTimeUnit>(unitName);
1043  }
1044 
1046  void unmarshalFromDataStream(QDataStream &stream)
1047  {
1048  QString unitName;
1049  stream >> unitName;
1050  *this = CMeasurementUnit::unitFromSymbol<CTimeUnit>(unitName);
1051  }
1052  };
1053 
1056  public CMeasurementUnit,
1057  public mixin::MetaType<CAccelerationUnit>,
1058  public mixin::DBusOperators<CAccelerationUnit>,
1059  public mixin::DataStreamOperators<CAccelerationUnit>,
1060  public mixin::Index<CAccelerationUnit>
1061  {
1062  private:
1064 
1065  struct FeetToMeters
1066  {
1067  static double factor() { return 0.3048; }
1068  };
1069 
1070  virtual void anchor();
1071 
1072  public:
1075 
1077 
1078 
1079  CAccelerationUnit() : CMeasurementUnit(defaultUnit()) {}
1080 
1082  CAccelerationUnit(std::nullptr_t) : CMeasurementUnit(nullUnit()) {}
1083 
1085  static CAccelerationUnit defaultUnit() { return m_s2(); }
1086 
1089  {
1090  static constexpr CMeasurementUnit::Data nu(constQLatin1("null"), constQLatin1("null"));
1091  return nu;
1092  }
1093 
1096  {
1097  static constexpr CMeasurementUnit::Data ms2(
1098  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter per second per second")),
1099  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "m/s^2")), IdentityConverter(), 1);
1100  return ms2;
1101  }
1102 
1105  {
1106  static constexpr CMeasurementUnit::Data fts2(
1107  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per second per second")),
1108  constQLatin1(QT_TRANSLATE_NOOP("CMeasurementUnit", "ft/s^2")), LinearConverter<FeetToMeters>(), 0);
1109  return fts2;
1110  }
1111 
1113  static const QList<CAccelerationUnit> &allUnits()
1114  {
1115  static const QList<CAccelerationUnit> u { CAccelerationUnit::nullUnit(), CAccelerationUnit::ft_s2(),
1117  return u;
1118  }
1119 
1121  void unmarshallFromDbus(const QDBusArgument &argument)
1122  {
1123  QString unitName;
1124  argument >> unitName;
1125  (*this) = CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unitName);
1126  }
1127 
1129  void unmarshalFromDataStream(QDataStream &stream)
1130  {
1131  QString unitName;
1132  stream >> unitName;
1133  *this = CMeasurementUnit::unitFromSymbol<CAccelerationUnit>(unitName);
1134  }
1135  };
1136 
1137 } // namespace swift::misc::physical_quantities
1138 
1148 
1149 #pragma pop_macro("min")
1150 
1151 #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:29
Specialized class for acceleration units (m/s2, ft/s2).
Definition: units.h:1061
static CAccelerationUnit defaultUnit()
Default unit.
Definition: units.h:1085
static CAccelerationUnit ft_s2()
Feet/second^2.
Definition: units.h:1104
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:1121
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:1129
static CAccelerationUnit nullUnit()
Null unit.
Definition: units.h:1088
CAccelerationUnit(std::nullptr_t)
Null constructor.
Definition: units.h:1082
static CAccelerationUnit m_s2()
Meter/second^2 (m/s^2)
Definition: units.h:1095
static const QList< CAccelerationUnit > & allUnits()
All units.
Definition: units.h:1113
Specialized class for angles (degrees, radian).
Definition: units.h:233
static CAngleUnit sexagesimalDegMin()
Sexagesimal degree (degrees, minutes, decimal minutes)
Definition: units.h:298
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:317
static CAngleUnit rad()
Radians.
Definition: units.h:270
static CAngleUnit nullUnit()
Null unit.
Definition: units.h:259
static const QList< CAngleUnit > & allUnits()
All units.
Definition: units.h:309
static CAngleUnit deg()
Degrees.
Definition: units.h:278
static CAngleUnit sexagesimalDeg()
Sexagesimal degree (degrees, minutes, seconds, decimal seconds)
Definition: units.h:287
static CAngleUnit defaultUnit()
Default unit.
Definition: units.h:256
CAngleUnit(std::nullptr_t)
Null constructor.
Definition: units.h:253
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:325
Specialized class for frequency (hertz, mega hertz, kilo hertz).
Definition: units.h:340
static CFrequencyUnit Hz()
Hertz.
Definition: units.h:371
static CFrequencyUnit nullUnit()
Null unit.
Definition: units.h:364
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:414
static CFrequencyUnit MHz()
Megahertz.
Definition: units.h:388
static const QList< CFrequencyUnit > & allUnits()
All units.
Definition: units.h:406
CFrequencyUnit(std::nullptr_t)
Null constructor.
Definition: units.h:358
static CFrequencyUnit defaultUnit()
Default unit.
Definition: units.h:361
static CFrequencyUnit kHz()
Kilohertz.
Definition: units.h:379
static CFrequencyUnit GHz()
Gigahertz.
Definition: units.h:397
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:422
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:218
static CLengthUnit km()
Kilometer km.
Definition: units.h:167
static CLengthUnit nullUnit()
Null unit.
Definition: units.h:135
static const QList< CLengthUnit > & allUnits()
All units.
Definition: units.h:201
static CLengthUnit m()
Meter m.
Definition: units.h:142
static CLengthUnit SM()
Statute mile.
Definition: units.h:192
static CLengthUnit NM()
Nautical miles NM.
Definition: units.h:150
static CLengthUnit ft()
Foot ft.
Definition: units.h:159
CLengthUnit(std::nullptr_t)
Null constructor.
Definition: units.h:129
static CLengthUnit mi()
International mile.
Definition: units.h:184
static CLengthUnit defaultUnit()
Default unit.
Definition: units.h:132
static CLengthUnit cm()
Centimeter cm.
Definition: units.h:175
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:210
Specialized class for mass units (kg, lbs).
Definition: units.h:437
static const QList< CMassUnit > & allUnits()
All units.
Definition: units.h:513
CMassUnit(std::nullptr_t)
Null constructor.
Definition: units.h:459
static CMassUnit tonne()
Tonne, aka metric ton (1000kg)
Definition: units.h:488
static CMassUnit defaultUnit()
Default unit.
Definition: units.h:462
static CMassUnit shortTon()
Short ton (2000lb) used in the United States.
Definition: units.h:496
static CMassUnit g()
Gram, SI unit.
Definition: units.h:480
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:529
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:521
static CMassUnit nullUnit()
Null unit.
Definition: units.h:465
static CMassUnit lb()
Pound, aka mass pound.
Definition: units.h:505
static CMassUnit kg()
Kilogram, SI base unit.
Definition: units.h:472
Base class for all units, such as meter, hertz.
Specialized class for pressure (psi, hPa, bar).
Definition: units.h:544
static CPressureUnit nullUnit()
Null unit.
Definition: units.h:580
static CPressureUnit bar()
Bar.
Definition: units.h:613
CPressureUnit(std::nullptr_t)
Null constructor.
Definition: units.h:574
static CPressureUnit mbar()
Millibar, actually the same as hPa.
Definition: units.h:621
static CPressureUnit mmHg()
Millimeter of mercury.
Definition: units.h:639
static CPressureUnit Pa()
Pascal.
Definition: units.h:587
static CPressureUnit inHg()
Inch of mercury at 0°C.
Definition: units.h:630
static const QList< CPressureUnit > & allUnits()
All units.
Definition: units.h:648
static CPressureUnit psi()
Pounds per square inch.
Definition: units.h:604
static CPressureUnit defaultUnit()
Default unit.
Definition: units.h:577
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:666
static CPressureUnit hPa()
Hectopascal.
Definition: units.h:595
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:658
Specialized class for speed units (m/s, ft/s, NM/h).
Definition: units.h:778
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:886
static CSpeedUnit NM_h()
Nautical miles per hour NM/h (same as kts)
Definition: units.h:841
static const QList< CSpeedUnit > & allUnits()
All units.
Definition: units.h:877
static CSpeedUnit ft_s()
Feet/second ft/s.
Definition: units.h:850
static CSpeedUnit ft_min()
Feet/min ft/min.
Definition: units.h:859
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:894
static CSpeedUnit km_h()
Kilometer/hour km/h.
Definition: units.h:868
CSpeedUnit(std::nullptr_t)
Null constructor.
Definition: units.h:811
static CSpeedUnit m_s()
Meter/second m/s.
Definition: units.h:824
static CSpeedUnit kts()
Knots.
Definition: units.h:833
static CSpeedUnit defaultUnit()
Default unit.
Definition: units.h:814
static CSpeedUnit nullUnit()
Null unit.
Definition: units.h:817
Specialized class for temperatur units (kelvin, centidegree).
Definition: units.h:681
static const QList< CTemperatureUnit > & allUnits()
All units.
Definition: units.h:747
static CTemperatureUnit defaultUnit()
Default unit.
Definition: units.h:711
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:755
static CTemperatureUnit nullUnit()
Null unit.
Definition: units.h:714
static CTemperatureUnit C()
Centigrade C.
Definition: units.h:729
static CTemperatureUnit K()
Kelvin.
Definition: units.h:721
CTemperatureUnit(std::nullptr_t)
Null constructor.
Definition: units.h:708
static CTemperatureUnit F()
Fahrenheit F.
Definition: units.h:738
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:763
Specialized class for time units (ms, hour, min).
Definition: units.h:909
static CTimeUnit min()
Minute.
Definition: units.h:979
void unmarshalFromDataStream(QDataStream &stream)
Unmarshal a value from a QDataStream.
Definition: units.h:1046
static CTimeUnit nullUnit()
Null unit.
Definition: units.h:943
static CTimeUnit defaultUnit()
Default unit.
Definition: units.h:940
static CTimeUnit hrmin()
Hours, minutes.
Definition: units.h:1007
CTimeUnit(std::nullptr_t)
Null constructor.
Definition: units.h:937
void unmarshallFromDbus(const QDBusArgument &argument)
Unmarshall without begin/endStructure, for when composed within another object.
Definition: units.h:1038
static CTimeUnit hms()
Hours, minutes, seconds.
Definition: units.h:996
static CTimeUnit s()
Second s.
Definition: units.h:954
static CTimeUnit minsec()
Minutes, seconds.
Definition: units.h:1018
static const QList< CTimeUnit > & allUnits()
All units.
Definition: units.h:1029
static CTimeUnit ms()
Millisecond ms.
Definition: units.h:962
#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