Warning, file /frameworks/kunitconversion/src/converter.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 * SPDX-FileCopyrightText: 2008-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 "converter.h" 0009 0010 #include "acceleration_p.h" 0011 #include "angle_p.h" 0012 #include "area_p.h" 0013 #include "binary_data_p.h" 0014 #include "currency_p.h" 0015 #include "density_p.h" 0016 #include "electrical_current_p.h" 0017 #include "electrical_resistance_p.h" 0018 #include "energy_p.h" 0019 #include "force_p.h" 0020 #include "frequency_p.h" 0021 #include "fuel_efficiency_p.h" 0022 #include "length_p.h" 0023 #include "mass_p.h" 0024 #include "permeability_p.h" 0025 #include "power_p.h" 0026 #include "pressure_p.h" 0027 #include "temperature_p.h" 0028 #include "thermal_conductivity_p.h" 0029 #include "thermal_flux_p.h" 0030 #include "thermal_generation_p.h" 0031 #include "timeunit_p.h" 0032 #include "velocity_p.h" 0033 #include "voltage_p.h" 0034 #include "volume_p.h" 0035 0036 #include <KLocalizedString> 0037 0038 namespace KUnitConversion 0039 { 0040 class ConverterPrivate : public QSharedData 0041 { 0042 public: 0043 ConverterPrivate() 0044 { 0045 m_categories[LengthCategory] = Length::makeCategory(); 0046 m_categories[AreaCategory] = Area::makeCategory(); 0047 m_categories[VolumeCategory] = Volume::makeCategory(); 0048 m_categories[TemperatureCategory] = Temperature::makeCategory(); 0049 m_categories[VelocityCategory] = Velocity::makeCategory(); 0050 m_categories[MassCategory] = Mass::makeCategory(); 0051 m_categories[PressureCategory] = Pressure::makeCategory(); 0052 m_categories[EnergyCategory] = Energy::makeCategory(); 0053 m_categories[CurrencyCategory] = Currency::makeCategory(); 0054 m_categories[PowerCategory] = Power::makeCategory(); 0055 m_categories[TimeCategory] = Time::makeCategory(); 0056 m_categories[FuelEfficiencyCategory] = FuelEfficiency::makeCategory(); 0057 m_categories[DensityCategory] = Density::makeCategory(); 0058 m_categories[AccelerationCategory] = Acceleration::makeCategory(); 0059 m_categories[ForceCategory] = Force::makeCategory(); 0060 m_categories[AngleCategory] = Angle::makeCategory(); 0061 m_categories[FrequencyCategory] = Frequency::makeCategory(); 0062 m_categories[ThermalConductivityCategory] = ThermalConductivity::makeCategory(); 0063 m_categories[ThermalFluxCategory] = ThermalFlux::makeCategory(); 0064 m_categories[ThermalGenerationCategory] = ThermalGeneration::makeCategory(); 0065 m_categories[VoltageCategory] = Voltage::makeCategory(); 0066 m_categories[ElectricalCurrentCategory] = ElectricalCurrent::makeCategory(); 0067 m_categories[ElectricalResistanceCategory] = ElectricalResistance::makeCategory(); 0068 m_categories[PermeabilityCategory] = Permeability::makeCategory(); 0069 m_categories[BinaryDataCategory] = BinaryData::makeCategory(); 0070 } 0071 0072 #if KUNITCONVERSION_BUILD_DEPRECATED_SINCE(5, 91) 0073 bool operator==(const ConverterPrivate &other) const 0074 { 0075 return (m_categories == other.m_categories); 0076 } 0077 0078 bool operator!=(const ConverterPrivate &other) const 0079 { 0080 return !(*this == other); 0081 } 0082 #endif 0083 0084 QMap<CategoryId, UnitCategory> m_categories; 0085 }; 0086 0087 class QConverterSingleton 0088 { 0089 public: 0090 QConverterSingleton() 0091 : d(new ConverterPrivate()) 0092 { 0093 } 0094 QExplicitlySharedDataPointer<ConverterPrivate> d; 0095 }; 0096 0097 Q_GLOBAL_STATIC(QConverterSingleton, global_converter) 0098 0099 Converter::Converter() 0100 : d(global_converter->d) 0101 { 0102 } 0103 0104 Converter::~Converter() 0105 { 0106 } 0107 0108 Converter::Converter(const Converter &other) 0109 : d(other.d) 0110 { 0111 } 0112 0113 Converter &Converter::operator=(const Converter &other) 0114 { 0115 d = other.d; 0116 return *this; 0117 } 0118 0119 #if KUNITCONVERSION_BUILD_DEPRECATED_SINCE(5, 91) 0120 bool Converter::operator==(const Converter &other) const 0121 { 0122 if (d && other.d) { 0123 return (*d == *other.d); 0124 } else { 0125 return (d == other.d); 0126 } 0127 } 0128 0129 bool Converter::operator!=(const Converter &other) const 0130 { 0131 if (d && other.d) { 0132 return (*d != *other.d); 0133 } else { 0134 return (d != other.d); 0135 } 0136 } 0137 #endif 0138 0139 Value Converter::convert(const Value &value, const QString &toUnit) const 0140 { 0141 if (d && value.unit().isValid()) { 0142 return value.unit().category().convert(value, toUnit); 0143 } 0144 return Value(); 0145 } 0146 0147 Value Converter::convert(const Value &value, UnitId toUnit) const 0148 { 0149 if (d && value.unit().isValid()) { 0150 return value.unit().category().convert(value, toUnit); 0151 } 0152 return Value(); 0153 } 0154 0155 Value Converter::convert(const Value &value, const Unit &toUnit) const 0156 { 0157 if (d && toUnit.isValid() && value.unit().isValid()) { 0158 return value.unit().category().convert(value, toUnit); 0159 } 0160 return Value(); 0161 } 0162 0163 UnitCategory Converter::categoryForUnit(const QString &unit) const 0164 { 0165 const auto lstCategories = categories(); 0166 for (const UnitCategory &u : lstCategories) { 0167 if (u.hasUnit(unit)) { 0168 return u; 0169 } 0170 } 0171 return UnitCategory(); 0172 } 0173 0174 Unit Converter::unit(const QString &unitString) const 0175 { 0176 const auto lstCategories = categories(); 0177 for (const UnitCategory &u : lstCategories) { 0178 Unit unitClass = u.unit(unitString); 0179 if (unitClass.isValid()) { 0180 return unitClass; 0181 } 0182 } 0183 return Unit(); 0184 } 0185 0186 Unit Converter::unit(UnitId unitId) const 0187 { 0188 const auto lstCategories = categories(); 0189 for (const UnitCategory &u : lstCategories) { 0190 Unit unitClass = u.unit(unitId); 0191 if (unitClass.isValid()) { 0192 return unitClass; 0193 } 0194 } 0195 return Unit(); 0196 } 0197 0198 UnitCategory Converter::category(const QString &category) const 0199 { 0200 const auto lstCategories = categories(); 0201 for (const UnitCategory &u : lstCategories) { 0202 if (u.name() == category) { 0203 return u; 0204 } 0205 } 0206 // not found 0207 return UnitCategory(); 0208 } 0209 0210 UnitCategory Converter::category(CategoryId categoryId) const 0211 { 0212 if (d && d->m_categories.contains(categoryId)) { 0213 return d->m_categories[categoryId]; 0214 } 0215 // not found 0216 return UnitCategory(); 0217 } 0218 0219 QList<UnitCategory> Converter::categories() const 0220 { 0221 if (d) { 0222 return d->m_categories.values(); 0223 } 0224 return QList<UnitCategory>(); 0225 } 0226 0227 }