File indexing completed on 2024-04-21 03:58:29

0001 /*
0002  *   SPDX-FileCopyrightText: 2019 Jonathan Rubenstein <jrubcop@gmail.com>
0003  *
0004  *   SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #include "binary_data_p.h"
0008 #include "unit_p.h"
0009 
0010 #include <KLocalizedString>
0011 
0012 #include <math.h>
0013 
0014 namespace KUnitConversion
0015 {
0016 class BinaryPowerOfTwoUnitPrivate : public UnitPrivate
0017 {
0018 public:
0019     BinaryPowerOfTwoUnitPrivate(CategoryId categoryId,
0020                                 UnitId id,
0021                                 qreal multiplier,
0022                                 const QString &symbol,
0023                                 const QString &description,
0024                                 const QString &matchString,
0025                                 const KLocalizedString &symbolString,
0026                                 const KLocalizedString &realString,
0027                                 const KLocalizedString &integerString)
0028         : UnitPrivate(categoryId, id, multiplier, symbol, description, matchString, symbolString, realString, integerString)
0029     {
0030     }
0031 
0032     qreal toDefault(qreal value) const override
0033     {
0034         return value * pow(2.0, m_multiplier);
0035     }
0036     qreal fromDefault(qreal value) const override
0037     {
0038         return value / pow(2.0, m_multiplier);
0039     }
0040 };
0041 
0042 UnitCategory BinaryData::makeCategory()
0043 {
0044     auto c = UnitCategoryPrivate::makeCategory(BinaryDataCategory, i18n("Binary Data"), i18n("Binary Data Size"));
0045     auto d = UnitCategoryPrivate::get(c);
0046     KLocalizedString symbolString = ki18nc("%1 value, %2 unit symbol (binary data)", "%1 %2");
0047 
0048     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0049                                                        Yobibyte,
0050                                                        83,
0051                                                        i18nc("binary data unit symbol", "YiB"),
0052                                                        i18nc("unit description in lists", "yobibytes"),
0053                                                        i18nc("unit synonyms for matching user input", "YiB;yobibyte;yobibytes"),
0054                                                        symbolString,
0055                                                        ki18nc("amount in units (real)", "%1 yobibytes"),
0056                                                        ki18ncp("amount in units (integer)", "%1 yobibyte", "%1 yobibytes"))));
0057 
0058     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0059                                                        Yobibit,
0060                                                        80,
0061                                                        i18nc("binary data unit symbol", "Yib"),
0062                                                        i18nc("unit description in lists", "yobibits"),
0063                                                        i18nc("unit synonyms for matching user input", "Yib;yobibit;yobibits"),
0064                                                        symbolString,
0065                                                        ki18nc("amount in units (real)", "%1 yobibits"),
0066                                                        ki18ncp("amount in units (integer)", "%1 yobibit", "%1 yobibits"))));
0067 
0068     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0069                        Yottabyte,
0070                        8e+24,
0071                        i18nc("binary data unit symbol", "YB"),
0072                        i18nc("unit description in lists", "yottabytes"),
0073                        i18nc("unit synonyms for matching user input", "YB;yottabyte;yottabytes"),
0074                        symbolString,
0075                        ki18nc("amount in units (real)", "%1 yottabytes"),
0076                        ki18ncp("amount in units (integer)", "%1 yottabyte", "%1 yottabytes")));
0077 
0078     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0079                        Yottabit,
0080                        1e+24,
0081                        i18nc("binary data unit symbol", "Yb"),
0082                        i18nc("unit description in lists", "yottabits"),
0083                        i18nc("unit synonyms for matching user input", "Yb;yottabit;yottabits"),
0084                        symbolString,
0085                        ki18nc("amount in units (real)", "%1 yottabits"),
0086                        ki18ncp("amount in units (integer)", "%1 yottabit", "%1 yottabits")));
0087 
0088     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0089                                                        Zebibyte,
0090                                                        73,
0091                                                        i18nc("binary data unit symbol", "ZiB"),
0092                                                        i18nc("unit description in lists", "zebibytes"),
0093                                                        i18nc("unit synonyms for matching user input", "ZiB;zebibyte;zebibytes"),
0094                                                        symbolString,
0095                                                        ki18nc("amount in units (real)", "%1 zebibytes"),
0096                                                        ki18ncp("amount in units (integer)", "%1 zebibyte", "%1 zebibytes"))));
0097 
0098     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0099                                                        Zebibit,
0100                                                        70,
0101                                                        i18nc("binary data unit symbol", "Zib"),
0102                                                        i18nc("unit description in lists", "zebibits"),
0103                                                        i18nc("unit synonyms for matching user input", "Zib;zebibit;zebibits"),
0104                                                        symbolString,
0105                                                        ki18nc("amount in units (real)", "%1 zebibits"),
0106                                                        ki18ncp("amount in units (integer)", "%1 zebibit", "%1 zebibits"))));
0107 
0108     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0109                        Zettabyte,
0110                        8e+21,
0111                        i18nc("binary data unit symbol", "ZB"),
0112                        i18nc("unit description in lists", "zettabytes"),
0113                        i18nc("unit synonyms for matching user input", "ZB;zettabyte;zettabytes"),
0114                        symbolString,
0115                        ki18nc("amount in units (real)", "%1 zettabytes"),
0116                        ki18ncp("amount in units (integer)", "%1 zettabyte", "%1 zettabytes")));
0117 
0118     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0119                        Zettabit,
0120                        1e+21,
0121                        i18nc("binary data unit symbol", "Zb"),
0122                        i18nc("unit description in lists", "zettabits"),
0123                        i18nc("unit synonyms for matching user input", "Zb;zettabit;zettabits"),
0124                        symbolString,
0125                        ki18nc("amount in units (real)", "%1 zettabits"),
0126                        ki18ncp("amount in units (integer)", "%1 zettabit", "%1 zettabits")));
0127 
0128     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0129                                                        Exbibyte,
0130                                                        63,
0131                                                        i18nc("binary data unit symbol", "EiB"),
0132                                                        i18nc("unit description in lists", "exbibytes"),
0133                                                        i18nc("unit synonyms for matching user input", "EiB;exbibyte;exbibytes"),
0134                                                        symbolString,
0135                                                        ki18nc("amount in units (real)", "%1 exbibytes"),
0136                                                        ki18ncp("amount in units (integer)", "%1 exbibyte", "%1 exbibytes"))));
0137 
0138     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0139                                                        Exbibit,
0140                                                        60,
0141                                                        i18nc("binary data unit symbol", "Eib"),
0142                                                        i18nc("unit description in lists", "exbibits"),
0143                                                        i18nc("unit synonyms for matching user input", "Eib;exbibit;exbibits"),
0144                                                        symbolString,
0145                                                        ki18nc("amount in units (real)", "%1 exbibits"),
0146                                                        ki18ncp("amount in units (integer)", "%1 exbibit", "%1 exbibits"))));
0147 
0148     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0149                        Exabyte,
0150                        8e+18,
0151                        i18nc("binary data unit symbol", "EB"),
0152                        i18nc("unit description in lists", "exabytes"),
0153                        i18nc("unit synonyms for matching user input", "EB;exabyte;exabytes"),
0154                        symbolString,
0155                        ki18nc("amount in units (real)", "%1 exabytes"),
0156                        ki18ncp("amount in units (integer)", "%1 exabyte", "%1 exabytes")));
0157 
0158     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0159                        Exabit,
0160                        1e+18,
0161                        i18nc("binary data unit symbol", "Eb"),
0162                        i18nc("unit description in lists", "exabits"),
0163                        i18nc("unit synonyms for matching user input", "Eb;exabit;exabits"),
0164                        symbolString,
0165                        ki18nc("amount in units (real)", "%1 exabits"),
0166                        ki18ncp("amount in units (integer)", "%1 exabit", "%1 exabits")));
0167 
0168     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0169                                                        Pebibyte,
0170                                                        53,
0171                                                        i18nc("binary data unit symbol", "PiB"),
0172                                                        i18nc("unit description in lists", "pebibytes"),
0173                                                        i18nc("unit synonyms for matching user input", "PiB;pebibyte;pebibytes"),
0174                                                        symbolString,
0175                                                        ki18nc("amount in units (real)", "%1 pebibytes"),
0176                                                        ki18ncp("amount in units (integer)", "%1 pebibyte", "%1 pebibytes"))));
0177 
0178     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0179                                                        Pebibit,
0180                                                        50,
0181                                                        i18nc("binary data unit symbol", "Pib"),
0182                                                        i18nc("unit description in lists", "pebibits"),
0183                                                        i18nc("unit synonyms for matching user input", "Pib;pebibit;pebibits"),
0184                                                        symbolString,
0185                                                        ki18nc("amount in units (real)", "%1 pebibits"),
0186                                                        ki18ncp("amount in units (integer)", "%1 pebibit", "%1 pebibits"))));
0187 
0188     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0189                        Petabyte,
0190                        8e+15,
0191                        i18nc("binary data unit symbol", "PB"),
0192                        i18nc("unit description in lists", "petabytes"),
0193                        i18nc("unit synonyms for matching user input", "PB;petabyte;petabytes"),
0194                        symbolString,
0195                        ki18nc("amount in units (real)", "%1 petabytes"),
0196                        ki18ncp("amount in units (integer)", "%1 petabyte", "%1 petabytes")));
0197 
0198     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0199                        Petabit,
0200                        1e+15,
0201                        i18nc("binary data unit symbol", "Pb"),
0202                        i18nc("unit description in lists", "petabits"),
0203                        i18nc("unit synonyms for matching user input", "Pb;petabit;petabits"),
0204                        symbolString,
0205                        ki18nc("amount in units (real)", "%1 petabits"),
0206                        ki18ncp("amount in units (integer)", "%1 petabit", "%1 petabits")));
0207 
0208     d->addCommonUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0209                                                              Tebibyte,
0210                                                              43,
0211                                                              i18nc("binary data unit symbol", "TiB"),
0212                                                              i18nc("unit description in lists", "tebibytes"),
0213                                                              i18nc("unit synonyms for matching user input", "TiB;tebibyte;tebibytes"),
0214                                                              symbolString,
0215                                                              ki18nc("amount in units (real)", "%1 tebibytes"),
0216                                                              ki18ncp("amount in units (integer)", "%1 tebibyte", "%1 tebibytes"))));
0217 
0218     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0219                                                        Tebibit,
0220                                                        40,
0221                                                        i18nc("binary data unit symbol", "Tib"),
0222                                                        i18nc("unit description in lists", "tebibits"),
0223                                                        i18nc("unit synonyms for matching user input", "Tib;tebibit;tebibits"),
0224                                                        symbolString,
0225                                                        ki18nc("amount in units (real)", "%1 tebibits"),
0226                                                        ki18ncp("amount in units (integer)", "%1 tebibit", "%1 tebibits"))));
0227 
0228     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0229                              Terabyte,
0230                              8e+12,
0231                              i18nc("binary data unit symbol", "TB"),
0232                              i18nc("unit description in lists", "terabytes"),
0233                              i18nc("unit synonyms for matching user input", "TB;terabyte;terabytes"),
0234                              symbolString,
0235                              ki18nc("amount in units (real)", "%1 terabytes"),
0236                              ki18ncp("amount in units (integer)", "%1 terabyte", "%1 terabytes")));
0237 
0238     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0239                              Terabit,
0240                              1e+12,
0241                              i18nc("binary data unit symbol", "Tb"),
0242                              i18nc("unit description in lists", "terabits"),
0243                              i18nc("unit synonyms for matching user input", "Tb;terabit;terabits"),
0244                              symbolString,
0245                              ki18nc("amount in units (real)", "%1 terabits"),
0246                              ki18ncp("amount in units (integer)", "%1 terabit", "%1 terabits")));
0247 
0248     d->addCommonUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0249                                                              Gibibyte,
0250                                                              33,
0251                                                              i18nc("binary data unit symbol", "GiB"),
0252                                                              i18nc("unit description in lists", "gibibytes"),
0253                                                              i18nc("unit synonyms for matching user input", "GiB;gibibyte;gibibytes"),
0254                                                              symbolString,
0255                                                              ki18nc("amount in units (real)", "%1 gibibytes"),
0256                                                              ki18ncp("amount in units (integer)", "%1 gibibyte", "%1 gibibytes"))));
0257 
0258     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0259                                                        Gibibit,
0260                                                        30,
0261                                                        i18nc("binary data unit symbol", "Gib"),
0262                                                        i18nc("unit description in lists", "gibibits"),
0263                                                        i18nc("unit synonyms for matching user input", "Gib;gibibit;gibibits"),
0264                                                        symbolString,
0265                                                        ki18nc("amount in units (real)", "%1 gibibits"),
0266                                                        ki18ncp("amount in units (integer)", "%1 gibibit", "%1 gibibits"))));
0267 
0268     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0269                              Gigabyte,
0270                              8e+09,
0271                              i18nc("binary data unit symbol", "GB"),
0272                              i18nc("unit description in lists", "gigabytes"),
0273                              i18nc("unit synonyms for matching user input", "GB;gigabyte;gigabytes"),
0274                              symbolString,
0275                              ki18nc("amount in units (real)", "%1 gigabytes"),
0276                              ki18ncp("amount in units (integer)", "%1 gigabyte", "%1 gigabytes")));
0277 
0278     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0279                              Gigabit,
0280                              1e+09,
0281                              i18nc("binary data unit symbol", "Gb"),
0282                              i18nc("unit description in lists", "gigabits"),
0283                              i18nc("unit synonyms for matching user input", "Gb;gigabit;gigabits"),
0284                              symbolString,
0285                              ki18nc("amount in units (real)", "%1 gigabits"),
0286                              ki18ncp("amount in units (integer)", "%1 gigabit", "%1 gigabits")));
0287 
0288     d->addCommonUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0289                                                              Mebibyte,
0290                                                              23,
0291                                                              i18nc("binary data unit symbol", "MiB"),
0292                                                              i18nc("unit description in lists", "mebibytes"),
0293                                                              i18nc("unit synonyms for matching user input", "MiB;mebibyte;mebibytes"),
0294                                                              symbolString,
0295                                                              ki18nc("amount in units (real)", "%1 mebibytes"),
0296                                                              ki18ncp("amount in units (integer)", "%1 mebibyte", "%1 mebibytes"))));
0297 
0298     d->addUnit(UnitPrivate::makeUnit(new BinaryPowerOfTwoUnitPrivate(BinaryDataCategory,
0299                                                        Mebibit,
0300                                                        20,
0301                                                        i18nc("binary data unit symbol", "Mib"),
0302                                                        i18nc("unit description in lists", "mebibits"),
0303                                                        i18nc("unit synonyms for matching user input", "Mib;mebibit;mebibits"),
0304                                                        symbolString,
0305                                                        ki18nc("amount in units (real)", "%1 mebibits"),
0306                                                        ki18ncp("amount in units (integer)", "%1 mebibit", "%1 mebibits"))));
0307 
0308     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0309                              Megabyte,
0310                              8e+06,
0311                              i18nc("binary data unit symbol", "MB"),
0312                              i18nc("unit description in lists", "megabytes"),
0313                              i18nc("unit synonyms for matching user input", "MB;megabyte;megabytes"),
0314                              symbolString,
0315                              ki18nc("amount in units (real)", "%1 megabytes"),
0316                              ki18ncp("amount in units (integer)", "%1 megabyte", "%1 megabytes")));
0317 
0318     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0319                              Megabit,
0320                              1e+06,
0321                              i18nc("binary data unit symbol", "Mb"),
0322                              i18nc("unit description in lists", "megabits"),
0323                              i18nc("unit synonyms for matching user input", "Mb;megabit;megabits"),
0324                              symbolString,
0325                              ki18nc("amount in units (real)", "%1 megabits"),
0326                              ki18ncp("amount in units (integer)", "%1 megabit", "%1 megabits")));
0327 
0328     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0329                              Kibibyte,
0330                              8192,
0331                              i18nc("binary data unit symbol", "KiB"),
0332                              i18nc("unit description in lists", "kibibytes"),
0333                              i18nc("unit synonyms for matching user input", "KiB;kibibyte;kibibytes"),
0334                              symbolString,
0335                              ki18nc("amount in units (real)", "%1 kibibytes"),
0336                              ki18ncp("amount in units (integer)", "%1 kibibyte", "%1 kibibytes")));
0337 
0338     d->addUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0339                        Kibibit,
0340                        1024,
0341                        i18nc("binary data unit symbol", "Kib"),
0342                        i18nc("unit description in lists", "kibibits"),
0343                        i18nc("unit synonyms for matching user input", "Kib;kibibit;kibibits"),
0344                        symbolString,
0345                        ki18nc("amount in units (real)", "%1 kibibits"),
0346                        ki18ncp("amount in units (integer)", "%1 kibibit", "%1 kibibits")));
0347 
0348     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0349                              Kilobyte,
0350                              8000,
0351                              i18nc("binary data unit symbol", "kB"),
0352                              i18nc("unit description in lists", "kilobytes"),
0353                              i18nc("unit synonyms for matching user input", "kB;kilobyte;kilobytes"),
0354                              symbolString,
0355                              ki18nc("amount in units (real)", "%1 kilobytes"),
0356                              ki18ncp("amount in units (integer)", "%1 kilobyte", "%1 kilobytes")));
0357 
0358     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0359                              Kilobit,
0360                              1000,
0361                              i18nc("binary data unit symbol", "kb"),
0362                              i18nc("unit description in lists", "kilobits"),
0363                              i18nc("unit synonyms for matching user input", "kb;kilobit;kilobits"),
0364                              symbolString,
0365                              ki18nc("amount in units (real)", "%1 kilobits"),
0366                              ki18ncp("amount in units (integer)", "%1 kilobit", "%1 kilobits")));
0367 
0368     d->addCommonUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0369                              Byte,
0370                              8,
0371                              i18nc("binary data unit symbol", "B"),
0372                              i18nc("unit description in lists", "bytes"),
0373                              i18nc("unit synonyms for matching user input", "B;byte;bytes"),
0374                              symbolString,
0375                              ki18nc("amount in units (real)", "%1 bytes"),
0376                              ki18ncp("amount in units (integer)", "%1 byte", "%1 bytes")));
0377 
0378     d->addDefaultUnit(UnitPrivate::makeUnit(BinaryDataCategory,
0379                               Bit,
0380                               1,
0381                               i18nc("binary data unit symbol", "b"),
0382                               i18nc("unit description in lists", "bits"),
0383                               i18nc("unit synonyms for matching user input", "b;bit;bits"),
0384                               symbolString,
0385                               ki18nc("amount in units (real)", "%1 bits"),
0386                               ki18ncp("amount in units (integer)", "%1 bit", "%1 bits")));
0387 
0388     return c;
0389 }
0390 
0391 } // KUnitConversion namespace