Home | History | Annotate | Download | only in i18n
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4 **********************************************************************
      5 * Copyright (c) 2004-2016, International Business Machines
      6 * Corporation and others.  All Rights Reserved.
      7 **********************************************************************
      8 * Author: Alan Liu
      9 * Created: April 26, 2004
     10 * Since: ICU 3.0
     11 **********************************************************************
     12 */
     13 #include "utypeinfo.h" // for 'typeid' to work
     14 
     15 #include "unicode/measunit.h"
     16 
     17 #if !UCONFIG_NO_FORMATTING
     18 
     19 #include "unicode/uenum.h"
     20 #include "ustrenum.h"
     21 #include "cstring.h"
     22 #include "uassert.h"
     23 
     24 U_NAMESPACE_BEGIN
     25 
     26 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureUnit)
     27 
     28 // All code between the "Start generated code" comment and
     29 // the "End generated code" comment is auto generated code
     30 // and must not be edited manually. For instructions on how to correctly
     31 // update this code, refer to:
     32 // http://site.icu-project.org/design/formatting/measureformat/updating-measure-unit
     33 //
     34 // Start generated code
     35 
     36 
     37 static const int32_t gOffsets[] = {
     38     0,
     39     2,
     40     7,
     41     16,
     42     20,
     43     24,
     44     285,
     45     295,
     46     306,
     47     310,
     48     316,
     49     320,
     50     340,
     51     341,
     52     352,
     53     355,
     54     361,
     55     366,
     56     370,
     57     374,
     58     399
     59 };
     60 
     61 static const int32_t gIndexes[] = {
     62     0,
     63     2,
     64     7,
     65     16,
     66     20,
     67     24,
     68     24,
     69     34,
     70     45,
     71     49,
     72     55,
     73     59,
     74     79,
     75     80,
     76     91,
     77     94,
     78     100,
     79     105,
     80     109,
     81     113,
     82     138
     83 };
     84 
     85 // Must be sorted alphabetically.
     86 static const char * const gTypes[] = {
     87     "acceleration",
     88     "angle",
     89     "area",
     90     "concentr",
     91     "consumption",
     92     "currency",
     93     "digital",
     94     "duration",
     95     "electric",
     96     "energy",
     97     "frequency",
     98     "length",
     99     "light",
    100     "mass",
    101     "none",
    102     "power",
    103     "pressure",
    104     "speed",
    105     "temperature",
    106     "volume"
    107 };
    108 
    109 // Must be grouped by type and sorted alphabetically within each type.
    110 static const char * const gSubTypes[] = {
    111     "g-force",
    112     "meter-per-second-squared",
    113     "arc-minute",
    114     "arc-second",
    115     "degree",
    116     "radian",
    117     "revolution",
    118     "acre",
    119     "hectare",
    120     "square-centimeter",
    121     "square-foot",
    122     "square-inch",
    123     "square-kilometer",
    124     "square-meter",
    125     "square-mile",
    126     "square-yard",
    127     "karat",
    128     "milligram-per-deciliter",
    129     "millimole-per-liter",
    130     "part-per-million",
    131     "liter-per-100kilometers",
    132     "liter-per-kilometer",
    133     "mile-per-gallon",
    134     "mile-per-gallon-imperial",
    135     "ADP",
    136     "AED",
    137     "AFA",
    138     "AFN",
    139     "ALL",
    140     "AMD",
    141     "ANG",
    142     "AOA",
    143     "AON",
    144     "AOR",
    145     "ARA",
    146     "ARP",
    147     "ARS",
    148     "ATS",
    149     "AUD",
    150     "AWG",
    151     "AYM",
    152     "AZM",
    153     "AZN",
    154     "BAD",
    155     "BAM",
    156     "BBD",
    157     "BDT",
    158     "BEC",
    159     "BEF",
    160     "BEL",
    161     "BGL",
    162     "BGN",
    163     "BHD",
    164     "BIF",
    165     "BMD",
    166     "BND",
    167     "BOB",
    168     "BOV",
    169     "BRC",
    170     "BRE",
    171     "BRL",
    172     "BRN",
    173     "BRR",
    174     "BSD",
    175     "BTN",
    176     "BWP",
    177     "BYB",
    178     "BYN",
    179     "BYR",
    180     "BZD",
    181     "CAD",
    182     "CDF",
    183     "CHC",
    184     "CHE",
    185     "CHF",
    186     "CHW",
    187     "CLF",
    188     "CLP",
    189     "CNY",
    190     "COP",
    191     "COU",
    192     "CRC",
    193     "CSD",
    194     "CSK",
    195     "CUC",
    196     "CUP",
    197     "CVE",
    198     "CYP",
    199     "CZK",
    200     "DDM",
    201     "DEM",
    202     "DJF",
    203     "DKK",
    204     "DOP",
    205     "DZD",
    206     "ECS",
    207     "ECV",
    208     "EEK",
    209     "EGP",
    210     "ERN",
    211     "ESA",
    212     "ESB",
    213     "ESP",
    214     "ETB",
    215     "EUR",
    216     "FIM",
    217     "FJD",
    218     "FKP",
    219     "FRF",
    220     "GBP",
    221     "GEK",
    222     "GEL",
    223     "GHC",
    224     "GHP",
    225     "GHS",
    226     "GIP",
    227     "GMD",
    228     "GNF",
    229     "GQE",
    230     "GRD",
    231     "GTQ",
    232     "GWP",
    233     "GYD",
    234     "HKD",
    235     "HNL",
    236     "HRD",
    237     "HRK",
    238     "HTG",
    239     "HUF",
    240     "IDR",
    241     "IEP",
    242     "ILS",
    243     "INR",
    244     "IQD",
    245     "IRR",
    246     "ISK",
    247     "ITL",
    248     "JMD",
    249     "JOD",
    250     "JPY",
    251     "KES",
    252     "KGS",
    253     "KHR",
    254     "KMF",
    255     "KPW",
    256     "KRW",
    257     "KWD",
    258     "KYD",
    259     "KZT",
    260     "LAK",
    261     "LBP",
    262     "LKR",
    263     "LRD",
    264     "LSL",
    265     "LTL",
    266     "LTT",
    267     "LUC",
    268     "LUF",
    269     "LUL",
    270     "LVL",
    271     "LVR",
    272     "LYD",
    273     "MAD",
    274     "MDL",
    275     "MGA",
    276     "MGF",
    277     "MKD",
    278     "MLF",
    279     "MMK",
    280     "MNT",
    281     "MOP",
    282     "MRO",
    283     "MTL",
    284     "MUR",
    285     "MVR",
    286     "MWK",
    287     "MXN",
    288     "MXV",
    289     "MYR",
    290     "MZM",
    291     "MZN",
    292     "NAD",
    293     "NGN",
    294     "NIO",
    295     "NLG",
    296     "NOK",
    297     "NPR",
    298     "NZD",
    299     "OMR",
    300     "PAB",
    301     "PEI",
    302     "PEN",
    303     "PES",
    304     "PGK",
    305     "PHP",
    306     "PKR",
    307     "PLN",
    308     "PLZ",
    309     "PTE",
    310     "PYG",
    311     "QAR",
    312     "ROL",
    313     "RON",
    314     "RSD",
    315     "RUB",
    316     "RUR",
    317     "RWF",
    318     "SAR",
    319     "SBD",
    320     "SCR",
    321     "SDD",
    322     "SDG",
    323     "SEK",
    324     "SGD",
    325     "SHP",
    326     "SIT",
    327     "SKK",
    328     "SLL",
    329     "SOS",
    330     "SRD",
    331     "SRG",
    332     "SSP",
    333     "STD",
    334     "SVC",
    335     "SYP",
    336     "SZL",
    337     "THB",
    338     "TJR",
    339     "TJS",
    340     "TMM",
    341     "TMT",
    342     "TND",
    343     "TOP",
    344     "TPE",
    345     "TRL",
    346     "TRY",
    347     "TTD",
    348     "TWD",
    349     "TZS",
    350     "UAH",
    351     "UAK",
    352     "UGX",
    353     "USD",
    354     "USN",
    355     "USS",
    356     "UYI",
    357     "UYU",
    358     "UZS",
    359     "VEB",
    360     "VEF",
    361     "VND",
    362     "VUV",
    363     "WST",
    364     "XAF",
    365     "XAG",
    366     "XAU",
    367     "XBA",
    368     "XBB",
    369     "XBC",
    370     "XBD",
    371     "XCD",
    372     "XDR",
    373     "XEU",
    374     "XOF",
    375     "XPD",
    376     "XPF",
    377     "XPT",
    378     "XSU",
    379     "XTS",
    380     "XUA",
    381     "XXX",
    382     "YDD",
    383     "YER",
    384     "YUM",
    385     "YUN",
    386     "ZAL",
    387     "ZAR",
    388     "ZMK",
    389     "ZMW",
    390     "ZRN",
    391     "ZRZ",
    392     "ZWD",
    393     "ZWL",
    394     "ZWN",
    395     "ZWR",
    396     "bit",
    397     "byte",
    398     "gigabit",
    399     "gigabyte",
    400     "kilobit",
    401     "kilobyte",
    402     "megabit",
    403     "megabyte",
    404     "terabit",
    405     "terabyte",
    406     "century",
    407     "day",
    408     "hour",
    409     "microsecond",
    410     "millisecond",
    411     "minute",
    412     "month",
    413     "nanosecond",
    414     "second",
    415     "week",
    416     "year",
    417     "ampere",
    418     "milliampere",
    419     "ohm",
    420     "volt",
    421     "calorie",
    422     "foodcalorie",
    423     "joule",
    424     "kilocalorie",
    425     "kilojoule",
    426     "kilowatt-hour",
    427     "gigahertz",
    428     "hertz",
    429     "kilohertz",
    430     "megahertz",
    431     "astronomical-unit",
    432     "centimeter",
    433     "decimeter",
    434     "fathom",
    435     "foot",
    436     "furlong",
    437     "inch",
    438     "kilometer",
    439     "light-year",
    440     "meter",
    441     "micrometer",
    442     "mile",
    443     "mile-scandinavian",
    444     "millimeter",
    445     "nanometer",
    446     "nautical-mile",
    447     "parsec",
    448     "picometer",
    449     "point",
    450     "yard",
    451     "lux",
    452     "carat",
    453     "gram",
    454     "kilogram",
    455     "metric-ton",
    456     "microgram",
    457     "milligram",
    458     "ounce",
    459     "ounce-troy",
    460     "pound",
    461     "stone",
    462     "ton",
    463     "base",
    464     "percent",
    465     "permille",
    466     "gigawatt",
    467     "horsepower",
    468     "kilowatt",
    469     "megawatt",
    470     "milliwatt",
    471     "watt",
    472     "hectopascal",
    473     "inch-hg",
    474     "millibar",
    475     "millimeter-of-mercury",
    476     "pound-per-square-inch",
    477     "kilometer-per-hour",
    478     "knot",
    479     "meter-per-second",
    480     "mile-per-hour",
    481     "celsius",
    482     "fahrenheit",
    483     "generic",
    484     "kelvin",
    485     "acre-foot",
    486     "bushel",
    487     "centiliter",
    488     "cubic-centimeter",
    489     "cubic-foot",
    490     "cubic-inch",
    491     "cubic-kilometer",
    492     "cubic-meter",
    493     "cubic-mile",
    494     "cubic-yard",
    495     "cup",
    496     "cup-metric",
    497     "deciliter",
    498     "fluid-ounce",
    499     "gallon",
    500     "gallon-imperial",
    501     "hectoliter",
    502     "liter",
    503     "megaliter",
    504     "milliliter",
    505     "pint",
    506     "pint-metric",
    507     "quart",
    508     "tablespoon",
    509     "teaspoon"
    510 };
    511 
    512 // Must be sorted by first value and then second value.
    513 static int32_t unitPerUnitToSingleUnit[][4] = {
    514         {327, 297, 17, 0},
    515         {329, 303, 17, 2},
    516         {331, 297, 17, 3},
    517         {331, 388, 4, 2},
    518         {331, 389, 4, 3},
    519         {346, 386, 3, 1},
    520         {349, 11, 16, 4},
    521         {391, 327, 4, 1}
    522 };
    523 
    524 MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) {
    525     return MeasureUnit::create(0, 0, status);
    526 }
    527 
    528 MeasureUnit *MeasureUnit::createMeterPerSecondSquared(UErrorCode &status) {
    529     return MeasureUnit::create(0, 1, status);
    530 }
    531 
    532 MeasureUnit *MeasureUnit::createArcMinute(UErrorCode &status) {
    533     return MeasureUnit::create(1, 0, status);
    534 }
    535 
    536 MeasureUnit *MeasureUnit::createArcSecond(UErrorCode &status) {
    537     return MeasureUnit::create(1, 1, status);
    538 }
    539 
    540 MeasureUnit *MeasureUnit::createDegree(UErrorCode &status) {
    541     return MeasureUnit::create(1, 2, status);
    542 }
    543 
    544 MeasureUnit *MeasureUnit::createRadian(UErrorCode &status) {
    545     return MeasureUnit::create(1, 3, status);
    546 }
    547 
    548 MeasureUnit *MeasureUnit::createRevolutionAngle(UErrorCode &status) {
    549     return MeasureUnit::create(1, 4, status);
    550 }
    551 
    552 MeasureUnit *MeasureUnit::createAcre(UErrorCode &status) {
    553     return MeasureUnit::create(2, 0, status);
    554 }
    555 
    556 MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) {
    557     return MeasureUnit::create(2, 1, status);
    558 }
    559 
    560 MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) {
    561     return MeasureUnit::create(2, 2, status);
    562 }
    563 
    564 MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) {
    565     return MeasureUnit::create(2, 3, status);
    566 }
    567 
    568 MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) {
    569     return MeasureUnit::create(2, 4, status);
    570 }
    571 
    572 MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) {
    573     return MeasureUnit::create(2, 5, status);
    574 }
    575 
    576 MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) {
    577     return MeasureUnit::create(2, 6, status);
    578 }
    579 
    580 MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) {
    581     return MeasureUnit::create(2, 7, status);
    582 }
    583 
    584 MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) {
    585     return MeasureUnit::create(2, 8, status);
    586 }
    587 
    588 MeasureUnit *MeasureUnit::createKarat(UErrorCode &status) {
    589     return MeasureUnit::create(3, 0, status);
    590 }
    591 
    592 MeasureUnit *MeasureUnit::createMilligramPerDeciliter(UErrorCode &status) {
    593     return MeasureUnit::create(3, 1, status);
    594 }
    595 
    596 MeasureUnit *MeasureUnit::createMillimolePerLiter(UErrorCode &status) {
    597     return MeasureUnit::create(3, 2, status);
    598 }
    599 
    600 MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) {
    601     return MeasureUnit::create(3, 3, status);
    602 }
    603 
    604 MeasureUnit *MeasureUnit::createLiterPer100Kilometers(UErrorCode &status) {
    605     return MeasureUnit::create(4, 0, status);
    606 }
    607 
    608 MeasureUnit *MeasureUnit::createLiterPerKilometer(UErrorCode &status) {
    609     return MeasureUnit::create(4, 1, status);
    610 }
    611 
    612 MeasureUnit *MeasureUnit::createMilePerGallon(UErrorCode &status) {
    613     return MeasureUnit::create(4, 2, status);
    614 }
    615 
    616 MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) {
    617     return MeasureUnit::create(4, 3, status);
    618 }
    619 
    620 MeasureUnit *MeasureUnit::createBit(UErrorCode &status) {
    621     return MeasureUnit::create(6, 0, status);
    622 }
    623 
    624 MeasureUnit *MeasureUnit::createByte(UErrorCode &status) {
    625     return MeasureUnit::create(6, 1, status);
    626 }
    627 
    628 MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) {
    629     return MeasureUnit::create(6, 2, status);
    630 }
    631 
    632 MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) {
    633     return MeasureUnit::create(6, 3, status);
    634 }
    635 
    636 MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) {
    637     return MeasureUnit::create(6, 4, status);
    638 }
    639 
    640 MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) {
    641     return MeasureUnit::create(6, 5, status);
    642 }
    643 
    644 MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) {
    645     return MeasureUnit::create(6, 6, status);
    646 }
    647 
    648 MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) {
    649     return MeasureUnit::create(6, 7, status);
    650 }
    651 
    652 MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) {
    653     return MeasureUnit::create(6, 8, status);
    654 }
    655 
    656 MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) {
    657     return MeasureUnit::create(6, 9, status);
    658 }
    659 
    660 MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) {
    661     return MeasureUnit::create(7, 0, status);
    662 }
    663 
    664 MeasureUnit *MeasureUnit::createDay(UErrorCode &status) {
    665     return MeasureUnit::create(7, 1, status);
    666 }
    667 
    668 MeasureUnit *MeasureUnit::createHour(UErrorCode &status) {
    669     return MeasureUnit::create(7, 2, status);
    670 }
    671 
    672 MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) {
    673     return MeasureUnit::create(7, 3, status);
    674 }
    675 
    676 MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) {
    677     return MeasureUnit::create(7, 4, status);
    678 }
    679 
    680 MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) {
    681     return MeasureUnit::create(7, 5, status);
    682 }
    683 
    684 MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) {
    685     return MeasureUnit::create(7, 6, status);
    686 }
    687 
    688 MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) {
    689     return MeasureUnit::create(7, 7, status);
    690 }
    691 
    692 MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) {
    693     return MeasureUnit::create(7, 8, status);
    694 }
    695 
    696 MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) {
    697     return MeasureUnit::create(7, 9, status);
    698 }
    699 
    700 MeasureUnit *MeasureUnit::createYear(UErrorCode &status) {
    701     return MeasureUnit::create(7, 10, status);
    702 }
    703 
    704 MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) {
    705     return MeasureUnit::create(8, 0, status);
    706 }
    707 
    708 MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) {
    709     return MeasureUnit::create(8, 1, status);
    710 }
    711 
    712 MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) {
    713     return MeasureUnit::create(8, 2, status);
    714 }
    715 
    716 MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) {
    717     return MeasureUnit::create(8, 3, status);
    718 }
    719 
    720 MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) {
    721     return MeasureUnit::create(9, 0, status);
    722 }
    723 
    724 MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) {
    725     return MeasureUnit::create(9, 1, status);
    726 }
    727 
    728 MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) {
    729     return MeasureUnit::create(9, 2, status);
    730 }
    731 
    732 MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) {
    733     return MeasureUnit::create(9, 3, status);
    734 }
    735 
    736 MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) {
    737     return MeasureUnit::create(9, 4, status);
    738 }
    739 
    740 MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) {
    741     return MeasureUnit::create(9, 5, status);
    742 }
    743 
    744 MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) {
    745     return MeasureUnit::create(10, 0, status);
    746 }
    747 
    748 MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) {
    749     return MeasureUnit::create(10, 1, status);
    750 }
    751 
    752 MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) {
    753     return MeasureUnit::create(10, 2, status);
    754 }
    755 
    756 MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) {
    757     return MeasureUnit::create(10, 3, status);
    758 }
    759 
    760 MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) {
    761     return MeasureUnit::create(11, 0, status);
    762 }
    763 
    764 MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) {
    765     return MeasureUnit::create(11, 1, status);
    766 }
    767 
    768 MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) {
    769     return MeasureUnit::create(11, 2, status);
    770 }
    771 
    772 MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) {
    773     return MeasureUnit::create(11, 3, status);
    774 }
    775 
    776 MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) {
    777     return MeasureUnit::create(11, 4, status);
    778 }
    779 
    780 MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) {
    781     return MeasureUnit::create(11, 5, status);
    782 }
    783 
    784 MeasureUnit *MeasureUnit::createInch(UErrorCode &status) {
    785     return MeasureUnit::create(11, 6, status);
    786 }
    787 
    788 MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) {
    789     return MeasureUnit::create(11, 7, status);
    790 }
    791 
    792 MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) {
    793     return MeasureUnit::create(11, 8, status);
    794 }
    795 
    796 MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) {
    797     return MeasureUnit::create(11, 9, status);
    798 }
    799 
    800 MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) {
    801     return MeasureUnit::create(11, 10, status);
    802 }
    803 
    804 MeasureUnit *MeasureUnit::createMile(UErrorCode &status) {
    805     return MeasureUnit::create(11, 11, status);
    806 }
    807 
    808 MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) {
    809     return MeasureUnit::create(11, 12, status);
    810 }
    811 
    812 MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) {
    813     return MeasureUnit::create(11, 13, status);
    814 }
    815 
    816 MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) {
    817     return MeasureUnit::create(11, 14, status);
    818 }
    819 
    820 MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) {
    821     return MeasureUnit::create(11, 15, status);
    822 }
    823 
    824 MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) {
    825     return MeasureUnit::create(11, 16, status);
    826 }
    827 
    828 MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) {
    829     return MeasureUnit::create(11, 17, status);
    830 }
    831 
    832 MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) {
    833     return MeasureUnit::create(11, 18, status);
    834 }
    835 
    836 MeasureUnit *MeasureUnit::createYard(UErrorCode &status) {
    837     return MeasureUnit::create(11, 19, status);
    838 }
    839 
    840 MeasureUnit *MeasureUnit::createLux(UErrorCode &status) {
    841     return MeasureUnit::create(12, 0, status);
    842 }
    843 
    844 MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) {
    845     return MeasureUnit::create(13, 0, status);
    846 }
    847 
    848 MeasureUnit *MeasureUnit::createGram(UErrorCode &status) {
    849     return MeasureUnit::create(13, 1, status);
    850 }
    851 
    852 MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) {
    853     return MeasureUnit::create(13, 2, status);
    854 }
    855 
    856 MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) {
    857     return MeasureUnit::create(13, 3, status);
    858 }
    859 
    860 MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) {
    861     return MeasureUnit::create(13, 4, status);
    862 }
    863 
    864 MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) {
    865     return MeasureUnit::create(13, 5, status);
    866 }
    867 
    868 MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) {
    869     return MeasureUnit::create(13, 6, status);
    870 }
    871 
    872 MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) {
    873     return MeasureUnit::create(13, 7, status);
    874 }
    875 
    876 MeasureUnit *MeasureUnit::createPound(UErrorCode &status) {
    877     return MeasureUnit::create(13, 8, status);
    878 }
    879 
    880 MeasureUnit *MeasureUnit::createStone(UErrorCode &status) {
    881     return MeasureUnit::create(13, 9, status);
    882 }
    883 
    884 MeasureUnit *MeasureUnit::createTon(UErrorCode &status) {
    885     return MeasureUnit::create(13, 10, status);
    886 }
    887 
    888 MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) {
    889     return MeasureUnit::create(15, 0, status);
    890 }
    891 
    892 MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) {
    893     return MeasureUnit::create(15, 1, status);
    894 }
    895 
    896 MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) {
    897     return MeasureUnit::create(15, 2, status);
    898 }
    899 
    900 MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) {
    901     return MeasureUnit::create(15, 3, status);
    902 }
    903 
    904 MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) {
    905     return MeasureUnit::create(15, 4, status);
    906 }
    907 
    908 MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) {
    909     return MeasureUnit::create(15, 5, status);
    910 }
    911 
    912 MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) {
    913     return MeasureUnit::create(16, 0, status);
    914 }
    915 
    916 MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) {
    917     return MeasureUnit::create(16, 1, status);
    918 }
    919 
    920 MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) {
    921     return MeasureUnit::create(16, 2, status);
    922 }
    923 
    924 MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) {
    925     return MeasureUnit::create(16, 3, status);
    926 }
    927 
    928 MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) {
    929     return MeasureUnit::create(16, 4, status);
    930 }
    931 
    932 MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) {
    933     return MeasureUnit::create(17, 0, status);
    934 }
    935 
    936 MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) {
    937     return MeasureUnit::create(17, 1, status);
    938 }
    939 
    940 MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) {
    941     return MeasureUnit::create(17, 2, status);
    942 }
    943 
    944 MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) {
    945     return MeasureUnit::create(17, 3, status);
    946 }
    947 
    948 MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) {
    949     return MeasureUnit::create(18, 0, status);
    950 }
    951 
    952 MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) {
    953     return MeasureUnit::create(18, 1, status);
    954 }
    955 
    956 MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) {
    957     return MeasureUnit::create(18, 2, status);
    958 }
    959 
    960 MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) {
    961     return MeasureUnit::create(18, 3, status);
    962 }
    963 
    964 MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) {
    965     return MeasureUnit::create(19, 0, status);
    966 }
    967 
    968 MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) {
    969     return MeasureUnit::create(19, 1, status);
    970 }
    971 
    972 MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) {
    973     return MeasureUnit::create(19, 2, status);
    974 }
    975 
    976 MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) {
    977     return MeasureUnit::create(19, 3, status);
    978 }
    979 
    980 MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) {
    981     return MeasureUnit::create(19, 4, status);
    982 }
    983 
    984 MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) {
    985     return MeasureUnit::create(19, 5, status);
    986 }
    987 
    988 MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) {
    989     return MeasureUnit::create(19, 6, status);
    990 }
    991 
    992 MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) {
    993     return MeasureUnit::create(19, 7, status);
    994 }
    995 
    996 MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) {
    997     return MeasureUnit::create(19, 8, status);
    998 }
    999 
   1000 MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) {
   1001     return MeasureUnit::create(19, 9, status);
   1002 }
   1003 
   1004 MeasureUnit *MeasureUnit::createCup(UErrorCode &status) {
   1005     return MeasureUnit::create(19, 10, status);
   1006 }
   1007 
   1008 MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) {
   1009     return MeasureUnit::create(19, 11, status);
   1010 }
   1011 
   1012 MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) {
   1013     return MeasureUnit::create(19, 12, status);
   1014 }
   1015 
   1016 MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) {
   1017     return MeasureUnit::create(19, 13, status);
   1018 }
   1019 
   1020 MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) {
   1021     return MeasureUnit::create(19, 14, status);
   1022 }
   1023 
   1024 MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) {
   1025     return MeasureUnit::create(19, 15, status);
   1026 }
   1027 
   1028 MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) {
   1029     return MeasureUnit::create(19, 16, status);
   1030 }
   1031 
   1032 MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) {
   1033     return MeasureUnit::create(19, 17, status);
   1034 }
   1035 
   1036 MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) {
   1037     return MeasureUnit::create(19, 18, status);
   1038 }
   1039 
   1040 MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) {
   1041     return MeasureUnit::create(19, 19, status);
   1042 }
   1043 
   1044 MeasureUnit *MeasureUnit::createPint(UErrorCode &status) {
   1045     return MeasureUnit::create(19, 20, status);
   1046 }
   1047 
   1048 MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) {
   1049     return MeasureUnit::create(19, 21, status);
   1050 }
   1051 
   1052 MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) {
   1053     return MeasureUnit::create(19, 22, status);
   1054 }
   1055 
   1056 MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) {
   1057     return MeasureUnit::create(19, 23, status);
   1058 }
   1059 
   1060 MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) {
   1061     return MeasureUnit::create(19, 24, status);
   1062 }
   1063 
   1064 // End generated code
   1065 
   1066 static int32_t binarySearch(
   1067         const char * const * array, int32_t start, int32_t end, const char * key) {
   1068     while (start < end) {
   1069         int32_t mid = (start + end) / 2;
   1070         int32_t cmp = uprv_strcmp(array[mid], key);
   1071         if (cmp < 0) {
   1072             start = mid + 1;
   1073             continue;
   1074         }
   1075         if (cmp == 0) {
   1076             return mid;
   1077         }
   1078         end = mid;
   1079     }
   1080     return -1;
   1081 }
   1082 
   1083 MeasureUnit::MeasureUnit() {
   1084     fCurrency[0] = 0;
   1085     initNoUnit("base");
   1086 }
   1087 
   1088 MeasureUnit::MeasureUnit(const MeasureUnit &other)
   1089         : fTypeId(other.fTypeId), fSubTypeId(other.fSubTypeId) {
   1090     uprv_strcpy(fCurrency, other.fCurrency);
   1091 }
   1092 
   1093 MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) {
   1094     if (this == &other) {
   1095         return *this;
   1096     }
   1097     fTypeId = other.fTypeId;
   1098     fSubTypeId = other.fSubTypeId;
   1099     uprv_strcpy(fCurrency, other.fCurrency);
   1100     return *this;
   1101 }
   1102 
   1103 UObject *MeasureUnit::clone() const {
   1104     return new MeasureUnit(*this);
   1105 }
   1106 
   1107 MeasureUnit::~MeasureUnit() {
   1108 }
   1109 
   1110 const char *MeasureUnit::getType() const {
   1111     return gTypes[fTypeId];
   1112 }
   1113 
   1114 const char *MeasureUnit::getSubtype() const {
   1115     return fCurrency[0] == 0 ? gSubTypes[getOffset()] : fCurrency;
   1116 }
   1117 
   1118 UBool MeasureUnit::operator==(const UObject& other) const {
   1119     if (this == &other) {  // Same object, equal
   1120         return TRUE;
   1121     }
   1122     if (typeid(*this) != typeid(other)) { // Different types, not equal
   1123         return FALSE;
   1124     }
   1125     const MeasureUnit &rhs = static_cast<const MeasureUnit&>(other);
   1126     return (
   1127             fTypeId == rhs.fTypeId
   1128             && fSubTypeId == rhs.fSubTypeId
   1129             && uprv_strcmp(fCurrency, rhs.fCurrency) == 0);
   1130 }
   1131 
   1132 int32_t MeasureUnit::getIndex() const {
   1133     return gIndexes[fTypeId] + fSubTypeId;
   1134 }
   1135 
   1136 int32_t MeasureUnit::getAvailable(
   1137         MeasureUnit *dest,
   1138         int32_t destCapacity,
   1139         UErrorCode &errorCode) {
   1140     if (U_FAILURE(errorCode)) {
   1141         return 0;
   1142     }
   1143     if (destCapacity < UPRV_LENGTHOF(gSubTypes)) {
   1144         errorCode = U_BUFFER_OVERFLOW_ERROR;
   1145         return UPRV_LENGTHOF(gSubTypes);
   1146     }
   1147     int32_t idx = 0;
   1148     for (int32_t typeIdx = 0; typeIdx < UPRV_LENGTHOF(gTypes); ++typeIdx) {
   1149         int32_t len = gOffsets[typeIdx + 1] - gOffsets[typeIdx];
   1150         for (int32_t subTypeIdx = 0; subTypeIdx < len; ++subTypeIdx) {
   1151             dest[idx].setTo(typeIdx, subTypeIdx);
   1152             ++idx;
   1153         }
   1154     }
   1155     U_ASSERT(idx == UPRV_LENGTHOF(gSubTypes));
   1156     return UPRV_LENGTHOF(gSubTypes);
   1157 }
   1158 
   1159 int32_t MeasureUnit::getAvailable(
   1160         const char *type,
   1161         MeasureUnit *dest,
   1162         int32_t destCapacity,
   1163         UErrorCode &errorCode) {
   1164     if (U_FAILURE(errorCode)) {
   1165         return 0;
   1166     }
   1167     int32_t typeIdx = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), type);
   1168     if (typeIdx == -1) {
   1169         return 0;
   1170     }
   1171     int32_t len = gOffsets[typeIdx + 1] - gOffsets[typeIdx];
   1172     if (destCapacity < len) {
   1173         errorCode = U_BUFFER_OVERFLOW_ERROR;
   1174         return len;
   1175     }
   1176     for (int subTypeIdx = 0; subTypeIdx < len; ++subTypeIdx) {
   1177         dest[subTypeIdx].setTo(typeIdx, subTypeIdx);
   1178     }
   1179     return len;
   1180 }
   1181 
   1182 StringEnumeration* MeasureUnit::getAvailableTypes(UErrorCode &errorCode) {
   1183     UEnumeration *uenum = uenum_openCharStringsEnumeration(
   1184             gTypes, UPRV_LENGTHOF(gTypes), &errorCode);
   1185     if (U_FAILURE(errorCode)) {
   1186         uenum_close(uenum);
   1187         return NULL;
   1188     }
   1189     StringEnumeration *result = new UStringEnumeration(uenum);
   1190     if (result == NULL) {
   1191         errorCode = U_MEMORY_ALLOCATION_ERROR;
   1192         uenum_close(uenum);
   1193         return NULL;
   1194     }
   1195     return result;
   1196 }
   1197 
   1198 int32_t MeasureUnit::getIndexCount() {
   1199     return gIndexes[UPRV_LENGTHOF(gIndexes) - 1];
   1200 }
   1201 
   1202 int32_t MeasureUnit::internalGetIndexForTypeAndSubtype(const char *type, const char *subtype) {
   1203     int32_t t = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), type);
   1204     if (t < 0) {
   1205         return t;
   1206     }
   1207     int32_t st = binarySearch(gSubTypes, gOffsets[t], gOffsets[t + 1], subtype);
   1208     if (st < 0) {
   1209         return st;
   1210     }
   1211     return gIndexes[t] + st - gOffsets[t];
   1212 }
   1213 
   1214 MeasureUnit *MeasureUnit::resolveUnitPerUnit(
   1215         const MeasureUnit &unit, const MeasureUnit &perUnit) {
   1216     int32_t unitOffset = unit.getOffset();
   1217     int32_t perUnitOffset = perUnit.getOffset();
   1218 
   1219     // binary search for (unitOffset, perUnitOffset)
   1220     int32_t start = 0;
   1221     int32_t end = UPRV_LENGTHOF(unitPerUnitToSingleUnit);
   1222     while (start < end) {
   1223         int32_t mid = (start + end) / 2;
   1224         int32_t *midRow = unitPerUnitToSingleUnit[mid];
   1225         if (unitOffset < midRow[0]) {
   1226             end = mid;
   1227         } else if (unitOffset > midRow[0]) {
   1228             start = mid + 1;
   1229         } else if (perUnitOffset < midRow[1]) {
   1230             end = mid;
   1231         } else if (perUnitOffset > midRow[1]) {
   1232             start = mid + 1;
   1233         } else {
   1234             // We found a resolution for our unit / per-unit combo
   1235             // return it.
   1236             return new MeasureUnit(midRow[2], midRow[3]);
   1237         }
   1238     }
   1239     return NULL;
   1240 }
   1241 
   1242 MeasureUnit *MeasureUnit::create(int typeId, int subTypeId, UErrorCode &status) {
   1243     if (U_FAILURE(status)) {
   1244         return NULL;
   1245     }
   1246     MeasureUnit *result = new MeasureUnit(typeId, subTypeId);
   1247     if (result == NULL) {
   1248         status = U_MEMORY_ALLOCATION_ERROR;
   1249     }
   1250     return result;
   1251 }
   1252 
   1253 void MeasureUnit::initTime(const char *timeId) {
   1254     int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "duration");
   1255     U_ASSERT(result != -1);
   1256     fTypeId = result;
   1257     result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], timeId);
   1258     U_ASSERT(result != -1);
   1259     fSubTypeId = result - gOffsets[fTypeId];
   1260 }
   1261 
   1262 void MeasureUnit::initCurrency(const char *isoCurrency) {
   1263     int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "currency");
   1264     U_ASSERT(result != -1);
   1265     fTypeId = result;
   1266     result = binarySearch(
   1267             gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency);
   1268     if (result != -1) {
   1269         fSubTypeId = result - gOffsets[fTypeId];
   1270     } else {
   1271         uprv_strncpy(fCurrency, isoCurrency, UPRV_LENGTHOF(fCurrency));
   1272         fCurrency[3] = 0;
   1273     }
   1274 }
   1275 
   1276 void MeasureUnit::initNoUnit(const char *subtype) {
   1277     int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "none");
   1278     U_ASSERT(result != -1);
   1279     fTypeId = result;
   1280     result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], subtype);
   1281     U_ASSERT(result != -1);
   1282     fSubTypeId = result - gOffsets[fTypeId];
   1283 }
   1284 
   1285 void MeasureUnit::setTo(int32_t typeId, int32_t subTypeId) {
   1286     fTypeId = typeId;
   1287     fSubTypeId = subTypeId;
   1288     fCurrency[0] = 0;
   1289 }
   1290 
   1291 int32_t MeasureUnit::getOffset() const {
   1292     return gOffsets[fTypeId] + fSubTypeId;
   1293 }
   1294 
   1295 U_NAMESPACE_END
   1296 
   1297 #endif /* !UNCONFIG_NO_FORMATTING */
   1298