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 }