File indexing completed on 2024-03-24 04:01:21
0001 /* 0002 * SPDX-FileCopyrightText: 2007-2009 Petri Damstén <damu@iki.fi> 0003 * SPDX-FileCopyrightText: 2014 John Layt <jlayt@kde.org> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "temperature_p.h" 0009 #include "unit_p.h" 0010 0011 #include <KLocalizedString> 0012 0013 namespace KUnitConversion 0014 { 0015 class CelsiusUnitPrivate : public UnitPrivate 0016 { 0017 public: 0018 CelsiusUnitPrivate(CategoryId categoryId, 0019 UnitId id, 0020 qreal multiplier, 0021 const QString &symbol, 0022 const QString &description, 0023 const QString &matchString, 0024 const KLocalizedString &symbolString, 0025 const KLocalizedString &realString, 0026 const KLocalizedString &integerString) 0027 : UnitPrivate(categoryId, id, multiplier, symbol, description, matchString, symbolString, realString, integerString) 0028 { 0029 } 0030 0031 qreal toDefault(qreal value) const override 0032 { 0033 return value + 273.15; 0034 } 0035 0036 qreal fromDefault(qreal value) const override 0037 { 0038 return value - 273.15; 0039 } 0040 }; 0041 0042 class FahrenheitUnitPrivate : public UnitPrivate 0043 { 0044 public: 0045 FahrenheitUnitPrivate(CategoryId categoryId, 0046 UnitId id, 0047 qreal multiplier, 0048 const QString &symbol, 0049 const QString &description, 0050 const QString &matchString, 0051 const KLocalizedString &symbolString, 0052 const KLocalizedString &realString, 0053 const KLocalizedString &integerString) 0054 : UnitPrivate(categoryId, id, multiplier, symbol, description, matchString, symbolString, realString, integerString) 0055 { 0056 } 0057 0058 qreal toDefault(qreal value) const override 0059 { 0060 return (value + 459.67) * 5.0 / 9.0; 0061 } 0062 0063 qreal fromDefault(qreal value) const override 0064 { 0065 return (value * 9.0 / 5.0) - 459.67; 0066 } 0067 }; 0068 0069 class DelisleUnitPrivate : public UnitPrivate 0070 { 0071 public: 0072 DelisleUnitPrivate(CategoryId categoryId, 0073 UnitId id, 0074 qreal multiplier, 0075 const QString &symbol, 0076 const QString &description, 0077 const QString &matchString, 0078 const KLocalizedString &symbolString, 0079 const KLocalizedString &realString, 0080 const KLocalizedString &integerString) 0081 : UnitPrivate(categoryId, id, multiplier, symbol, description, matchString, symbolString, realString, integerString) 0082 { 0083 } 0084 0085 qreal toDefault(qreal value) const override 0086 { 0087 return 373.15 - (value * 2.0 / 3.0); 0088 } 0089 0090 qreal fromDefault(qreal value) const override 0091 { 0092 return (373.15 - value) * 3.0 / 2.0; 0093 } 0094 }; 0095 0096 class NewtonUnitPrivate : public UnitPrivate 0097 { 0098 public: 0099 NewtonUnitPrivate(CategoryId categoryId, 0100 UnitId id, 0101 qreal multiplier, 0102 const QString &symbol, 0103 const QString &description, 0104 const QString &matchString, 0105 const KLocalizedString &symbolString, 0106 const KLocalizedString &realString, 0107 const KLocalizedString &integerString) 0108 : UnitPrivate(categoryId, id, multiplier, symbol, description, matchString, symbolString, realString, integerString) 0109 { 0110 } 0111 0112 qreal toDefault(qreal value) const override 0113 { 0114 return (value * 100.0 / 33.0) + 273.15; 0115 } 0116 0117 qreal fromDefault(qreal value) const override 0118 { 0119 return (value - 273.15) * 33.0 / 100.0; 0120 } 0121 }; 0122 0123 class ReaumurUnitPrivate : public UnitPrivate 0124 { 0125 public: 0126 ReaumurUnitPrivate(CategoryId categoryId, 0127 UnitId id, 0128 qreal multiplier, 0129 const QString &symbol, 0130 const QString &description, 0131 const QString &matchString, 0132 const KLocalizedString &symbolString, 0133 const KLocalizedString &realString, 0134 const KLocalizedString &integerString) 0135 : UnitPrivate(categoryId, id, multiplier, symbol, description, matchString, symbolString, realString, integerString) 0136 { 0137 } 0138 0139 qreal toDefault(qreal value) const override 0140 { 0141 return (value * 5.0 / 4.0) + 273.15; 0142 } 0143 0144 qreal fromDefault(qreal value) const override 0145 { 0146 return (value - 273.15) * 4.0 / 5.0; 0147 } 0148 }; 0149 0150 class RomerUnitPrivate : public UnitPrivate 0151 { 0152 public: 0153 RomerUnitPrivate(CategoryId categoryId, 0154 UnitId id, 0155 qreal multiplier, 0156 const QString &symbol, 0157 const QString &description, 0158 const QString &matchString, 0159 const KLocalizedString &symbolString, 0160 const KLocalizedString &realString, 0161 const KLocalizedString &integerString) 0162 : UnitPrivate(categoryId, id, multiplier, symbol, description, matchString, symbolString, realString, integerString) 0163 { 0164 } 0165 0166 qreal toDefault(qreal value) const override 0167 { 0168 return (value - 7.5) * 40.0 / 21.0 + 273.15; 0169 } 0170 0171 qreal fromDefault(qreal value) const override 0172 { 0173 return (value - 273.15) * 21.0 / 40.0 + 7.5; 0174 } 0175 }; 0176 0177 UnitCategory Temperature::makeCategory() 0178 { 0179 auto c = UnitCategoryPrivate::makeCategory(TemperatureCategory, i18n("Temperature"), i18n("Temperature")); 0180 auto d = UnitCategoryPrivate::get(c); 0181 KLocalizedString symbolString = ki18nc("%1 value, %2 unit symbol (temperature)", "%1 %2"); 0182 0183 d->addDefaultUnit(UnitPrivate::makeUnit(TemperatureCategory, 0184 Kelvin, 0185 1, 0186 i18nc("temperature unit symbol", "K"), 0187 i18nc("unit description in lists", "kelvins"), 0188 i18nc("unit synonyms for matching user input", "kelvin;kelvins;K"), 0189 symbolString, 0190 ki18nc("amount in units (real)", "%1 kelvins"), 0191 ki18ncp("amount in units (integer)", "%1 kelvin", "%1 kelvins"))); 0192 0193 d->addCommonUnit(UnitPrivate::makeUnit(new CelsiusUnitPrivate(TemperatureCategory, 0194 Celsius, 0195 1, 0196 i18nc("temperature unit symbol", "°C"), 0197 i18nc("unit description in lists", "Celsius"), 0198 i18nc("unit synonyms for matching user input", "Celsius;°C;C"), 0199 symbolString, 0200 ki18nc("amount in units (real)", "%1 degrees Celsius"), 0201 ki18ncp("amount in units (integer)", "%1 degree Celsius", "%1 degrees Celsius")))); 0202 0203 d->addCommonUnit(UnitPrivate::makeUnit(new FahrenheitUnitPrivate(TemperatureCategory, 0204 Fahrenheit, 0205 1, 0206 i18nc("temperature unit symbol", "°F"), 0207 i18nc("unit description in lists", "Fahrenheit"), 0208 i18nc("unit synonyms for matching user input", "Fahrenheit;°F;F"), 0209 symbolString, 0210 ki18nc("amount in units (real)", "%1 degrees Fahrenheit"), 0211 ki18ncp("amount in units (integer)", "%1 degree Fahrenheit", "%1 degrees Fahrenheit")))); 0212 0213 d->addUnit(UnitPrivate::makeUnit(TemperatureCategory, 0214 Rankine, 0215 0.555556, 0216 i18nc("temperature unit symbol", "R"), 0217 i18nc("unit description in lists", "Rankine"), 0218 i18nc("unit synonyms for matching user input", "Rankine;°R;R;Ra"), 0219 symbolString, 0220 ki18nc("amount in units (real)", "%1 Rankine"), 0221 ki18ncp("amount in units (integer)", "%1 Rankine", "%1 Rankine"))); 0222 0223 d->addUnit(UnitPrivate::makeUnit(new DelisleUnitPrivate(TemperatureCategory, 0224 Delisle, 0225 1, 0226 i18nc("temperature unit symbol", "°De"), 0227 i18nc("unit description in lists", "Delisle"), 0228 i18nc("unit synonyms for matching user input", "Delisle;°De;De"), 0229 symbolString, 0230 ki18nc("amount in units (real)", "%1 degrees Delisle"), 0231 ki18ncp("amount in units (integer)", "%1 degree Delisle", "%1 degrees Delisle")))); 0232 0233 d->addUnit(UnitPrivate::makeUnit(new NewtonUnitPrivate(TemperatureCategory, 0234 TemperatureNewton, 0235 1, 0236 i18nc("temperature unit symbol", "°N"), 0237 i18nc("unit description in lists", "Newton"), 0238 i18nc("unit synonyms for matching user input", "Newton;°N;N"), 0239 symbolString, 0240 ki18nc("amount in units (real)", "%1 degrees Newton"), 0241 ki18ncp("amount in units (integer)", "%1 degree Newton", "%1 degrees Newton")))); 0242 0243 d->addUnit(UnitPrivate::makeUnit(new ReaumurUnitPrivate(TemperatureCategory, 0244 Reaumur, 0245 1, 0246 i18nc("temperature unit symbol", "°Ré"), 0247 i18nc("unit description in lists", "Réaumur"), 0248 i18nc("unit synonyms for matching user input", "Réaumur;°Ré;Ré;Reaumur;°Re;Re"), 0249 symbolString, 0250 ki18nc("amount in units (real)", "%1 degrees Réaumur"), 0251 ki18ncp("amount in units (integer)", "%1 degree Réaumur", "%1 degrees Réaumur")))); 0252 0253 d->addUnit(UnitPrivate::makeUnit(new RomerUnitPrivate(TemperatureCategory, 0254 Romer, 0255 1, 0256 i18nc("temperature unit symbol", "°Rø"), 0257 i18nc("unit description in lists", "Rømer"), 0258 i18nc("unit synonyms for matching user input", "Rømer;°Rø;Rø;Romer;°Ro;Ro"), 0259 symbolString, 0260 ki18nc("amount in units (real)", "%1 degrees Rømer"), 0261 ki18ncp("amount in units (integer)", "%1 degree Rømer", "%1 degrees Rømer")))); 0262 0263 return c; 0264 } 0265 0266 } // KUnitConversion namespace