diff --git a/samples/blackmiscquantities/samplesphysicalquantities.cpp b/samples/blackmiscquantities/samplesphysicalquantities.cpp index bc9c87344..6c24add7f 100644 --- a/samples/blackmiscquantities/samplesphysicalquantities.cpp +++ b/samples/blackmiscquantities/samplesphysicalquantities.cpp @@ -15,15 +15,9 @@ namespace BlackMiscTest */ int CSamplesPhysicalQuantities::samples() { - // cases which must not work - // CMeasurementUnit mu; //must not work // CLengthUnit du1(CAngleUnit::rad()); - CMeasurementPrefix pf1 = CMeasurementPrefix::h(); - CMeasurementPrefix pf2 = CMeasurementPrefix::M(); - qDebug() << pf1 << pf2 << (1.0 * pf1.toDouble()); - CLengthUnit lu1(CLengthUnit::cm()); CLengthUnit lu2(CLengthUnit::ft()); QString lu1s = lu1.toQString(true); diff --git a/src/blackmisc/pqbase.cpp b/src/blackmisc/pqbase.cpp index f7e9f47f0..9ef5efc27 100644 --- a/src/blackmisc/pqbase.cpp +++ b/src/blackmisc/pqbase.cpp @@ -13,71 +13,10 @@ namespace BlackMisc namespace PhysicalQuantities { -// ----------------------------------------------------------------------- -// --- Prefix ------------------------------------------------------------ -// ----------------------------------------------------------------------- - -/* - * Equal? - */ -bool CMeasurementPrefix::operator ==(const CMeasurementPrefix &other) const -{ - if (this == &other) return true; - return this->m_factor == other.m_factor && this->m_name == other.m_name; -} - -/* - * Not equal - */ -bool CMeasurementPrefix::operator !=(const CMeasurementPrefix &other) const -{ - return !(*this == other); -} - // ----------------------------------------------------------------------- // --- Measurement unit -------------------------------------------------- // ----------------------------------------------------------------------- -/* - * Constructor - */ -CMeasurementUnit::CMeasurementUnit(const QString &name, const QString &symbol, double factor, int displayDigits, double epsilon) : - m_name(name), m_symbol(symbol), m_epsilon(epsilon), m_displayDigits(displayDigits), m_converter(new LinearConverter(factor)) -{ -} - -/* - * Constructor - */ -CMeasurementUnit::CMeasurementUnit(const QString &name, const QString &symbol, double factor, double offset, int displayDigits, double epsilon) : - m_name(name), m_symbol(symbol), m_epsilon(epsilon), m_displayDigits(displayDigits), m_converter(new AffineConverter(factor, offset)) -{ -} - -/* - * Constructor - */ -CMeasurementUnit::CMeasurementUnit(const QString &name, const QString &symbol, Converter *converter, int displayDigits, double epsilon) : - m_name(name), m_symbol(symbol), m_epsilon(epsilon), m_displayDigits(displayDigits), m_converter(converter) -{ -} - -/* - * Constructor - */ -CMeasurementUnit::CMeasurementUnit(const QString &name, const QString &symbol, const CMeasurementUnit &base, const CMeasurementPrefix &prefix, int displayDigits, double epsilon) : - m_name(name), m_symbol(symbol), m_epsilon(epsilon), m_displayDigits(displayDigits), m_converter(base.m_converter->clone(prefix)) -{ -} - -/* - * Copy constructor - */ -CMeasurementUnit::CMeasurementUnit(const CMeasurementUnit &other) : - m_name(other.m_name), m_symbol(other.m_symbol), m_epsilon(other.m_epsilon), m_displayDigits(other.m_displayDigits), m_converter(other.m_converter) -{ -} - /* * Equal operator */ diff --git a/src/blackmisc/pqbase.h b/src/blackmisc/pqbase.h index e450f90c1..e8aad0de2 100644 --- a/src/blackmisc/pqbase.h +++ b/src/blackmisc/pqbase.h @@ -22,232 +22,6 @@ namespace BlackMisc namespace PhysicalQuantities { -/*! - * \brief Typical prefixes (multipliers) such as kilo, mega, hecto. - * See here for an overview. - * Use the static values such as CMeasurementPrefix::k() to specify values. - */ -class CMeasurementPrefix : public CStreamable -{ -private: - QString m_name; //!< name, e.g. "kilo" - QString m_symbol; //!< prefix, e.g. "k" for kilo - double m_factor; //!< factor, e.g. 1000 for kilo 1/100 for centi - - /*! - * Constructor by parameters - * \brief CMeasurementMultiplier - * \param name - * \param prefixName - * \param factor - */ - CMeasurementPrefix(const QString &name, const QString &symbol, double factor) : - m_name(name), m_symbol(symbol), m_factor(factor) {} - -protected: - /*! - * \brief Name as string - * \param i18n - * \return - */ - virtual QString convertToQString(bool /* i18n */ = false) const - { - return this->m_name; - } - - /*! - * \brief Stream to DBus - * \param argument - */ - virtual void marshallToDbus(QDBusArgument &argument) const - { - argument << this->m_name; - } - - /*! - * \brief Stream from DBus - * \param argument - */ - virtual void unmarshallFromDbus(const QDBusArgument &argument) - { - QString name; - argument >> name; - (*this) = CMeasurementPrefix::fromPrefixName(name); - } - -public: - /*! - * \brief Equal operator == - * \param other - * \return - */ - bool operator == (const CMeasurementPrefix &other) const; - - /*! - * \brief Unequal operator != - * \param other - * \return - */ - bool operator != (const CMeasurementPrefix &other) const; - - /*! - * \brief Factor, e.g.1000 for "kilo" - * \return - */ - double getFactor() const - { - return this->m_factor; - } - - /*! - * \brief Factor - * \return - */ - double toDouble() const - { - return this->getFactor(); - } - - /*! - * \brief Name, e.g. "kilo" - * \return - */ - QString getName(bool i18n = false) const - { - return i18n ? QCoreApplication::translate("CMeasurementPrefix", this->m_name.toStdString().c_str()) : this->m_name; - } - - /*! - * \brief Prefix, e.g. "k" for "kilo" - * \return - */ - QString getSymbol(bool i18n = false) const - { - return i18n ? QCoreApplication::translate("CMeasurementPrefix", this->m_symbol.toStdString().c_str()) : this->m_symbol; - } - - // --- static units, always use these for initialization - // --- Remark: Static initialization in C++ is random, this is why no static members - // --- are used - - /*! - * \brief Unit "None" - * \return - */ - static const CMeasurementPrefix &None() - { - static CMeasurementPrefix none("", "", 0.0); - return none; - } - - /*! - * \brief Unit "One" - * \return - */ - static const CMeasurementPrefix &One() - { - static CMeasurementPrefix one(QT_TR_NOOP("one"), "", 1.0); - return one; - } - - /*! - * \brief Unit "mega" - * \return - */ - static const CMeasurementPrefix &M() - { - static CMeasurementPrefix mega(QT_TR_NOOP("mega"), "M", 1E6); - return mega; - } - - /*! - * \brief Unit "kilo" - * \return - */ - static const CMeasurementPrefix &k() - { - static CMeasurementPrefix kilo(QT_TR_NOOP("kilo"), "k", 1000.0); - return kilo; - } - - /*! - * \brief Unit "giga" - * \return - */ - static const CMeasurementPrefix &G() - { - static CMeasurementPrefix giga(QT_TR_NOOP("giga"), "G", 1E9); - return giga; - } - - /*! - * \brief Unit "hecto" - * \return - */ - static const CMeasurementPrefix &h() - { - static CMeasurementPrefix hecto(QT_TR_NOOP("hecto"), "h", 100.0); - return hecto; - } - - /*! - * \brief Unit "centi" - * \return - */ - static const CMeasurementPrefix &c() - { - static CMeasurementPrefix centi(QT_TR_NOOP("centi"), "c", 0.01); - return centi; - } - - /*! - * \brief Unit "milli" - * \return - */ - static const CMeasurementPrefix &m() - { - static CMeasurementPrefix milli(QT_TR_NOOP("milli"), "m", 1E-03); - return milli; - } - - /*! - * \brief All prefixes - * \return - */ - static const QList &prefixes() - { - static QList prefixes; - if (prefixes.isEmpty()) - { - prefixes.append(CMeasurementPrefix::c()); - prefixes.append(CMeasurementPrefix::G()); - prefixes.append(CMeasurementPrefix::h()); - prefixes.append(CMeasurementPrefix::k()); - prefixes.append(CMeasurementPrefix::M()); - prefixes.append(CMeasurementPrefix::m()); - prefixes.append(CMeasurementPrefix::None()); - prefixes.append(CMeasurementPrefix::One()); - } - return prefixes; - } - - /*! - * \brief Prefix from name - * \param prefixName must be valid! - * \return - */ - static const CMeasurementPrefix &fromPrefixName(const QString &prefixName) - { - const QList &prefixes = CMeasurementPrefix::prefixes(); - for (int i = 0; i < prefixes.size(); ++i) { - if (prefixes.at(i).getName() == prefixName) return (prefixes.at(i)); - } - qFatal("Illegal unit name"); - return CMeasurementPrefix::None(); // just suppress "not all control paths return a value" - } - -}; - // --------------------------------------------------------------------------------- // --- Unit // --------------------------------------------------------------------------------- @@ -280,98 +54,117 @@ protected: * \return */ virtual double fromDefault(double factor) const = 0; - /*! - * Make a copy of this object with a different prefix. - * \param prefix - * \return - */ - virtual Converter *clone(const CMeasurementPrefix &prefix) const = 0; + }; + + /*! + * Concrete strategy pattern for converting unit that does nothing. + */ + struct IdentityConverter : public Converter + { + virtual double toDefault(double factor) const { return factor; } + virtual double fromDefault(double factor) const { return factor; } }; /*! * Concrete strategy pattern for converting unit with linear conversion. + * \tparam Policy a policy class with static method factor() returning double */ - class LinearConverter : public Converter + template + struct LinearConverter : public Converter { - double m_factor; - public: - /*! - * Constructor - * \param factor - */ - LinearConverter(double factor) : m_factor(factor) {} - virtual double toDefault(double factor) const { return factor * m_factor; } - virtual double fromDefault(double factor) const { return factor / m_factor; } - virtual Converter *clone(const CMeasurementPrefix &prefix) const { auto ret = new LinearConverter(*this); ret->m_factor *= prefix.getFactor(); return ret; } + virtual double toDefault(double factor) const { return factor * Policy::factor(); } + virtual double fromDefault(double factor) const { return factor / Policy::factor(); } }; /*! - * Concrete strategy pattern for converting unit with affine conversion. + * Concrete strategy pattern for converting unit with offset linear conversion. + * \tparam Policy a policy class with static methods factor() and offset() returning double */ - class AffineConverter : public Converter + template + struct AffineConverter : public Converter { - double m_factor; - double m_offset; - public: - /*! - * Constructor - * \param factor - * \param offset - */ - AffineConverter(double factor, double offset) : m_factor(factor), m_offset(offset) {} - virtual double toDefault(double factor) const { return (factor - m_offset) * m_factor; } - virtual double fromDefault(double factor) const { return factor / m_factor + m_offset; } - virtual Converter *clone(const CMeasurementPrefix &prefix) const { auto ret = new AffineConverter(*this); ret->m_factor *= prefix.getFactor(); return ret; } + virtual double toDefault(double factor) const { return (factor - Policy::offset()) * Policy::factor(); } + virtual double fromDefault(double factor) const { return factor / Policy::factor() + Policy::offset(); } }; /*! - * Concrete strategy pattern for converting unit with subdivision conversion. + * Concrete strategy pattern for converting unit with one subdivision conversion. + * \tparam FactorPolicy a policy class with static method factor() returning double + * \tparam SubdivPolicy a policy class with static methods fraction() and subfactor() returning double */ - template - class SubdivisionConverter : public Converter + template + struct SubdivisionConverter : public Converter { - double m_factor; - public: - /*! - * Constructor - */ - SubdivisionConverter(double factor = 1) : m_factor(factor) {} virtual double toDefault(double factor) const { using BlackMisc::Math::CMath; - double ret = CMath::trunc(factor); factor = CMath::fract(factor) * Den; - ret += factor / Num; - return ret * m_factor; } + double part2 = CMath::fract(factor) * SubdivPolicy::fraction(); + factor = CMath::trunc(factor) + part2 / SubdivPolicy::subfactor(); + return factor * FactorPolicy::factor(); } virtual double fromDefault(double factor) const { using BlackMisc::Math::CMath; - factor /= m_factor; - double ret = CMath::trunc(factor); factor = CMath::fract(factor) * Num; - return ret += factor / Den; } - virtual Converter *clone(const CMeasurementPrefix &) const { qFatal("Not implemented"); return 0; } + factor /= FactorPolicy::factor(); + double part2 = CMath::fract(factor) * SubdivPolicy::subfactor(); + return CMath::trunc(factor) + part2 / SubdivPolicy::fraction(); } }; /*! - * Concrete strategy pattern for converting unit with subdivision conversion. + * Concrete strategy pattern for converting unit with two subdivision conversions. + * \tparam FactorPolicy a policy class with static method factor() returning double + * \tparam SubdivPolicy a policy class with static methods fraction() and subfactor() returning double */ - template - class SubdivisionConverter2 : public Converter + template + struct SubdivisionConverter2 : public Converter { - double m_factor; - public: - /*! - * Constructor - */ - SubdivisionConverter2(double factor = 1) : m_factor(factor) {} virtual double toDefault(double factor) const { using BlackMisc::Math::CMath; - double ret = CMath::trunc(factor); factor = CMath::fract(factor) * Den1; - ret += CMath::trunc(factor) / Num1; factor = CMath::fract(factor) * Den2; - ret += factor / (Num1 * Num2); - return ret * m_factor; } + double part2 = CMath::fract(factor) * SubdivPolicy::fraction(); + double part3 = CMath::fract(part2) * SubdivPolicy::fraction(); + factor = CMath::trunc(factor) + (CMath::trunc(part2) + part3 / SubdivPolicy::subfactor()) / SubdivPolicy::subfactor(); + return factor * FactorPolicy::factor(); } virtual double fromDefault(double factor) const { using BlackMisc::Math::CMath; - factor /= m_factor; - double ret = CMath::trunc(factor); factor = CMath::fract(factor) * Num1; - ret += CMath::trunc(factor) / Den1; factor = CMath::fract(factor) * Num2; - return ret += factor / (Den1 * Den2); } - virtual Converter *clone(const CMeasurementPrefix &) const { qFatal("Not implemented"); return 0; } + factor /= FactorPolicy::factor(); + double part2 = CMath::fract(factor) * SubdivPolicy::subfactor(); + double part3 = CMath::fract(part2) * SubdivPolicy::subfactor(); + return CMath::trunc(factor) + (CMath::trunc(part2) + part3 / SubdivPolicy::fraction()) / SubdivPolicy::fraction(); } }; + //! \{ + //! Metapolicy that can be used to modify template parameters of converters + struct One { + static double factor() { return 1; } //!< factor \return + }; + template + struct Two { + static double factor() { return Policy::factor() * 2.0; } //!< factor \return + }; + template + struct Milli { + static double factor() { return Policy::factor() / 1000.0; } //!< factor \return + }; + template + struct Centi { + static double factor() { return Policy::factor() / 100.0; } //!< factor \return + }; + template + struct Hecto { + static double factor() { return Policy::factor() * 100.0; } //!< factor \return + }; + template + struct Kilo { + static double factor() { return Policy::factor() * 1000.0; } //!< factor \return + }; + template + struct Mega { + static double factor() { return Policy::factor() * 1e+6; } //!< factor \return + }; + template + struct Giga { + static double factor() { return Policy::factor() * 1e+9; } //!< factor \return + }; + template + struct InEachHundred { + static double fraction() { return 100.0f; } //!< fraction \return + static double subfactor() { return float(Subfactor); } //!< subfactor \return + }; + //! \} + private: QString m_name; //!< name, e.g. "meter" QString m_symbol; //!< unit name, e.g. "m" @@ -380,51 +173,25 @@ private: QSharedDataPointer m_converter; //!< strategy pattern allows an arbitrary conversion method as per object protected: - /*! - * Construct a unit with linear conversion - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CMeasurementUnit(const QString &name, const QString &symbol, double factor, int displayDigits, double epsilon); - - /*! - * Construct a unit with affine conversion - * \param name - * \param symbol - * \param factor - * \param offset - * \param displayDigits - * \param epsilon - */ - CMeasurementUnit(const QString &name, const QString &symbol, double factor, double offset, int displayDigits, double epsilon); - /*! * Construct a unit with custom conversion * \param name * \param symbol - * \param converter * \param displayDigits * \param epsilon */ - CMeasurementUnit(const QString &name, const QString &symbol, Converter *converter, int displayDigits, double epsilon); - - /*! - * Construct from base unit and prefix - * \param base - * \param prefix - * \param displayDigits - * \param epsilon - */ - CMeasurementUnit(const QString &name, const QString &symbol, const CMeasurementUnit &base, const CMeasurementPrefix &prefix, int displayDigits = 2, double epsilon = 1E-10); + template + CMeasurementUnit(const QString &name, const QString &symbol, const Converter &, int displayDigits, double epsilon) + : m_name(name), m_symbol(symbol), m_epsilon(epsilon), m_displayDigits(displayDigits), m_converter(new Converter) + {} /*! * \brief Copy constructor * \param other */ - CMeasurementUnit(const CMeasurementUnit &other); + CMeasurementUnit(const CMeasurementUnit &other) + : m_name(other.m_name), m_symbol(other.m_symbol), m_epsilon(other.m_epsilon), m_displayDigits(other.m_displayDigits), m_converter(other.m_converter) + {} /*! * \brief String for streaming operators is full name @@ -588,7 +355,12 @@ public: */ static CMeasurementUnit &None() { - static CMeasurementUnit none("none", "", 0.0, 0, 0); + struct NilConverter : public Converter + { + virtual double toDefault(double) const { return 0.0; } + virtual double fromDefault(double) const { return 0.0; } + }; + static CMeasurementUnit none("none", "", NilConverter(), 0, 0); return none; } }; diff --git a/src/blackmisc/pqunits.h b/src/blackmisc/pqunits.h index 14b7d8f66..1cbdf1e72 100644 --- a/src/blackmisc/pqunits.h +++ b/src/blackmisc/pqunits.h @@ -30,28 +30,16 @@ namespace PhysicalQuantities class CLengthUnit : public CMeasurementUnit { private: - /*! - * \brief Constructor length unit - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CLengthUnit(const QString &name, const QString &symbol, double factor, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, displayDigits, epsilon) {} + template + CLengthUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} - /*! - * \brief Constructor length unit - * \param name - * \param symbol - * \param prefix - * \param base - * \param displayDigits - * \param epsilon - */ - CLengthUnit(const QString &name, const QString &symbol, const CMeasurementPrefix &prefix, const CLengthUnit &base, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, base, prefix, displayDigits, epsilon) {} + struct NauticalMilesToMeters { static double factor() { return 1852.0; } }; + struct FeetToMeters { static double factor() { return 0.3048; } }; + struct MilesToMeters { static double factor() { return 1609.344; } }; + struct StatuteMilesToMeters { static double factor() { return 1609.3472; } }; + typedef One MetersToMeters; public: /*! @@ -59,12 +47,6 @@ public: */ CLengthUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * \brief Copy constructor - * \param other - */ - CLengthUnit(const CLengthUnit &other) : CMeasurementUnit(other) {} - /*! * \brief Default unit * \return @@ -77,7 +59,7 @@ public: */ static const CLengthUnit &m() { - static CLengthUnit m(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter"), "m", 1); + static CLengthUnit m(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter"), "m", IdentityConverter()); return m; } @@ -87,7 +69,7 @@ public: */ static const CLengthUnit &NM() { - static CLengthUnit NM(QT_TRANSLATE_NOOP("CMeasurementUnit", "nautical mile"), "NM", 1000.0 * 1.85200, 3); + static CLengthUnit NM(QT_TRANSLATE_NOOP("CMeasurementUnit", "nautical mile"), "NM", LinearConverter(), 3); return NM; } @@ -97,7 +79,7 @@ public: */ static const CLengthUnit &ft() { - static CLengthUnit ft(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot"), "ft", 0.3048, 0); + static CLengthUnit ft(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot"), "ft", LinearConverter(), 0); return ft; } @@ -107,7 +89,7 @@ public: */ static const CLengthUnit &km() { - static CLengthUnit km(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilometer"), "km", CMeasurementPrefix::k(), m(), 3); + static CLengthUnit km(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilometer"), "km", LinearConverter>(), 3); return km; } @@ -117,7 +99,7 @@ public: */ static const CLengthUnit &cm() { - static CLengthUnit cm(QT_TRANSLATE_NOOP("CMeasurementUnit", "centimeter"), "cm", CMeasurementPrefix::c(), m(), 1); + static CLengthUnit cm(QT_TRANSLATE_NOOP("CMeasurementUnit", "centimeter"), "cm", LinearConverter>(), 1); return cm; } @@ -127,7 +109,7 @@ public: */ static const CLengthUnit &mi() { - static CLengthUnit mi(QT_TRANSLATE_NOOP("CMeasurementUnit", "mile"), "mi", 1609.344, 3); + static CLengthUnit mi(QT_TRANSLATE_NOOP("CMeasurementUnit", "mile"), "mi", LinearConverter(), 3); return mi; } @@ -137,7 +119,7 @@ public: */ static const CLengthUnit &SM() { - static CLengthUnit sm(QT_TRANSLATE_NOOP("CMeasurementUnit", "statute mile"), "SM", 1609.3472, 3); + static CLengthUnit sm(QT_TRANSLATE_NOOP("CMeasurementUnit", "statute mile"), "SM", LinearConverter(), 3); return sm; } @@ -180,27 +162,13 @@ protected: class CAngleUnit : public CMeasurementUnit { private: - /*! - * \brief Constructor angle units: Radian, degree - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CAngleUnit(const QString &name, const QString &symbol, double factor, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, displayDigits, epsilon) {} + template + CAngleUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} - /*! - * \brief Constructor angle units: Sexagesimal - * \param name - * \param symbol - * \param converter - * \param displayDigits - * \param epsilon - */ - CAngleUnit(const QString &name, const QString &symbol, Converter *converter, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) {} + struct RadiansToDegrees { static double factor() { return 180.0 / M_PI; } }; + typedef One DegreesToDegrees; public: /*! @@ -208,12 +176,6 @@ public: */ CAngleUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * \brief Copy constructor - * \param other - */ - CAngleUnit(const CAngleUnit &other) : CMeasurementUnit(other) {} - /*! * \brief Default unit * \return @@ -235,7 +197,7 @@ public: */ static const CAngleUnit &rad() { - static CAngleUnit rad(QT_TRANSLATE_NOOP("CMeasurementUnit", "radian"), "rad", 180.0 / M_PI); + static CAngleUnit rad(QT_TRANSLATE_NOOP("CMeasurementUnit", "radian"), "rad", LinearConverter()); return rad; } @@ -245,7 +207,7 @@ public: */ static const CAngleUnit °() { - static CAngleUnit deg(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree"), QT_TRANSLATE_NOOP("CMeasurementUnit", "deg"), 1); + static CAngleUnit deg(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree"), QT_TRANSLATE_NOOP("CMeasurementUnit", "deg"), IdentityConverter()); return deg; } @@ -255,7 +217,7 @@ public: */ static const CAngleUnit &sexagesimalDeg() { - static CAngleUnit deg(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree, minute, second"), "DMS", new SubdivisionConverter2<60, 100, 60, 100>, 4); + static CAngleUnit deg(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree, minute, second"), "DMS", SubdivisionConverter2>(), 4); return deg; (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1 %L2 %L3"); (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1 %L2 %L3"); @@ -267,7 +229,7 @@ public: */ static const CAngleUnit &sexagesimalDegMin() { - static CAngleUnit deg(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree, minute"), "MinDec", new SubdivisionConverter<60, 100>, 4); + static CAngleUnit deg(QT_TRANSLATE_NOOP("CMeasurementUnit", "degree, minute"), "MinDec", SubdivisionConverter>(), 4); return deg; (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1 %L2"); (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1 %L2"); @@ -309,28 +271,12 @@ protected: class CFrequencyUnit : public CMeasurementUnit { private: - /*! - * Constructor frequency unit - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CFrequencyUnit(const QString &name, const QString &symbol, double factor, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, displayDigits, epsilon) {} + template + CFrequencyUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} - /*! - * Constructor frequency unit - * \param name - * \param symbol - * \param prefix - * \param base - * \param displayDigits - * \param epsilon - */ - CFrequencyUnit(const QString &name, const QString &symbol, const CMeasurementPrefix &prefix, const CFrequencyUnit &base, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, base, prefix, displayDigits, epsilon) {} + typedef One HertzToHertz; public: /*! @@ -338,12 +284,6 @@ public: */ CFrequencyUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * \brief Copy constructor - * \param other - */ - CFrequencyUnit(const CFrequencyUnit &other) : CMeasurementUnit(other) {} - /*! * \brief Default unit * \return @@ -356,7 +296,7 @@ public: */ static const CFrequencyUnit &Hz() { - static CFrequencyUnit Hz(QT_TRANSLATE_NOOP("CMeasurementUnit", "hertz"), "Hz", 1); + static CFrequencyUnit Hz(QT_TRANSLATE_NOOP("CMeasurementUnit", "hertz"), "Hz", IdentityConverter()); return Hz; } @@ -366,7 +306,7 @@ public: */ static const CFrequencyUnit &kHz() { - static CFrequencyUnit kHz(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilohertz"), "kHz", CMeasurementPrefix::k(), Hz(), 1); + static CFrequencyUnit kHz(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilohertz"), "kHz", LinearConverter>(), 1); return kHz; } @@ -376,7 +316,7 @@ public: */ static const CFrequencyUnit &MHz() { - static CFrequencyUnit MHz(QT_TRANSLATE_NOOP("CMeasurementUnit", "megahertz"), "MHz", CMeasurementPrefix::M(), Hz(), 2); + static CFrequencyUnit MHz(QT_TRANSLATE_NOOP("CMeasurementUnit", "megahertz"), "MHz", LinearConverter>(), 2); return MHz; } @@ -386,7 +326,7 @@ public: */ static const CFrequencyUnit &GHz() { - static CFrequencyUnit GHz(QT_TRANSLATE_NOOP("CMeasurementUnit", "gigahertz"), "GHz", CMeasurementPrefix::G(), Hz(), 2); + static CFrequencyUnit GHz(QT_TRANSLATE_NOOP("CMeasurementUnit", "gigahertz"), "GHz", LinearConverter>(), 2); return GHz; } @@ -426,28 +366,13 @@ protected: class CMassUnit : public CMeasurementUnit { private: - /*! - * \brief Constructor mass units - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CMassUnit(const QString &name, const QString &symbol, double factor, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, displayDigits, epsilon) {} + template + CMassUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} - /*! - * \brief Constructor mass units - * \param name - * \param symbol - * \param prefix - * \param base - * \param displayDigits - * \param epsilon - */ - CMassUnit(const QString &name, const QString &symbol, const CMeasurementPrefix &prefix, const CMassUnit &base, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, base, prefix, displayDigits, epsilon) {} + typedef Milli GramsToKilograms; + struct PoundsToKilograms { static double factor() { return 0.45359237; } }; public: /*! @@ -455,12 +380,6 @@ public: */ CMassUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * \brief Copy constructor - * \param other - */ - CMassUnit(const CMassUnit &other) : CMeasurementUnit(other) {} - /*! * \brief Default unit * \return @@ -473,7 +392,7 @@ public: */ static const CMassUnit &kg() { - static CMassUnit kg(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilogram"), "kg", CMeasurementPrefix::k(), g(), 1); + static CMassUnit kg(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilogram"), "kg", IdentityConverter(), 1); return kg; } @@ -483,7 +402,7 @@ public: */ static const CMassUnit &g() { - static CMassUnit g(QT_TRANSLATE_NOOP("CMeasurementUnit", "gram"), "g", 0.001, 0); + static CMassUnit g(QT_TRANSLATE_NOOP("CMeasurementUnit", "gram"), "g", LinearConverter(), 0); return g; } @@ -493,7 +412,7 @@ public: */ static const CMassUnit &tonne() { - static CMassUnit t(QT_TRANSLATE_NOOP("CMeasurementUnit", "tonne"), "t", 1000.0, 3); + static CMassUnit t(QT_TRANSLATE_NOOP("CMeasurementUnit", "tonne"), "t", LinearConverter>(), 3); return t; } @@ -503,7 +422,7 @@ public: */ static const CMassUnit &shortTon() { - static CMassUnit ton(QT_TRANSLATE_NOOP("CMeasurementUnit", "short ton"), "ton", 907.18474, 3); + static CMassUnit ton(QT_TRANSLATE_NOOP("CMeasurementUnit", "short ton"), "ton", LinearConverter>>(), 3); return ton; } @@ -513,7 +432,7 @@ public: */ static const CMassUnit &lb() { - static CMassUnit lbs(QT_TRANSLATE_NOOP("CMeasurementUnit", "pound"), "lb", 0.45359237, 1); + static CMassUnit lbs(QT_TRANSLATE_NOOP("CMeasurementUnit", "pound"), "lb", LinearConverter(), 1); return lbs; } @@ -554,28 +473,15 @@ protected: class CPressureUnit : public CMeasurementUnit { private: - /*! - * \brief Pressure unit constructor - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CPressureUnit(const QString &name, const QString &symbol, double factor, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, displayDigits, epsilon) {} + template + CPressureUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} - /*! - * \brief Pressure unit constructor - * \param name - * \param symbol - * \param prefix - * \param base - * \param displayDigits - * \param epsilon - */ - CPressureUnit(const QString &name, const QString &symbol, const CMeasurementPrefix &prefix, const CPressureUnit &base, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, base, prefix, displayDigits, epsilon) {} + typedef Centi PascalsToHectopascals; + struct PsiToHectopascals { static double factor() { return 68.948; } }; + struct InchesToHectopascals { static double factor() { return 33.86389; } }; + struct MillimetersToHectopascals { static double factor() { return 860.142806; } }; public: /*! @@ -583,12 +489,6 @@ public: */ CPressureUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * \brief Copy constructor - * \param other - */ - CPressureUnit(const CPressureUnit &other) : CMeasurementUnit(other) {} - /*! * \brief Default unit * \return @@ -601,7 +501,7 @@ public: */ static const CPressureUnit &Pa() { - static CPressureUnit Pa(QT_TRANSLATE_NOOP("CMeasurementUnit", "pascal"), "Pa", 0.01); + static CPressureUnit Pa(QT_TRANSLATE_NOOP("CMeasurementUnit", "pascal"), "Pa", LinearConverter()); return Pa; } @@ -611,7 +511,7 @@ public: */ static const CPressureUnit &hPa() { - static CPressureUnit hPa(QT_TRANSLATE_NOOP("CMeasurementUnit", "hectopascal"), "hPa", CMeasurementPrefix::h(), Pa()); + static CPressureUnit hPa(QT_TRANSLATE_NOOP("CMeasurementUnit", "hectopascal"), "hPa", IdentityConverter()); return hPa; } @@ -621,7 +521,7 @@ public: */ static const CPressureUnit &psi() { - static CPressureUnit psi(QT_TRANSLATE_NOOP("CMeasurementUnit", "pound per square inch"), "psi", 68.948, 2); + static CPressureUnit psi(QT_TRANSLATE_NOOP("CMeasurementUnit", "pound per square inch"), "psi", LinearConverter(), 2); return psi; } @@ -631,7 +531,7 @@ public: */ static const CPressureUnit &bar() { - static CPressureUnit bar(QT_TRANSLATE_NOOP("CMeasurementUnit", "bar"), "bar", 1000, 1); + static CPressureUnit bar(QT_TRANSLATE_NOOP("CMeasurementUnit", "bar"), "bar", LinearConverter>(), 1); return bar; } @@ -641,7 +541,7 @@ public: */ static const CPressureUnit &mbar() { - static CPressureUnit mbar(QT_TRANSLATE_NOOP("CMeasurementUnit", "millibar"), "mbar", CMeasurementPrefix::m(), bar(), 1); + static CPressureUnit mbar(QT_TRANSLATE_NOOP("CMeasurementUnit", "millibar"), "mbar", IdentityConverter(), 1); return mbar; } @@ -651,7 +551,7 @@ public: */ static const CPressureUnit &inHg() { - static CPressureUnit inhg(QT_TRANSLATE_NOOP("CMeasurementUnit", "inch of mercury"), "inHg", 33.86389); + static CPressureUnit inhg(QT_TRANSLATE_NOOP("CMeasurementUnit", "inch of mercury"), "inHg", LinearConverter()); return inhg; } @@ -661,7 +561,7 @@ public: */ static const CPressureUnit &mmHg() { - static CPressureUnit mmhg(QT_TRANSLATE_NOOP("CMeasurementUnit", "millimeter of mercury"), "mmHg", 860.142806); + static CPressureUnit mmhg(QT_TRANSLATE_NOOP("CMeasurementUnit", "millimeter of mercury"), "mmHg", LinearConverter()); return mmhg; } @@ -703,17 +603,15 @@ protected: class CTemperatureUnit : public CMeasurementUnit { private: - /*! - * Constructor temperature unit - * \param name - * \param symbol - * \param factor - * \param offset - * \param displayDigits - * \param epsilon - */ - CTemperatureUnit(const QString &name, const QString &symbol, double factor, double offset, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, offset, displayDigits, epsilon) {} + template + CTemperatureUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} + + struct KelvinToCentigrade { static double factor() { return 1.0; } + static double offset() { return 273.15; } }; + struct FahrenheitToCentigrade { static double factor() { return 5.0 / 9.0; } + static double offset() { return 32.0; } }; public: /*! @@ -721,12 +619,6 @@ public: */ CTemperatureUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * \brief Copy constructor - * \param other - */ - CTemperatureUnit(const CTemperatureUnit &other) : CMeasurementUnit(other) {} - /*! * \brief Default unit * \return @@ -739,7 +631,7 @@ public: */ static const CTemperatureUnit &K() { - static CTemperatureUnit K(QT_TRANSLATE_NOOP("CMeasurementUnit", "Kelvin"), "K", 1, 273.15); + static CTemperatureUnit K(QT_TRANSLATE_NOOP("CMeasurementUnit", "Kelvin"), "K", AffineConverter()); return K; } @@ -749,7 +641,7 @@ public: */ static const CTemperatureUnit &C() { - static CTemperatureUnit C(QT_TRANSLATE_NOOP("CMeasurementUnit", "centigrade"), QT_TRANSLATE_NOOP("CMeasurementUnit", "C"), 1, 0); + static CTemperatureUnit C(QT_TRANSLATE_NOOP("CMeasurementUnit", "centigrade"), QT_TRANSLATE_NOOP("CMeasurementUnit", "C"), IdentityConverter()); return C; } @@ -759,7 +651,7 @@ public: */ static const CTemperatureUnit &F() { - static CTemperatureUnit F(QT_TRANSLATE_NOOP("CMeasurementUnit", "Fahrenheit"), QT_TRANSLATE_NOOP("CMeasurementUnit", "F"), 5.0 / 9.0, 32); + static CTemperatureUnit F(QT_TRANSLATE_NOOP("CMeasurementUnit", "Fahrenheit"), QT_TRANSLATE_NOOP("CMeasurementUnit", "F"), AffineConverter()); return F; } @@ -798,16 +690,15 @@ protected: class CSpeedUnit : public CMeasurementUnit { private: - /*! - * \brief Speed unit constructor - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CSpeedUnit(const QString &name, const QString &symbol, double factor, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, displayDigits, epsilon) {} + template + CSpeedUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} + + struct KnotsToMps { static double factor() { return 1852.0 / 3600.0; } }; + struct KphToMps { static double factor() { return 1.0 / 3.6; } }; + struct FtPerSecToMps { static double factor() { return 0.3048 ; } }; + struct FtPerMinToMps { static double factor() { return 0.3048 / 60.0; } }; public: /*! @@ -815,12 +706,6 @@ public: */ CSpeedUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * Constructor, allows to implement methods in base class - * \param other - */ - CSpeedUnit(const CSpeedUnit &other) : CMeasurementUnit(other) {} - /*! * Default unit * \return @@ -833,7 +718,7 @@ public: */ static const CSpeedUnit &m_s() { - static CSpeedUnit ms(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter per second"), "m/s", 1); + static CSpeedUnit ms(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter per second"), "m/s", IdentityConverter()); return ms; } @@ -843,7 +728,7 @@ public: */ static const CSpeedUnit &kts() { - static CSpeedUnit kts(QT_TRANSLATE_NOOP("CMeasurementUnit", "knot"), "kts", 1852.0 / 3600.0, 1); + static CSpeedUnit kts(QT_TRANSLATE_NOOP("CMeasurementUnit", "knot"), "kts", LinearConverter(), 1); return kts; } @@ -853,7 +738,7 @@ public: */ static const CSpeedUnit &NM_h() { - static CSpeedUnit NMh(QT_TRANSLATE_NOOP("CMeasurementUnit", "nautical mile per hour"), "NM/h", 1852.0 / 3600.0, 1); + static CSpeedUnit NMh(QT_TRANSLATE_NOOP("CMeasurementUnit", "nautical mile per hour"), "NM/h", LinearConverter(), 1); return NMh; } @@ -863,7 +748,7 @@ public: */ static const CSpeedUnit &ft_s() { - static CSpeedUnit fts(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per second"), "ft/s", 0.3048, 0); + static CSpeedUnit fts(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per second"), "ft/s", LinearConverter(), 0); return fts; } @@ -873,7 +758,7 @@ public: */ static const CSpeedUnit &ft_min() { - static CSpeedUnit ftmin(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per minute"), "ft/min", 0.3048 / 60.0, 0); + static CSpeedUnit ftmin(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per minute"), "ft/min", LinearConverter(), 0); return ftmin; } @@ -883,7 +768,7 @@ public: */ static const CSpeedUnit &km_h() { - static CSpeedUnit kmh(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilometer per hour"), "km/h", 1.0 / 3.6, 1); + static CSpeedUnit kmh(QT_TRANSLATE_NOOP("CMeasurementUnit", "kilometer per hour"), "km/h", LinearConverter(), 1); return kmh; } @@ -925,39 +810,15 @@ protected: class CTimeUnit : public CMeasurementUnit { private: - /*! - * \brief Time unit constructor - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CTimeUnit(const QString &name, const QString &symbol, double factor, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, displayDigits, epsilon) {} + template + CTimeUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} - /*! - * \brief Time unit constructor - * \param name - * \param symbol - * \param prefix - * \param base - * \param displayDigits - * \param epsilon - */ - CTimeUnit(const QString &name, const QString &symbol, const CMeasurementPrefix &prefix, const CTimeUnit &base, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, base, prefix, displayDigits, epsilon) {} - - /*! - * \brief Time unit constructor - * \param name - * \param symbol - * \param converter - * \param displayDigits - * \param epsilon - */ - CTimeUnit(const QString &name, const QString &symbol, Converter *converter, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) {} + typedef One SecondsToSeconds; + struct DaysToSeconds { static double factor() { return 60.0 * 60.0 * 24.0; } }; + struct HoursToSeconds { static double factor() { return 60.0 * 60.0; } }; + struct MinutesToSeconds { static double factor() { return 60.0; } }; public: /*! @@ -965,12 +826,6 @@ public: */ CTimeUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * Constructor, allows to implement methods in base class - * \param other - */ - CTimeUnit(const CTimeUnit &other) : CMeasurementUnit(other) {} - /*! * Default unit * \return @@ -992,7 +847,7 @@ public: */ static const CTimeUnit &s() { - static CTimeUnit s(QT_TRANSLATE_NOOP("CMeasurementUnit", "second"), "s", 1, 1); + static CTimeUnit s(QT_TRANSLATE_NOOP("CMeasurementUnit", "second"), "s", IdentityConverter(), 1); return s; } @@ -1002,7 +857,7 @@ public: */ static const CTimeUnit &ms() { - static CTimeUnit ms(QT_TRANSLATE_NOOP("CMeasurementUnit", "millisecond"), "ms", CMeasurementPrefix::m(), s(), 0); + static CTimeUnit ms(QT_TRANSLATE_NOOP("CMeasurementUnit", "millisecond"), "ms", LinearConverter>(), 0); return ms; } @@ -1012,7 +867,7 @@ public: */ static const CTimeUnit &h() { - static CTimeUnit h(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour"), "h", 3600, 1); + static CTimeUnit h(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour"), "h", LinearConverter(), 1); return h; } @@ -1022,7 +877,7 @@ public: */ static const CTimeUnit &min() { - static CTimeUnit min(QT_TRANSLATE_NOOP("CMeasurementUnit", "minute"), "min", 60, 2); + static CTimeUnit min(QT_TRANSLATE_NOOP("CMeasurementUnit", "minute"), "min", LinearConverter(), 2); return min; } @@ -1032,7 +887,7 @@ public: */ static const CTimeUnit &d() { - static CTimeUnit day(QT_TRANSLATE_NOOP("CMeasurementUnit", "day"), "d", 3600 * 24, 1); + static CTimeUnit day(QT_TRANSLATE_NOOP("CMeasurementUnit", "day"), "d", LinearConverter(), 1); return day; } @@ -1041,7 +896,7 @@ public: */ static const CTimeUnit &hms() { - static CTimeUnit hms(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour, minute, second"), "hms", new SubdivisionConverter2<60, 100, 60, 100>(3600), 4); + static CTimeUnit hms(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour, minute, second"), "hms", SubdivisionConverter2>(), 4); return hms; (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1h%L2m%L3s"); (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%-L1h%L2m%L3s"); @@ -1052,7 +907,7 @@ public: */ static const CTimeUnit &hrmin() { - static CTimeUnit hrmin(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour, minute"), "hm", new SubdivisionConverter<60, 100>(3600), 3); + static CTimeUnit hrmin(QT_TRANSLATE_NOOP("CMeasurementUnit", "hour, minute"), "hm", SubdivisionConverter>(), 3); return hrmin; (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1h%L2m"); (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1h%L2m"); @@ -1063,7 +918,7 @@ public: */ static const CTimeUnit &minsec() { - static CTimeUnit minsec(QT_TRANSLATE_NOOP("CMeasurementUnit", "minute, second"), "minsec", new SubdivisionConverter<60, 100>(60), 2); + static CTimeUnit minsec(QT_TRANSLATE_NOOP("CMeasurementUnit", "minute, second"), "minsec", SubdivisionConverter>(), 2); return minsec; (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "%L1m%L2s"); (void)QT_TRANSLATE_NOOP("CMeasurementUnit", "-%L1m%L2s"); @@ -1106,16 +961,12 @@ protected: class CAccelerationUnit : public CMeasurementUnit { private: - /*! - * \brief Acceleration unit constructor - * \param name - * \param symbol - * \param factor - * \param displayDigits - * \param epsilon - */ - CAccelerationUnit(const QString &name, const QString &symbol, double factor, int displayDigits = 2, double epsilon = 1E-9) : - CMeasurementUnit(name, symbol, factor, displayDigits, epsilon) {} + template + CAccelerationUnit(const QString &name, const QString &symbol, const Converter &converter, int displayDigits = 2, double epsilon = 1E-9) : + CMeasurementUnit(name, symbol, converter, displayDigits, epsilon) + {} + + struct FeetToMeters { static double factor() { return 0.3048; } }; public: /*! @@ -1123,12 +974,6 @@ public: */ CAccelerationUnit() : CMeasurementUnit(defaultUnit()) {} - /*! - * Copy constructor - * \param other - */ - CAccelerationUnit(const CAccelerationUnit &other) : CMeasurementUnit(other) {} - /*! * Default unit * \return @@ -1141,7 +986,7 @@ public: */ static const CAccelerationUnit &m_s2() { - static CAccelerationUnit ms2(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter per second per second"), QT_TRANSLATE_NOOP("CMeasurementUnit", "m/s^2"), 1, 1); + static CAccelerationUnit ms2(QT_TRANSLATE_NOOP("CMeasurementUnit", "meter per second per second"), QT_TRANSLATE_NOOP("CMeasurementUnit", "m/s^2"), IdentityConverter(), 1); return ms2; } @@ -1151,7 +996,7 @@ public: */ static const CAccelerationUnit &ft_s2() { - static CAccelerationUnit fts2(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per second per second"), QT_TRANSLATE_NOOP("CMeasurementUnit", "ft/s^2"), 3.28084, 0); + static CAccelerationUnit fts2(QT_TRANSLATE_NOOP("CMeasurementUnit", "foot per second per second"), QT_TRANSLATE_NOOP("CMeasurementUnit", "ft/s^2"), LinearConverter(), 0); return fts2; } diff --git a/tests/blackmisc/testphysicalquantities.cpp b/tests/blackmisc/testphysicalquantities.cpp index b082256d7..d4f54c794 100644 --- a/tests/blackmisc/testphysicalquantities.cpp +++ b/tests/blackmisc/testphysicalquantities.cpp @@ -81,7 +81,7 @@ void CTestPhysicalQuantities::frequencyTests() QVERIFY2(f1.valueRounded(CFrequencyUnit::kHz(), 2) == 1000, "Mega is 1000kHz"); QVERIFY2(f1.value() == 1 , "1MHz"); QVERIFY2(f1.value(CFrequencyUnit::defaultUnit()) == 1000000 , "1E6 Hz"); - CFrequency f2(CMeasurementPrefix::M().toDouble(), CFrequencyUnit::Hz()) ; // 1 Megahertz + CFrequency f2(1e+6, CFrequencyUnit::Hz()) ; // 1 Megahertz QVERIFY2(f1 == f2 , "MHz is 1E6 Hz"); } @@ -173,7 +173,7 @@ void CTestPhysicalQuantities::accelerationTests() CAcceleration a2(a1); a1.switchUnit(CAccelerationUnit::ft_s2()); QVERIFY2(a1 == a2, "Accelerations should be similar"); - QVERIFY2(BlackMisc::Math::CMath::round(a1.value() * ftFactor, 6) == a2.valueRounded(6), + QVERIFY2(BlackMisc::Math::CMath::round(a2.value() * ftFactor, 6) == a1.valueRounded(6), "Numerical values should be equal"); }