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     17,
42     25,
43     29,
44     328,
45     339,
46     355,
47     359,
48     368,
49     370,
50     374,
51     381,
52     402,
53     404,
54     418,
55     421,
56     427,
57     437,
58     441,
59     445,
60     447,
61     474
62 };
63 
64 static const int32_t gIndexes[] = {
65     0,
66     2,
67     7,
68     17,
69     25,
70     29,
71     29,
72     40,
73     56,
74     60,
75     69,
76     71,
77     75,
78     82,
79     103,
80     105,
81     119,
82     122,
83     128,
84     138,
85     142,
86     146,
87     148,
88     175
89 };
90 
91 // Must be sorted alphabetically.
92 static const char * const gTypes[] = {
93     "acceleration",
94     "angle",
95     "area",
96     "concentr",
97     "consumption",
98     "currency",
99     "digital",
100     "duration",
101     "electric",
102     "energy",
103     "force",
104     "frequency",
105     "graphics",
106     "length",
107     "light",
108     "mass",
109     "none",
110     "power",
111     "pressure",
112     "speed",
113     "temperature",
114     "torque",
115     "volume"
116 };
117 
118 // Must be grouped by type and sorted alphabetically within each type.
119 static const char * const gSubTypes[] = {
120     "g-force",
121     "meter-per-second-squared",
122     "arc-minute",
123     "arc-second",
124     "degree",
125     "radian",
126     "revolution",
127     "acre",
128     "dunam",
129     "hectare",
130     "square-centimeter",
131     "square-foot",
132     "square-inch",
133     "square-kilometer",
134     "square-meter",
135     "square-mile",
136     "square-yard",
137     "karat",
138     "milligram-per-deciliter",
139     "millimole-per-liter",
140     "mole",
141     "part-per-million",
142     "percent",
143     "permille",
144     "permyriad",
145     "liter-per-100kilometers",
146     "liter-per-kilometer",
147     "mile-per-gallon",
148     "mile-per-gallon-imperial",
149     "ADP",
150     "AED",
151     "AFA",
152     "AFN",
153     "ALK",
154     "ALL",
155     "AMD",
156     "ANG",
157     "AOA",
158     "AOK",
159     "AON",
160     "AOR",
161     "ARA",
162     "ARP",
163     "ARS",
164     "ARY",
165     "ATS",
166     "AUD",
167     "AWG",
168     "AYM",
169     "AZM",
170     "AZN",
171     "BAD",
172     "BAM",
173     "BBD",
174     "BDT",
175     "BEC",
176     "BEF",
177     "BEL",
178     "BGJ",
179     "BGK",
180     "BGL",
181     "BGN",
182     "BHD",
183     "BIF",
184     "BMD",
185     "BND",
186     "BOB",
187     "BOP",
188     "BOV",
189     "BRB",
190     "BRC",
191     "BRE",
192     "BRL",
193     "BRN",
194     "BRR",
195     "BSD",
196     "BTN",
197     "BUK",
198     "BWP",
199     "BYB",
200     "BYN",
201     "BYR",
202     "BZD",
203     "CAD",
204     "CDF",
205     "CHC",
206     "CHE",
207     "CHF",
208     "CHW",
209     "CLF",
210     "CLP",
211     "CNY",
212     "COP",
213     "COU",
214     "CRC",
215     "CSD",
216     "CSJ",
217     "CSK",
218     "CUC",
219     "CUP",
220     "CVE",
221     "CYP",
222     "CZK",
223     "DDM",
224     "DEM",
225     "DJF",
226     "DKK",
227     "DOP",
228     "DZD",
229     "ECS",
230     "ECV",
231     "EEK",
232     "EGP",
233     "ERN",
234     "ESA",
235     "ESB",
236     "ESP",
237     "ETB",
238     "EUR",
239     "FIM",
240     "FJD",
241     "FKP",
242     "FRF",
243     "GBP",
244     "GEK",
245     "GEL",
246     "GHC",
247     "GHP",
248     "GHS",
249     "GIP",
250     "GMD",
251     "GNE",
252     "GNF",
253     "GNS",
254     "GQE",
255     "GRD",
256     "GTQ",
257     "GWE",
258     "GWP",
259     "GYD",
260     "HKD",
261     "HNL",
262     "HRD",
263     "HRK",
264     "HTG",
265     "HUF",
266     "IDR",
267     "IEP",
268     "ILP",
269     "ILR",
270     "ILS",
271     "INR",
272     "IQD",
273     "IRR",
274     "ISJ",
275     "ISK",
276     "ITL",
277     "JMD",
278     "JOD",
279     "JPY",
280     "KES",
281     "KGS",
282     "KHR",
283     "KMF",
284     "KPW",
285     "KRW",
286     "KWD",
287     "KYD",
288     "KZT",
289     "LAJ",
290     "LAK",
291     "LBP",
292     "LKR",
293     "LRD",
294     "LSL",
295     "LSM",
296     "LTL",
297     "LTT",
298     "LUC",
299     "LUF",
300     "LUL",
301     "LVL",
302     "LVR",
303     "LYD",
304     "MAD",
305     "MDL",
306     "MGA",
307     "MGF",
308     "MKD",
309     "MLF",
310     "MMK",
311     "MNT",
312     "MOP",
313     "MRO",
314     "MRU",
315     "MTL",
316     "MTP",
317     "MUR",
318     "MVQ",
319     "MVR",
320     "MWK",
321     "MXN",
322     "MXP",
323     "MXV",
324     "MYR",
325     "MZE",
326     "MZM",
327     "MZN",
328     "NAD",
329     "NGN",
330     "NIC",
331     "NIO",
332     "NLG",
333     "NOK",
334     "NPR",
335     "NZD",
336     "OMR",
337     "PAB",
338     "PEH",
339     "PEI",
340     "PEN",
341     "PES",
342     "PGK",
343     "PHP",
344     "PKR",
345     "PLN",
346     "PLZ",
347     "PTE",
348     "PYG",
349     "QAR",
350     "RHD",
351     "ROK",
352     "ROL",
353     "RON",
354     "RSD",
355     "RUB",
356     "RUR",
357     "RWF",
358     "SAR",
359     "SBD",
360     "SCR",
361     "SDD",
362     "SDG",
363     "SDP",
364     "SEK",
365     "SGD",
366     "SHP",
367     "SIT",
368     "SKK",
369     "SLL",
370     "SOS",
371     "SRD",
372     "SRG",
373     "SSP",
374     "STD",
375     "STN",
376     "SUR",
377     "SVC",
378     "SYP",
379     "SZL",
380     "THB",
381     "TJR",
382     "TJS",
383     "TMM",
384     "TMT",
385     "TND",
386     "TOP",
387     "TPE",
388     "TRL",
389     "TRY",
390     "TTD",
391     "TWD",
392     "TZS",
393     "UAH",
394     "UAK",
395     "UGS",
396     "UGW",
397     "UGX",
398     "USD",
399     "USN",
400     "USS",
401     "UYI",
402     "UYN",
403     "UYP",
404     "UYU",
405     "UYW",
406     "UZS",
407     "VEB",
408     "VEF",
409     "VES",
410     "VNC",
411     "VND",
412     "VUV",
413     "WST",
414     "XAF",
415     "XAG",
416     "XAU",
417     "XBA",
418     "XBB",
419     "XBC",
420     "XBD",
421     "XCD",
422     "XDR",
423     "XEU",
424     "XOF",
425     "XPD",
426     "XPF",
427     "XPT",
428     "XSU",
429     "XTS",
430     "XUA",
431     "XXX",
432     "YDD",
433     "YER",
434     "YUD",
435     "YUM",
436     "YUN",
437     "ZAL",
438     "ZAR",
439     "ZMK",
440     "ZMW",
441     "ZRN",
442     "ZRZ",
443     "ZWC",
444     "ZWD",
445     "ZWL",
446     "ZWN",
447     "ZWR",
448     "bit",
449     "byte",
450     "gigabit",
451     "gigabyte",
452     "kilobit",
453     "kilobyte",
454     "megabit",
455     "megabyte",
456     "petabyte",
457     "terabit",
458     "terabyte",
459     "century",
460     "day",
461     "day-person",
462     "decade",
463     "hour",
464     "microsecond",
465     "millisecond",
466     "minute",
467     "month",
468     "month-person",
469     "nanosecond",
470     "second",
471     "week",
472     "week-person",
473     "year",
474     "year-person",
475     "ampere",
476     "milliampere",
477     "ohm",
478     "volt",
479     "british-thermal-unit",
480     "calorie",
481     "electronvolt",
482     "foodcalorie",
483     "joule",
484     "kilocalorie",
485     "kilojoule",
486     "kilowatt-hour",
487     "therm-us",
488     "newton",
489     "pound-force",
490     "gigahertz",
491     "hertz",
492     "kilohertz",
493     "megahertz",
494     "dot-per-centimeter",
495     "dot-per-inch",
496     "em",
497     "megapixel",
498     "pixel",
499     "pixel-per-centimeter",
500     "pixel-per-inch",
501     "astronomical-unit",
502     "centimeter",
503     "decimeter",
504     "fathom",
505     "foot",
506     "furlong",
507     "inch",
508     "kilometer",
509     "light-year",
510     "meter",
511     "micrometer",
512     "mile",
513     "mile-scandinavian",
514     "millimeter",
515     "nanometer",
516     "nautical-mile",
517     "parsec",
518     "picometer",
519     "point",
520     "solar-radius",
521     "yard",
522     "lux",
523     "solar-luminosity",
524     "carat",
525     "dalton",
526     "earth-mass",
527     "gram",
528     "kilogram",
529     "metric-ton",
530     "microgram",
531     "milligram",
532     "ounce",
533     "ounce-troy",
534     "pound",
535     "solar-mass",
536     "stone",
537     "ton",
538     "base",
539     "percent",
540     "permille",
541     "gigawatt",
542     "horsepower",
543     "kilowatt",
544     "megawatt",
545     "milliwatt",
546     "watt",
547     "atmosphere",
548     "bar",
549     "hectopascal",
550     "inch-hg",
551     "kilopascal",
552     "megapascal",
553     "millibar",
554     "millimeter-of-mercury",
555     "pascal",
556     "pound-per-square-inch",
557     "kilometer-per-hour",
558     "knot",
559     "meter-per-second",
560     "mile-per-hour",
561     "celsius",
562     "fahrenheit",
563     "generic",
564     "kelvin",
565     "newton-meter",
566     "pound-foot",
567     "acre-foot",
568     "barrel",
569     "bushel",
570     "centiliter",
571     "cubic-centimeter",
572     "cubic-foot",
573     "cubic-inch",
574     "cubic-kilometer",
575     "cubic-meter",
576     "cubic-mile",
577     "cubic-yard",
578     "cup",
579     "cup-metric",
580     "deciliter",
581     "fluid-ounce",
582     "fluid-ounce-imperial",
583     "gallon",
584     "gallon-imperial",
585     "hectoliter",
586     "liter",
587     "megaliter",
588     "milliliter",
589     "pint",
590     "pint-metric",
591     "quart",
592     "tablespoon",
593     "teaspoon"
594 };
595 
596 // Must be sorted by first value and then second value.
597 static int32_t unitPerUnitToSingleUnit[][4] = {
598         {378, 382, 12, 5},
599         {378, 387, 12, 6},
600         {388, 343, 19, 0},
601         {390, 350, 19, 2},
602         {392, 343, 19, 3},
603         {392, 463, 4, 2},
604         {392, 464, 4, 3},
605         {411, 460, 3, 1},
606         {414, 12, 18, 9},
607         {466, 388, 4, 1}
608 };
609 
610 // Shortcuts to the base unit in order to make the default constructor fast
611 static const int32_t kBaseTypeIdx = 16;
612 static const int32_t kBaseSubTypeIdx = 0;
613 
createGForce(UErrorCode & status)614 MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) {
615     return MeasureUnit::create(0, 0, status);
616 }
617 
getGForce()618 MeasureUnit MeasureUnit::getGForce() {
619     return MeasureUnit(0, 0);
620 }
621 
createMeterPerSecondSquared(UErrorCode & status)622 MeasureUnit *MeasureUnit::createMeterPerSecondSquared(UErrorCode &status) {
623     return MeasureUnit::create(0, 1, status);
624 }
625 
getMeterPerSecondSquared()626 MeasureUnit MeasureUnit::getMeterPerSecondSquared() {
627     return MeasureUnit(0, 1);
628 }
629 
createArcMinute(UErrorCode & status)630 MeasureUnit *MeasureUnit::createArcMinute(UErrorCode &status) {
631     return MeasureUnit::create(1, 0, status);
632 }
633 
getArcMinute()634 MeasureUnit MeasureUnit::getArcMinute() {
635     return MeasureUnit(1, 0);
636 }
637 
createArcSecond(UErrorCode & status)638 MeasureUnit *MeasureUnit::createArcSecond(UErrorCode &status) {
639     return MeasureUnit::create(1, 1, status);
640 }
641 
getArcSecond()642 MeasureUnit MeasureUnit::getArcSecond() {
643     return MeasureUnit(1, 1);
644 }
645 
createDegree(UErrorCode & status)646 MeasureUnit *MeasureUnit::createDegree(UErrorCode &status) {
647     return MeasureUnit::create(1, 2, status);
648 }
649 
getDegree()650 MeasureUnit MeasureUnit::getDegree() {
651     return MeasureUnit(1, 2);
652 }
653 
createRadian(UErrorCode & status)654 MeasureUnit *MeasureUnit::createRadian(UErrorCode &status) {
655     return MeasureUnit::create(1, 3, status);
656 }
657 
getRadian()658 MeasureUnit MeasureUnit::getRadian() {
659     return MeasureUnit(1, 3);
660 }
661 
createRevolutionAngle(UErrorCode & status)662 MeasureUnit *MeasureUnit::createRevolutionAngle(UErrorCode &status) {
663     return MeasureUnit::create(1, 4, status);
664 }
665 
getRevolutionAngle()666 MeasureUnit MeasureUnit::getRevolutionAngle() {
667     return MeasureUnit(1, 4);
668 }
669 
createAcre(UErrorCode & status)670 MeasureUnit *MeasureUnit::createAcre(UErrorCode &status) {
671     return MeasureUnit::create(2, 0, status);
672 }
673 
getAcre()674 MeasureUnit MeasureUnit::getAcre() {
675     return MeasureUnit(2, 0);
676 }
677 
createDunam(UErrorCode & status)678 MeasureUnit *MeasureUnit::createDunam(UErrorCode &status) {
679     return MeasureUnit::create(2, 1, status);
680 }
681 
getDunam()682 MeasureUnit MeasureUnit::getDunam() {
683     return MeasureUnit(2, 1);
684 }
685 
createHectare(UErrorCode & status)686 MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) {
687     return MeasureUnit::create(2, 2, status);
688 }
689 
getHectare()690 MeasureUnit MeasureUnit::getHectare() {
691     return MeasureUnit(2, 2);
692 }
693 
createSquareCentimeter(UErrorCode & status)694 MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) {
695     return MeasureUnit::create(2, 3, status);
696 }
697 
getSquareCentimeter()698 MeasureUnit MeasureUnit::getSquareCentimeter() {
699     return MeasureUnit(2, 3);
700 }
701 
createSquareFoot(UErrorCode & status)702 MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) {
703     return MeasureUnit::create(2, 4, status);
704 }
705 
getSquareFoot()706 MeasureUnit MeasureUnit::getSquareFoot() {
707     return MeasureUnit(2, 4);
708 }
709 
createSquareInch(UErrorCode & status)710 MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) {
711     return MeasureUnit::create(2, 5, status);
712 }
713 
getSquareInch()714 MeasureUnit MeasureUnit::getSquareInch() {
715     return MeasureUnit(2, 5);
716 }
717 
createSquareKilometer(UErrorCode & status)718 MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) {
719     return MeasureUnit::create(2, 6, status);
720 }
721 
getSquareKilometer()722 MeasureUnit MeasureUnit::getSquareKilometer() {
723     return MeasureUnit(2, 6);
724 }
725 
createSquareMeter(UErrorCode & status)726 MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) {
727     return MeasureUnit::create(2, 7, status);
728 }
729 
getSquareMeter()730 MeasureUnit MeasureUnit::getSquareMeter() {
731     return MeasureUnit(2, 7);
732 }
733 
createSquareMile(UErrorCode & status)734 MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) {
735     return MeasureUnit::create(2, 8, status);
736 }
737 
getSquareMile()738 MeasureUnit MeasureUnit::getSquareMile() {
739     return MeasureUnit(2, 8);
740 }
741 
createSquareYard(UErrorCode & status)742 MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) {
743     return MeasureUnit::create(2, 9, status);
744 }
745 
getSquareYard()746 MeasureUnit MeasureUnit::getSquareYard() {
747     return MeasureUnit(2, 9);
748 }
749 
createKarat(UErrorCode & status)750 MeasureUnit *MeasureUnit::createKarat(UErrorCode &status) {
751     return MeasureUnit::create(3, 0, status);
752 }
753 
getKarat()754 MeasureUnit MeasureUnit::getKarat() {
755     return MeasureUnit(3, 0);
756 }
757 
createMilligramPerDeciliter(UErrorCode & status)758 MeasureUnit *MeasureUnit::createMilligramPerDeciliter(UErrorCode &status) {
759     return MeasureUnit::create(3, 1, status);
760 }
761 
getMilligramPerDeciliter()762 MeasureUnit MeasureUnit::getMilligramPerDeciliter() {
763     return MeasureUnit(3, 1);
764 }
765 
createMillimolePerLiter(UErrorCode & status)766 MeasureUnit *MeasureUnit::createMillimolePerLiter(UErrorCode &status) {
767     return MeasureUnit::create(3, 2, status);
768 }
769 
getMillimolePerLiter()770 MeasureUnit MeasureUnit::getMillimolePerLiter() {
771     return MeasureUnit(3, 2);
772 }
773 
createMole(UErrorCode & status)774 MeasureUnit *MeasureUnit::createMole(UErrorCode &status) {
775     return MeasureUnit::create(3, 3, status);
776 }
777 
getMole()778 MeasureUnit MeasureUnit::getMole() {
779     return MeasureUnit(3, 3);
780 }
781 
createPartPerMillion(UErrorCode & status)782 MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) {
783     return MeasureUnit::create(3, 4, status);
784 }
785 
getPartPerMillion()786 MeasureUnit MeasureUnit::getPartPerMillion() {
787     return MeasureUnit(3, 4);
788 }
789 
createPercent(UErrorCode & status)790 MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) {
791     return MeasureUnit::create(3, 5, status);
792 }
793 
getPercent()794 MeasureUnit MeasureUnit::getPercent() {
795     return MeasureUnit(3, 5);
796 }
797 
createPermille(UErrorCode & status)798 MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) {
799     return MeasureUnit::create(3, 6, status);
800 }
801 
getPermille()802 MeasureUnit MeasureUnit::getPermille() {
803     return MeasureUnit(3, 6);
804 }
805 
createPermyriad(UErrorCode & status)806 MeasureUnit *MeasureUnit::createPermyriad(UErrorCode &status) {
807     return MeasureUnit::create(3, 7, status);
808 }
809 
getPermyriad()810 MeasureUnit MeasureUnit::getPermyriad() {
811     return MeasureUnit(3, 7);
812 }
813 
createLiterPer100Kilometers(UErrorCode & status)814 MeasureUnit *MeasureUnit::createLiterPer100Kilometers(UErrorCode &status) {
815     return MeasureUnit::create(4, 0, status);
816 }
817 
getLiterPer100Kilometers()818 MeasureUnit MeasureUnit::getLiterPer100Kilometers() {
819     return MeasureUnit(4, 0);
820 }
821 
createLiterPerKilometer(UErrorCode & status)822 MeasureUnit *MeasureUnit::createLiterPerKilometer(UErrorCode &status) {
823     return MeasureUnit::create(4, 1, status);
824 }
825 
getLiterPerKilometer()826 MeasureUnit MeasureUnit::getLiterPerKilometer() {
827     return MeasureUnit(4, 1);
828 }
829 
createMilePerGallon(UErrorCode & status)830 MeasureUnit *MeasureUnit::createMilePerGallon(UErrorCode &status) {
831     return MeasureUnit::create(4, 2, status);
832 }
833 
getMilePerGallon()834 MeasureUnit MeasureUnit::getMilePerGallon() {
835     return MeasureUnit(4, 2);
836 }
837 
createMilePerGallonImperial(UErrorCode & status)838 MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) {
839     return MeasureUnit::create(4, 3, status);
840 }
841 
getMilePerGallonImperial()842 MeasureUnit MeasureUnit::getMilePerGallonImperial() {
843     return MeasureUnit(4, 3);
844 }
845 
createBit(UErrorCode & status)846 MeasureUnit *MeasureUnit::createBit(UErrorCode &status) {
847     return MeasureUnit::create(6, 0, status);
848 }
849 
getBit()850 MeasureUnit MeasureUnit::getBit() {
851     return MeasureUnit(6, 0);
852 }
853 
createByte(UErrorCode & status)854 MeasureUnit *MeasureUnit::createByte(UErrorCode &status) {
855     return MeasureUnit::create(6, 1, status);
856 }
857 
getByte()858 MeasureUnit MeasureUnit::getByte() {
859     return MeasureUnit(6, 1);
860 }
861 
createGigabit(UErrorCode & status)862 MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) {
863     return MeasureUnit::create(6, 2, status);
864 }
865 
getGigabit()866 MeasureUnit MeasureUnit::getGigabit() {
867     return MeasureUnit(6, 2);
868 }
869 
createGigabyte(UErrorCode & status)870 MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) {
871     return MeasureUnit::create(6, 3, status);
872 }
873 
getGigabyte()874 MeasureUnit MeasureUnit::getGigabyte() {
875     return MeasureUnit(6, 3);
876 }
877 
createKilobit(UErrorCode & status)878 MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) {
879     return MeasureUnit::create(6, 4, status);
880 }
881 
getKilobit()882 MeasureUnit MeasureUnit::getKilobit() {
883     return MeasureUnit(6, 4);
884 }
885 
createKilobyte(UErrorCode & status)886 MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) {
887     return MeasureUnit::create(6, 5, status);
888 }
889 
getKilobyte()890 MeasureUnit MeasureUnit::getKilobyte() {
891     return MeasureUnit(6, 5);
892 }
893 
createMegabit(UErrorCode & status)894 MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) {
895     return MeasureUnit::create(6, 6, status);
896 }
897 
getMegabit()898 MeasureUnit MeasureUnit::getMegabit() {
899     return MeasureUnit(6, 6);
900 }
901 
createMegabyte(UErrorCode & status)902 MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) {
903     return MeasureUnit::create(6, 7, status);
904 }
905 
getMegabyte()906 MeasureUnit MeasureUnit::getMegabyte() {
907     return MeasureUnit(6, 7);
908 }
909 
createPetabyte(UErrorCode & status)910 MeasureUnit *MeasureUnit::createPetabyte(UErrorCode &status) {
911     return MeasureUnit::create(6, 8, status);
912 }
913 
getPetabyte()914 MeasureUnit MeasureUnit::getPetabyte() {
915     return MeasureUnit(6, 8);
916 }
917 
createTerabit(UErrorCode & status)918 MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) {
919     return MeasureUnit::create(6, 9, status);
920 }
921 
getTerabit()922 MeasureUnit MeasureUnit::getTerabit() {
923     return MeasureUnit(6, 9);
924 }
925 
createTerabyte(UErrorCode & status)926 MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) {
927     return MeasureUnit::create(6, 10, status);
928 }
929 
getTerabyte()930 MeasureUnit MeasureUnit::getTerabyte() {
931     return MeasureUnit(6, 10);
932 }
933 
createCentury(UErrorCode & status)934 MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) {
935     return MeasureUnit::create(7, 0, status);
936 }
937 
getCentury()938 MeasureUnit MeasureUnit::getCentury() {
939     return MeasureUnit(7, 0);
940 }
941 
createDay(UErrorCode & status)942 MeasureUnit *MeasureUnit::createDay(UErrorCode &status) {
943     return MeasureUnit::create(7, 1, status);
944 }
945 
getDay()946 MeasureUnit MeasureUnit::getDay() {
947     return MeasureUnit(7, 1);
948 }
949 
createDayPerson(UErrorCode & status)950 MeasureUnit *MeasureUnit::createDayPerson(UErrorCode &status) {
951     return MeasureUnit::create(7, 2, status);
952 }
953 
getDayPerson()954 MeasureUnit MeasureUnit::getDayPerson() {
955     return MeasureUnit(7, 2);
956 }
957 
createDecade(UErrorCode & status)958 MeasureUnit *MeasureUnit::createDecade(UErrorCode &status) {
959     return MeasureUnit::create(7, 3, status);
960 }
961 
getDecade()962 MeasureUnit MeasureUnit::getDecade() {
963     return MeasureUnit(7, 3);
964 }
965 
createHour(UErrorCode & status)966 MeasureUnit *MeasureUnit::createHour(UErrorCode &status) {
967     return MeasureUnit::create(7, 4, status);
968 }
969 
getHour()970 MeasureUnit MeasureUnit::getHour() {
971     return MeasureUnit(7, 4);
972 }
973 
createMicrosecond(UErrorCode & status)974 MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) {
975     return MeasureUnit::create(7, 5, status);
976 }
977 
getMicrosecond()978 MeasureUnit MeasureUnit::getMicrosecond() {
979     return MeasureUnit(7, 5);
980 }
981 
createMillisecond(UErrorCode & status)982 MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) {
983     return MeasureUnit::create(7, 6, status);
984 }
985 
getMillisecond()986 MeasureUnit MeasureUnit::getMillisecond() {
987     return MeasureUnit(7, 6);
988 }
989 
createMinute(UErrorCode & status)990 MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) {
991     return MeasureUnit::create(7, 7, status);
992 }
993 
getMinute()994 MeasureUnit MeasureUnit::getMinute() {
995     return MeasureUnit(7, 7);
996 }
997 
createMonth(UErrorCode & status)998 MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) {
999     return MeasureUnit::create(7, 8, status);
1000 }
1001 
getMonth()1002 MeasureUnit MeasureUnit::getMonth() {
1003     return MeasureUnit(7, 8);
1004 }
1005 
createMonthPerson(UErrorCode & status)1006 MeasureUnit *MeasureUnit::createMonthPerson(UErrorCode &status) {
1007     return MeasureUnit::create(7, 9, status);
1008 }
1009 
getMonthPerson()1010 MeasureUnit MeasureUnit::getMonthPerson() {
1011     return MeasureUnit(7, 9);
1012 }
1013 
createNanosecond(UErrorCode & status)1014 MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) {
1015     return MeasureUnit::create(7, 10, status);
1016 }
1017 
getNanosecond()1018 MeasureUnit MeasureUnit::getNanosecond() {
1019     return MeasureUnit(7, 10);
1020 }
1021 
createSecond(UErrorCode & status)1022 MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) {
1023     return MeasureUnit::create(7, 11, status);
1024 }
1025 
getSecond()1026 MeasureUnit MeasureUnit::getSecond() {
1027     return MeasureUnit(7, 11);
1028 }
1029 
createWeek(UErrorCode & status)1030 MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) {
1031     return MeasureUnit::create(7, 12, status);
1032 }
1033 
getWeek()1034 MeasureUnit MeasureUnit::getWeek() {
1035     return MeasureUnit(7, 12);
1036 }
1037 
createWeekPerson(UErrorCode & status)1038 MeasureUnit *MeasureUnit::createWeekPerson(UErrorCode &status) {
1039     return MeasureUnit::create(7, 13, status);
1040 }
1041 
getWeekPerson()1042 MeasureUnit MeasureUnit::getWeekPerson() {
1043     return MeasureUnit(7, 13);
1044 }
1045 
createYear(UErrorCode & status)1046 MeasureUnit *MeasureUnit::createYear(UErrorCode &status) {
1047     return MeasureUnit::create(7, 14, status);
1048 }
1049 
getYear()1050 MeasureUnit MeasureUnit::getYear() {
1051     return MeasureUnit(7, 14);
1052 }
1053 
createYearPerson(UErrorCode & status)1054 MeasureUnit *MeasureUnit::createYearPerson(UErrorCode &status) {
1055     return MeasureUnit::create(7, 15, status);
1056 }
1057 
getYearPerson()1058 MeasureUnit MeasureUnit::getYearPerson() {
1059     return MeasureUnit(7, 15);
1060 }
1061 
createAmpere(UErrorCode & status)1062 MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) {
1063     return MeasureUnit::create(8, 0, status);
1064 }
1065 
getAmpere()1066 MeasureUnit MeasureUnit::getAmpere() {
1067     return MeasureUnit(8, 0);
1068 }
1069 
createMilliampere(UErrorCode & status)1070 MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) {
1071     return MeasureUnit::create(8, 1, status);
1072 }
1073 
getMilliampere()1074 MeasureUnit MeasureUnit::getMilliampere() {
1075     return MeasureUnit(8, 1);
1076 }
1077 
createOhm(UErrorCode & status)1078 MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) {
1079     return MeasureUnit::create(8, 2, status);
1080 }
1081 
getOhm()1082 MeasureUnit MeasureUnit::getOhm() {
1083     return MeasureUnit(8, 2);
1084 }
1085 
createVolt(UErrorCode & status)1086 MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) {
1087     return MeasureUnit::create(8, 3, status);
1088 }
1089 
getVolt()1090 MeasureUnit MeasureUnit::getVolt() {
1091     return MeasureUnit(8, 3);
1092 }
1093 
createBritishThermalUnit(UErrorCode & status)1094 MeasureUnit *MeasureUnit::createBritishThermalUnit(UErrorCode &status) {
1095     return MeasureUnit::create(9, 0, status);
1096 }
1097 
getBritishThermalUnit()1098 MeasureUnit MeasureUnit::getBritishThermalUnit() {
1099     return MeasureUnit(9, 0);
1100 }
1101 
createCalorie(UErrorCode & status)1102 MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) {
1103     return MeasureUnit::create(9, 1, status);
1104 }
1105 
getCalorie()1106 MeasureUnit MeasureUnit::getCalorie() {
1107     return MeasureUnit(9, 1);
1108 }
1109 
createElectronvolt(UErrorCode & status)1110 MeasureUnit *MeasureUnit::createElectronvolt(UErrorCode &status) {
1111     return MeasureUnit::create(9, 2, status);
1112 }
1113 
getElectronvolt()1114 MeasureUnit MeasureUnit::getElectronvolt() {
1115     return MeasureUnit(9, 2);
1116 }
1117 
createFoodcalorie(UErrorCode & status)1118 MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) {
1119     return MeasureUnit::create(9, 3, status);
1120 }
1121 
getFoodcalorie()1122 MeasureUnit MeasureUnit::getFoodcalorie() {
1123     return MeasureUnit(9, 3);
1124 }
1125 
createJoule(UErrorCode & status)1126 MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) {
1127     return MeasureUnit::create(9, 4, status);
1128 }
1129 
getJoule()1130 MeasureUnit MeasureUnit::getJoule() {
1131     return MeasureUnit(9, 4);
1132 }
1133 
createKilocalorie(UErrorCode & status)1134 MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) {
1135     return MeasureUnit::create(9, 5, status);
1136 }
1137 
getKilocalorie()1138 MeasureUnit MeasureUnit::getKilocalorie() {
1139     return MeasureUnit(9, 5);
1140 }
1141 
createKilojoule(UErrorCode & status)1142 MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) {
1143     return MeasureUnit::create(9, 6, status);
1144 }
1145 
getKilojoule()1146 MeasureUnit MeasureUnit::getKilojoule() {
1147     return MeasureUnit(9, 6);
1148 }
1149 
createKilowattHour(UErrorCode & status)1150 MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) {
1151     return MeasureUnit::create(9, 7, status);
1152 }
1153 
getKilowattHour()1154 MeasureUnit MeasureUnit::getKilowattHour() {
1155     return MeasureUnit(9, 7);
1156 }
1157 
createThermUs(UErrorCode & status)1158 MeasureUnit *MeasureUnit::createThermUs(UErrorCode &status) {
1159     return MeasureUnit::create(9, 8, status);
1160 }
1161 
getThermUs()1162 MeasureUnit MeasureUnit::getThermUs() {
1163     return MeasureUnit(9, 8);
1164 }
1165 
createNewton(UErrorCode & status)1166 MeasureUnit *MeasureUnit::createNewton(UErrorCode &status) {
1167     return MeasureUnit::create(10, 0, status);
1168 }
1169 
getNewton()1170 MeasureUnit MeasureUnit::getNewton() {
1171     return MeasureUnit(10, 0);
1172 }
1173 
createPoundForce(UErrorCode & status)1174 MeasureUnit *MeasureUnit::createPoundForce(UErrorCode &status) {
1175     return MeasureUnit::create(10, 1, status);
1176 }
1177 
getPoundForce()1178 MeasureUnit MeasureUnit::getPoundForce() {
1179     return MeasureUnit(10, 1);
1180 }
1181 
createGigahertz(UErrorCode & status)1182 MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) {
1183     return MeasureUnit::create(11, 0, status);
1184 }
1185 
getGigahertz()1186 MeasureUnit MeasureUnit::getGigahertz() {
1187     return MeasureUnit(11, 0);
1188 }
1189 
createHertz(UErrorCode & status)1190 MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) {
1191     return MeasureUnit::create(11, 1, status);
1192 }
1193 
getHertz()1194 MeasureUnit MeasureUnit::getHertz() {
1195     return MeasureUnit(11, 1);
1196 }
1197 
createKilohertz(UErrorCode & status)1198 MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) {
1199     return MeasureUnit::create(11, 2, status);
1200 }
1201 
getKilohertz()1202 MeasureUnit MeasureUnit::getKilohertz() {
1203     return MeasureUnit(11, 2);
1204 }
1205 
createMegahertz(UErrorCode & status)1206 MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) {
1207     return MeasureUnit::create(11, 3, status);
1208 }
1209 
getMegahertz()1210 MeasureUnit MeasureUnit::getMegahertz() {
1211     return MeasureUnit(11, 3);
1212 }
1213 
createDotPerCentimeter(UErrorCode & status)1214 MeasureUnit *MeasureUnit::createDotPerCentimeter(UErrorCode &status) {
1215     return MeasureUnit::create(12, 0, status);
1216 }
1217 
getDotPerCentimeter()1218 MeasureUnit MeasureUnit::getDotPerCentimeter() {
1219     return MeasureUnit(12, 0);
1220 }
1221 
createDotPerInch(UErrorCode & status)1222 MeasureUnit *MeasureUnit::createDotPerInch(UErrorCode &status) {
1223     return MeasureUnit::create(12, 1, status);
1224 }
1225 
getDotPerInch()1226 MeasureUnit MeasureUnit::getDotPerInch() {
1227     return MeasureUnit(12, 1);
1228 }
1229 
createEm(UErrorCode & status)1230 MeasureUnit *MeasureUnit::createEm(UErrorCode &status) {
1231     return MeasureUnit::create(12, 2, status);
1232 }
1233 
getEm()1234 MeasureUnit MeasureUnit::getEm() {
1235     return MeasureUnit(12, 2);
1236 }
1237 
createMegapixel(UErrorCode & status)1238 MeasureUnit *MeasureUnit::createMegapixel(UErrorCode &status) {
1239     return MeasureUnit::create(12, 3, status);
1240 }
1241 
getMegapixel()1242 MeasureUnit MeasureUnit::getMegapixel() {
1243     return MeasureUnit(12, 3);
1244 }
1245 
createPixel(UErrorCode & status)1246 MeasureUnit *MeasureUnit::createPixel(UErrorCode &status) {
1247     return MeasureUnit::create(12, 4, status);
1248 }
1249 
getPixel()1250 MeasureUnit MeasureUnit::getPixel() {
1251     return MeasureUnit(12, 4);
1252 }
1253 
createPixelPerCentimeter(UErrorCode & status)1254 MeasureUnit *MeasureUnit::createPixelPerCentimeter(UErrorCode &status) {
1255     return MeasureUnit::create(12, 5, status);
1256 }
1257 
getPixelPerCentimeter()1258 MeasureUnit MeasureUnit::getPixelPerCentimeter() {
1259     return MeasureUnit(12, 5);
1260 }
1261 
createPixelPerInch(UErrorCode & status)1262 MeasureUnit *MeasureUnit::createPixelPerInch(UErrorCode &status) {
1263     return MeasureUnit::create(12, 6, status);
1264 }
1265 
getPixelPerInch()1266 MeasureUnit MeasureUnit::getPixelPerInch() {
1267     return MeasureUnit(12, 6);
1268 }
1269 
createAstronomicalUnit(UErrorCode & status)1270 MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) {
1271     return MeasureUnit::create(13, 0, status);
1272 }
1273 
getAstronomicalUnit()1274 MeasureUnit MeasureUnit::getAstronomicalUnit() {
1275     return MeasureUnit(13, 0);
1276 }
1277 
createCentimeter(UErrorCode & status)1278 MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) {
1279     return MeasureUnit::create(13, 1, status);
1280 }
1281 
getCentimeter()1282 MeasureUnit MeasureUnit::getCentimeter() {
1283     return MeasureUnit(13, 1);
1284 }
1285 
createDecimeter(UErrorCode & status)1286 MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) {
1287     return MeasureUnit::create(13, 2, status);
1288 }
1289 
getDecimeter()1290 MeasureUnit MeasureUnit::getDecimeter() {
1291     return MeasureUnit(13, 2);
1292 }
1293 
createFathom(UErrorCode & status)1294 MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) {
1295     return MeasureUnit::create(13, 3, status);
1296 }
1297 
getFathom()1298 MeasureUnit MeasureUnit::getFathom() {
1299     return MeasureUnit(13, 3);
1300 }
1301 
createFoot(UErrorCode & status)1302 MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) {
1303     return MeasureUnit::create(13, 4, status);
1304 }
1305 
getFoot()1306 MeasureUnit MeasureUnit::getFoot() {
1307     return MeasureUnit(13, 4);
1308 }
1309 
createFurlong(UErrorCode & status)1310 MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) {
1311     return MeasureUnit::create(13, 5, status);
1312 }
1313 
getFurlong()1314 MeasureUnit MeasureUnit::getFurlong() {
1315     return MeasureUnit(13, 5);
1316 }
1317 
createInch(UErrorCode & status)1318 MeasureUnit *MeasureUnit::createInch(UErrorCode &status) {
1319     return MeasureUnit::create(13, 6, status);
1320 }
1321 
getInch()1322 MeasureUnit MeasureUnit::getInch() {
1323     return MeasureUnit(13, 6);
1324 }
1325 
createKilometer(UErrorCode & status)1326 MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) {
1327     return MeasureUnit::create(13, 7, status);
1328 }
1329 
getKilometer()1330 MeasureUnit MeasureUnit::getKilometer() {
1331     return MeasureUnit(13, 7);
1332 }
1333 
createLightYear(UErrorCode & status)1334 MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) {
1335     return MeasureUnit::create(13, 8, status);
1336 }
1337 
getLightYear()1338 MeasureUnit MeasureUnit::getLightYear() {
1339     return MeasureUnit(13, 8);
1340 }
1341 
createMeter(UErrorCode & status)1342 MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) {
1343     return MeasureUnit::create(13, 9, status);
1344 }
1345 
getMeter()1346 MeasureUnit MeasureUnit::getMeter() {
1347     return MeasureUnit(13, 9);
1348 }
1349 
createMicrometer(UErrorCode & status)1350 MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) {
1351     return MeasureUnit::create(13, 10, status);
1352 }
1353 
getMicrometer()1354 MeasureUnit MeasureUnit::getMicrometer() {
1355     return MeasureUnit(13, 10);
1356 }
1357 
createMile(UErrorCode & status)1358 MeasureUnit *MeasureUnit::createMile(UErrorCode &status) {
1359     return MeasureUnit::create(13, 11, status);
1360 }
1361 
getMile()1362 MeasureUnit MeasureUnit::getMile() {
1363     return MeasureUnit(13, 11);
1364 }
1365 
createMileScandinavian(UErrorCode & status)1366 MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) {
1367     return MeasureUnit::create(13, 12, status);
1368 }
1369 
getMileScandinavian()1370 MeasureUnit MeasureUnit::getMileScandinavian() {
1371     return MeasureUnit(13, 12);
1372 }
1373 
createMillimeter(UErrorCode & status)1374 MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) {
1375     return MeasureUnit::create(13, 13, status);
1376 }
1377 
getMillimeter()1378 MeasureUnit MeasureUnit::getMillimeter() {
1379     return MeasureUnit(13, 13);
1380 }
1381 
createNanometer(UErrorCode & status)1382 MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) {
1383     return MeasureUnit::create(13, 14, status);
1384 }
1385 
getNanometer()1386 MeasureUnit MeasureUnit::getNanometer() {
1387     return MeasureUnit(13, 14);
1388 }
1389 
createNauticalMile(UErrorCode & status)1390 MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) {
1391     return MeasureUnit::create(13, 15, status);
1392 }
1393 
getNauticalMile()1394 MeasureUnit MeasureUnit::getNauticalMile() {
1395     return MeasureUnit(13, 15);
1396 }
1397 
createParsec(UErrorCode & status)1398 MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) {
1399     return MeasureUnit::create(13, 16, status);
1400 }
1401 
getParsec()1402 MeasureUnit MeasureUnit::getParsec() {
1403     return MeasureUnit(13, 16);
1404 }
1405 
createPicometer(UErrorCode & status)1406 MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) {
1407     return MeasureUnit::create(13, 17, status);
1408 }
1409 
getPicometer()1410 MeasureUnit MeasureUnit::getPicometer() {
1411     return MeasureUnit(13, 17);
1412 }
1413 
createPoint(UErrorCode & status)1414 MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) {
1415     return MeasureUnit::create(13, 18, status);
1416 }
1417 
getPoint()1418 MeasureUnit MeasureUnit::getPoint() {
1419     return MeasureUnit(13, 18);
1420 }
1421 
createSolarRadius(UErrorCode & status)1422 MeasureUnit *MeasureUnit::createSolarRadius(UErrorCode &status) {
1423     return MeasureUnit::create(13, 19, status);
1424 }
1425 
getSolarRadius()1426 MeasureUnit MeasureUnit::getSolarRadius() {
1427     return MeasureUnit(13, 19);
1428 }
1429 
createYard(UErrorCode & status)1430 MeasureUnit *MeasureUnit::createYard(UErrorCode &status) {
1431     return MeasureUnit::create(13, 20, status);
1432 }
1433 
getYard()1434 MeasureUnit MeasureUnit::getYard() {
1435     return MeasureUnit(13, 20);
1436 }
1437 
createLux(UErrorCode & status)1438 MeasureUnit *MeasureUnit::createLux(UErrorCode &status) {
1439     return MeasureUnit::create(14, 0, status);
1440 }
1441 
getLux()1442 MeasureUnit MeasureUnit::getLux() {
1443     return MeasureUnit(14, 0);
1444 }
1445 
createSolarLuminosity(UErrorCode & status)1446 MeasureUnit *MeasureUnit::createSolarLuminosity(UErrorCode &status) {
1447     return MeasureUnit::create(14, 1, status);
1448 }
1449 
getSolarLuminosity()1450 MeasureUnit MeasureUnit::getSolarLuminosity() {
1451     return MeasureUnit(14, 1);
1452 }
1453 
createCarat(UErrorCode & status)1454 MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) {
1455     return MeasureUnit::create(15, 0, status);
1456 }
1457 
getCarat()1458 MeasureUnit MeasureUnit::getCarat() {
1459     return MeasureUnit(15, 0);
1460 }
1461 
createDalton(UErrorCode & status)1462 MeasureUnit *MeasureUnit::createDalton(UErrorCode &status) {
1463     return MeasureUnit::create(15, 1, status);
1464 }
1465 
getDalton()1466 MeasureUnit MeasureUnit::getDalton() {
1467     return MeasureUnit(15, 1);
1468 }
1469 
createEarthMass(UErrorCode & status)1470 MeasureUnit *MeasureUnit::createEarthMass(UErrorCode &status) {
1471     return MeasureUnit::create(15, 2, status);
1472 }
1473 
getEarthMass()1474 MeasureUnit MeasureUnit::getEarthMass() {
1475     return MeasureUnit(15, 2);
1476 }
1477 
createGram(UErrorCode & status)1478 MeasureUnit *MeasureUnit::createGram(UErrorCode &status) {
1479     return MeasureUnit::create(15, 3, status);
1480 }
1481 
getGram()1482 MeasureUnit MeasureUnit::getGram() {
1483     return MeasureUnit(15, 3);
1484 }
1485 
createKilogram(UErrorCode & status)1486 MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) {
1487     return MeasureUnit::create(15, 4, status);
1488 }
1489 
getKilogram()1490 MeasureUnit MeasureUnit::getKilogram() {
1491     return MeasureUnit(15, 4);
1492 }
1493 
createMetricTon(UErrorCode & status)1494 MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) {
1495     return MeasureUnit::create(15, 5, status);
1496 }
1497 
getMetricTon()1498 MeasureUnit MeasureUnit::getMetricTon() {
1499     return MeasureUnit(15, 5);
1500 }
1501 
createMicrogram(UErrorCode & status)1502 MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) {
1503     return MeasureUnit::create(15, 6, status);
1504 }
1505 
getMicrogram()1506 MeasureUnit MeasureUnit::getMicrogram() {
1507     return MeasureUnit(15, 6);
1508 }
1509 
createMilligram(UErrorCode & status)1510 MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) {
1511     return MeasureUnit::create(15, 7, status);
1512 }
1513 
getMilligram()1514 MeasureUnit MeasureUnit::getMilligram() {
1515     return MeasureUnit(15, 7);
1516 }
1517 
createOunce(UErrorCode & status)1518 MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) {
1519     return MeasureUnit::create(15, 8, status);
1520 }
1521 
getOunce()1522 MeasureUnit MeasureUnit::getOunce() {
1523     return MeasureUnit(15, 8);
1524 }
1525 
createOunceTroy(UErrorCode & status)1526 MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) {
1527     return MeasureUnit::create(15, 9, status);
1528 }
1529 
getOunceTroy()1530 MeasureUnit MeasureUnit::getOunceTroy() {
1531     return MeasureUnit(15, 9);
1532 }
1533 
createPound(UErrorCode & status)1534 MeasureUnit *MeasureUnit::createPound(UErrorCode &status) {
1535     return MeasureUnit::create(15, 10, status);
1536 }
1537 
getPound()1538 MeasureUnit MeasureUnit::getPound() {
1539     return MeasureUnit(15, 10);
1540 }
1541 
createSolarMass(UErrorCode & status)1542 MeasureUnit *MeasureUnit::createSolarMass(UErrorCode &status) {
1543     return MeasureUnit::create(15, 11, status);
1544 }
1545 
getSolarMass()1546 MeasureUnit MeasureUnit::getSolarMass() {
1547     return MeasureUnit(15, 11);
1548 }
1549 
createStone(UErrorCode & status)1550 MeasureUnit *MeasureUnit::createStone(UErrorCode &status) {
1551     return MeasureUnit::create(15, 12, status);
1552 }
1553 
getStone()1554 MeasureUnit MeasureUnit::getStone() {
1555     return MeasureUnit(15, 12);
1556 }
1557 
createTon(UErrorCode & status)1558 MeasureUnit *MeasureUnit::createTon(UErrorCode &status) {
1559     return MeasureUnit::create(15, 13, status);
1560 }
1561 
getTon()1562 MeasureUnit MeasureUnit::getTon() {
1563     return MeasureUnit(15, 13);
1564 }
1565 
createGigawatt(UErrorCode & status)1566 MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) {
1567     return MeasureUnit::create(17, 0, status);
1568 }
1569 
getGigawatt()1570 MeasureUnit MeasureUnit::getGigawatt() {
1571     return MeasureUnit(17, 0);
1572 }
1573 
createHorsepower(UErrorCode & status)1574 MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) {
1575     return MeasureUnit::create(17, 1, status);
1576 }
1577 
getHorsepower()1578 MeasureUnit MeasureUnit::getHorsepower() {
1579     return MeasureUnit(17, 1);
1580 }
1581 
createKilowatt(UErrorCode & status)1582 MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) {
1583     return MeasureUnit::create(17, 2, status);
1584 }
1585 
getKilowatt()1586 MeasureUnit MeasureUnit::getKilowatt() {
1587     return MeasureUnit(17, 2);
1588 }
1589 
createMegawatt(UErrorCode & status)1590 MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) {
1591     return MeasureUnit::create(17, 3, status);
1592 }
1593 
getMegawatt()1594 MeasureUnit MeasureUnit::getMegawatt() {
1595     return MeasureUnit(17, 3);
1596 }
1597 
createMilliwatt(UErrorCode & status)1598 MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) {
1599     return MeasureUnit::create(17, 4, status);
1600 }
1601 
getMilliwatt()1602 MeasureUnit MeasureUnit::getMilliwatt() {
1603     return MeasureUnit(17, 4);
1604 }
1605 
createWatt(UErrorCode & status)1606 MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) {
1607     return MeasureUnit::create(17, 5, status);
1608 }
1609 
getWatt()1610 MeasureUnit MeasureUnit::getWatt() {
1611     return MeasureUnit(17, 5);
1612 }
1613 
createAtmosphere(UErrorCode & status)1614 MeasureUnit *MeasureUnit::createAtmosphere(UErrorCode &status) {
1615     return MeasureUnit::create(18, 0, status);
1616 }
1617 
getAtmosphere()1618 MeasureUnit MeasureUnit::getAtmosphere() {
1619     return MeasureUnit(18, 0);
1620 }
1621 
createBar(UErrorCode & status)1622 MeasureUnit *MeasureUnit::createBar(UErrorCode &status) {
1623     return MeasureUnit::create(18, 1, status);
1624 }
1625 
getBar()1626 MeasureUnit MeasureUnit::getBar() {
1627     return MeasureUnit(18, 1);
1628 }
1629 
createHectopascal(UErrorCode & status)1630 MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) {
1631     return MeasureUnit::create(18, 2, status);
1632 }
1633 
getHectopascal()1634 MeasureUnit MeasureUnit::getHectopascal() {
1635     return MeasureUnit(18, 2);
1636 }
1637 
createInchHg(UErrorCode & status)1638 MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) {
1639     return MeasureUnit::create(18, 3, status);
1640 }
1641 
getInchHg()1642 MeasureUnit MeasureUnit::getInchHg() {
1643     return MeasureUnit(18, 3);
1644 }
1645 
createKilopascal(UErrorCode & status)1646 MeasureUnit *MeasureUnit::createKilopascal(UErrorCode &status) {
1647     return MeasureUnit::create(18, 4, status);
1648 }
1649 
getKilopascal()1650 MeasureUnit MeasureUnit::getKilopascal() {
1651     return MeasureUnit(18, 4);
1652 }
1653 
createMegapascal(UErrorCode & status)1654 MeasureUnit *MeasureUnit::createMegapascal(UErrorCode &status) {
1655     return MeasureUnit::create(18, 5, status);
1656 }
1657 
getMegapascal()1658 MeasureUnit MeasureUnit::getMegapascal() {
1659     return MeasureUnit(18, 5);
1660 }
1661 
createMillibar(UErrorCode & status)1662 MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) {
1663     return MeasureUnit::create(18, 6, status);
1664 }
1665 
getMillibar()1666 MeasureUnit MeasureUnit::getMillibar() {
1667     return MeasureUnit(18, 6);
1668 }
1669 
createMillimeterOfMercury(UErrorCode & status)1670 MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) {
1671     return MeasureUnit::create(18, 7, status);
1672 }
1673 
getMillimeterOfMercury()1674 MeasureUnit MeasureUnit::getMillimeterOfMercury() {
1675     return MeasureUnit(18, 7);
1676 }
1677 
createPascal(UErrorCode & status)1678 MeasureUnit *MeasureUnit::createPascal(UErrorCode &status) {
1679     return MeasureUnit::create(18, 8, status);
1680 }
1681 
getPascal()1682 MeasureUnit MeasureUnit::getPascal() {
1683     return MeasureUnit(18, 8);
1684 }
1685 
createPoundPerSquareInch(UErrorCode & status)1686 MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) {
1687     return MeasureUnit::create(18, 9, status);
1688 }
1689 
getPoundPerSquareInch()1690 MeasureUnit MeasureUnit::getPoundPerSquareInch() {
1691     return MeasureUnit(18, 9);
1692 }
1693 
createKilometerPerHour(UErrorCode & status)1694 MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) {
1695     return MeasureUnit::create(19, 0, status);
1696 }
1697 
getKilometerPerHour()1698 MeasureUnit MeasureUnit::getKilometerPerHour() {
1699     return MeasureUnit(19, 0);
1700 }
1701 
createKnot(UErrorCode & status)1702 MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) {
1703     return MeasureUnit::create(19, 1, status);
1704 }
1705 
getKnot()1706 MeasureUnit MeasureUnit::getKnot() {
1707     return MeasureUnit(19, 1);
1708 }
1709 
createMeterPerSecond(UErrorCode & status)1710 MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) {
1711     return MeasureUnit::create(19, 2, status);
1712 }
1713 
getMeterPerSecond()1714 MeasureUnit MeasureUnit::getMeterPerSecond() {
1715     return MeasureUnit(19, 2);
1716 }
1717 
createMilePerHour(UErrorCode & status)1718 MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) {
1719     return MeasureUnit::create(19, 3, status);
1720 }
1721 
getMilePerHour()1722 MeasureUnit MeasureUnit::getMilePerHour() {
1723     return MeasureUnit(19, 3);
1724 }
1725 
createCelsius(UErrorCode & status)1726 MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) {
1727     return MeasureUnit::create(20, 0, status);
1728 }
1729 
getCelsius()1730 MeasureUnit MeasureUnit::getCelsius() {
1731     return MeasureUnit(20, 0);
1732 }
1733 
createFahrenheit(UErrorCode & status)1734 MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) {
1735     return MeasureUnit::create(20, 1, status);
1736 }
1737 
getFahrenheit()1738 MeasureUnit MeasureUnit::getFahrenheit() {
1739     return MeasureUnit(20, 1);
1740 }
1741 
createGenericTemperature(UErrorCode & status)1742 MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) {
1743     return MeasureUnit::create(20, 2, status);
1744 }
1745 
getGenericTemperature()1746 MeasureUnit MeasureUnit::getGenericTemperature() {
1747     return MeasureUnit(20, 2);
1748 }
1749 
createKelvin(UErrorCode & status)1750 MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) {
1751     return MeasureUnit::create(20, 3, status);
1752 }
1753 
getKelvin()1754 MeasureUnit MeasureUnit::getKelvin() {
1755     return MeasureUnit(20, 3);
1756 }
1757 
createNewtonMeter(UErrorCode & status)1758 MeasureUnit *MeasureUnit::createNewtonMeter(UErrorCode &status) {
1759     return MeasureUnit::create(21, 0, status);
1760 }
1761 
getNewtonMeter()1762 MeasureUnit MeasureUnit::getNewtonMeter() {
1763     return MeasureUnit(21, 0);
1764 }
1765 
createPoundFoot(UErrorCode & status)1766 MeasureUnit *MeasureUnit::createPoundFoot(UErrorCode &status) {
1767     return MeasureUnit::create(21, 1, status);
1768 }
1769 
getPoundFoot()1770 MeasureUnit MeasureUnit::getPoundFoot() {
1771     return MeasureUnit(21, 1);
1772 }
1773 
createAcreFoot(UErrorCode & status)1774 MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) {
1775     return MeasureUnit::create(22, 0, status);
1776 }
1777 
getAcreFoot()1778 MeasureUnit MeasureUnit::getAcreFoot() {
1779     return MeasureUnit(22, 0);
1780 }
1781 
createBarrel(UErrorCode & status)1782 MeasureUnit *MeasureUnit::createBarrel(UErrorCode &status) {
1783     return MeasureUnit::create(22, 1, status);
1784 }
1785 
getBarrel()1786 MeasureUnit MeasureUnit::getBarrel() {
1787     return MeasureUnit(22, 1);
1788 }
1789 
createBushel(UErrorCode & status)1790 MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) {
1791     return MeasureUnit::create(22, 2, status);
1792 }
1793 
getBushel()1794 MeasureUnit MeasureUnit::getBushel() {
1795     return MeasureUnit(22, 2);
1796 }
1797 
createCentiliter(UErrorCode & status)1798 MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) {
1799     return MeasureUnit::create(22, 3, status);
1800 }
1801 
getCentiliter()1802 MeasureUnit MeasureUnit::getCentiliter() {
1803     return MeasureUnit(22, 3);
1804 }
1805 
createCubicCentimeter(UErrorCode & status)1806 MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) {
1807     return MeasureUnit::create(22, 4, status);
1808 }
1809 
getCubicCentimeter()1810 MeasureUnit MeasureUnit::getCubicCentimeter() {
1811     return MeasureUnit(22, 4);
1812 }
1813 
createCubicFoot(UErrorCode & status)1814 MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) {
1815     return MeasureUnit::create(22, 5, status);
1816 }
1817 
getCubicFoot()1818 MeasureUnit MeasureUnit::getCubicFoot() {
1819     return MeasureUnit(22, 5);
1820 }
1821 
createCubicInch(UErrorCode & status)1822 MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) {
1823     return MeasureUnit::create(22, 6, status);
1824 }
1825 
getCubicInch()1826 MeasureUnit MeasureUnit::getCubicInch() {
1827     return MeasureUnit(22, 6);
1828 }
1829 
createCubicKilometer(UErrorCode & status)1830 MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) {
1831     return MeasureUnit::create(22, 7, status);
1832 }
1833 
getCubicKilometer()1834 MeasureUnit MeasureUnit::getCubicKilometer() {
1835     return MeasureUnit(22, 7);
1836 }
1837 
createCubicMeter(UErrorCode & status)1838 MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) {
1839     return MeasureUnit::create(22, 8, status);
1840 }
1841 
getCubicMeter()1842 MeasureUnit MeasureUnit::getCubicMeter() {
1843     return MeasureUnit(22, 8);
1844 }
1845 
createCubicMile(UErrorCode & status)1846 MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) {
1847     return MeasureUnit::create(22, 9, status);
1848 }
1849 
getCubicMile()1850 MeasureUnit MeasureUnit::getCubicMile() {
1851     return MeasureUnit(22, 9);
1852 }
1853 
createCubicYard(UErrorCode & status)1854 MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) {
1855     return MeasureUnit::create(22, 10, status);
1856 }
1857 
getCubicYard()1858 MeasureUnit MeasureUnit::getCubicYard() {
1859     return MeasureUnit(22, 10);
1860 }
1861 
createCup(UErrorCode & status)1862 MeasureUnit *MeasureUnit::createCup(UErrorCode &status) {
1863     return MeasureUnit::create(22, 11, status);
1864 }
1865 
getCup()1866 MeasureUnit MeasureUnit::getCup() {
1867     return MeasureUnit(22, 11);
1868 }
1869 
createCupMetric(UErrorCode & status)1870 MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) {
1871     return MeasureUnit::create(22, 12, status);
1872 }
1873 
getCupMetric()1874 MeasureUnit MeasureUnit::getCupMetric() {
1875     return MeasureUnit(22, 12);
1876 }
1877 
createDeciliter(UErrorCode & status)1878 MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) {
1879     return MeasureUnit::create(22, 13, status);
1880 }
1881 
getDeciliter()1882 MeasureUnit MeasureUnit::getDeciliter() {
1883     return MeasureUnit(22, 13);
1884 }
1885 
createFluidOunce(UErrorCode & status)1886 MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) {
1887     return MeasureUnit::create(22, 14, status);
1888 }
1889 
getFluidOunce()1890 MeasureUnit MeasureUnit::getFluidOunce() {
1891     return MeasureUnit(22, 14);
1892 }
1893 
createFluidOunceImperial(UErrorCode & status)1894 MeasureUnit *MeasureUnit::createFluidOunceImperial(UErrorCode &status) {
1895     return MeasureUnit::create(22, 15, status);
1896 }
1897 
getFluidOunceImperial()1898 MeasureUnit MeasureUnit::getFluidOunceImperial() {
1899     return MeasureUnit(22, 15);
1900 }
1901 
createGallon(UErrorCode & status)1902 MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) {
1903     return MeasureUnit::create(22, 16, status);
1904 }
1905 
getGallon()1906 MeasureUnit MeasureUnit::getGallon() {
1907     return MeasureUnit(22, 16);
1908 }
1909 
createGallonImperial(UErrorCode & status)1910 MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) {
1911     return MeasureUnit::create(22, 17, status);
1912 }
1913 
getGallonImperial()1914 MeasureUnit MeasureUnit::getGallonImperial() {
1915     return MeasureUnit(22, 17);
1916 }
1917 
createHectoliter(UErrorCode & status)1918 MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) {
1919     return MeasureUnit::create(22, 18, status);
1920 }
1921 
getHectoliter()1922 MeasureUnit MeasureUnit::getHectoliter() {
1923     return MeasureUnit(22, 18);
1924 }
1925 
createLiter(UErrorCode & status)1926 MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) {
1927     return MeasureUnit::create(22, 19, status);
1928 }
1929 
getLiter()1930 MeasureUnit MeasureUnit::getLiter() {
1931     return MeasureUnit(22, 19);
1932 }
1933 
createMegaliter(UErrorCode & status)1934 MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) {
1935     return MeasureUnit::create(22, 20, status);
1936 }
1937 
getMegaliter()1938 MeasureUnit MeasureUnit::getMegaliter() {
1939     return MeasureUnit(22, 20);
1940 }
1941 
createMilliliter(UErrorCode & status)1942 MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) {
1943     return MeasureUnit::create(22, 21, status);
1944 }
1945 
getMilliliter()1946 MeasureUnit MeasureUnit::getMilliliter() {
1947     return MeasureUnit(22, 21);
1948 }
1949 
createPint(UErrorCode & status)1950 MeasureUnit *MeasureUnit::createPint(UErrorCode &status) {
1951     return MeasureUnit::create(22, 22, status);
1952 }
1953 
getPint()1954 MeasureUnit MeasureUnit::getPint() {
1955     return MeasureUnit(22, 22);
1956 }
1957 
createPintMetric(UErrorCode & status)1958 MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) {
1959     return MeasureUnit::create(22, 23, status);
1960 }
1961 
getPintMetric()1962 MeasureUnit MeasureUnit::getPintMetric() {
1963     return MeasureUnit(22, 23);
1964 }
1965 
createQuart(UErrorCode & status)1966 MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) {
1967     return MeasureUnit::create(22, 24, status);
1968 }
1969 
getQuart()1970 MeasureUnit MeasureUnit::getQuart() {
1971     return MeasureUnit(22, 24);
1972 }
1973 
createTablespoon(UErrorCode & status)1974 MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) {
1975     return MeasureUnit::create(22, 25, status);
1976 }
1977 
getTablespoon()1978 MeasureUnit MeasureUnit::getTablespoon() {
1979     return MeasureUnit(22, 25);
1980 }
1981 
createTeaspoon(UErrorCode & status)1982 MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) {
1983     return MeasureUnit::create(22, 26, status);
1984 }
1985 
getTeaspoon()1986 MeasureUnit MeasureUnit::getTeaspoon() {
1987     return MeasureUnit(22, 26);
1988 }
1989 
1990 // End generated code
1991 
binarySearch(const char * const * array,int32_t start,int32_t end,const char * key)1992 static int32_t binarySearch(
1993         const char * const * array, int32_t start, int32_t end, const char * key) {
1994     while (start < end) {
1995         int32_t mid = (start + end) / 2;
1996         int32_t cmp = uprv_strcmp(array[mid], key);
1997         if (cmp < 0) {
1998             start = mid + 1;
1999             continue;
2000         }
2001         if (cmp == 0) {
2002             return mid;
2003         }
2004         end = mid;
2005     }
2006     return -1;
2007 }
2008 
MeasureUnit()2009 MeasureUnit::MeasureUnit() {
2010     fCurrency[0] = 0;
2011     fTypeId = kBaseTypeIdx;
2012     fSubTypeId = kBaseSubTypeIdx;
2013 }
2014 
MeasureUnit(const MeasureUnit & other)2015 MeasureUnit::MeasureUnit(const MeasureUnit &other)
2016         : fTypeId(other.fTypeId), fSubTypeId(other.fSubTypeId) {
2017     uprv_strcpy(fCurrency, other.fCurrency);
2018 }
2019 
operator =(const MeasureUnit & other)2020 MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) {
2021     if (this == &other) {
2022         return *this;
2023     }
2024     fTypeId = other.fTypeId;
2025     fSubTypeId = other.fSubTypeId;
2026     uprv_strcpy(fCurrency, other.fCurrency);
2027     return *this;
2028 }
2029 
clone() const2030 MeasureUnit *MeasureUnit::clone() const {
2031     return new MeasureUnit(*this);
2032 }
2033 
~MeasureUnit()2034 MeasureUnit::~MeasureUnit() {
2035 }
2036 
getType() const2037 const char *MeasureUnit::getType() const {
2038     return gTypes[fTypeId];
2039 }
2040 
getSubtype() const2041 const char *MeasureUnit::getSubtype() const {
2042     return fCurrency[0] == 0 ? gSubTypes[getOffset()] : fCurrency;
2043 }
2044 
operator ==(const UObject & other) const2045 UBool MeasureUnit::operator==(const UObject& other) const {
2046     if (this == &other) {  // Same object, equal
2047         return TRUE;
2048     }
2049     if (typeid(*this) != typeid(other)) { // Different types, not equal
2050         return FALSE;
2051     }
2052     const MeasureUnit &rhs = static_cast<const MeasureUnit&>(other);
2053     return (
2054             fTypeId == rhs.fTypeId
2055             && fSubTypeId == rhs.fSubTypeId
2056             && uprv_strcmp(fCurrency, rhs.fCurrency) == 0);
2057 }
2058 
getIndex() const2059 int32_t MeasureUnit::getIndex() const {
2060     return gIndexes[fTypeId] + fSubTypeId;
2061 }
2062 
getAvailable(MeasureUnit * dest,int32_t destCapacity,UErrorCode & errorCode)2063 int32_t MeasureUnit::getAvailable(
2064         MeasureUnit *dest,
2065         int32_t destCapacity,
2066         UErrorCode &errorCode) {
2067     if (U_FAILURE(errorCode)) {
2068         return 0;
2069     }
2070     if (destCapacity < UPRV_LENGTHOF(gSubTypes)) {
2071         errorCode = U_BUFFER_OVERFLOW_ERROR;
2072         return UPRV_LENGTHOF(gSubTypes);
2073     }
2074     int32_t idx = 0;
2075     for (int32_t typeIdx = 0; typeIdx < UPRV_LENGTHOF(gTypes); ++typeIdx) {
2076         int32_t len = gOffsets[typeIdx + 1] - gOffsets[typeIdx];
2077         for (int32_t subTypeIdx = 0; subTypeIdx < len; ++subTypeIdx) {
2078             dest[idx].setTo(typeIdx, subTypeIdx);
2079             ++idx;
2080         }
2081     }
2082     U_ASSERT(idx == UPRV_LENGTHOF(gSubTypes));
2083     return UPRV_LENGTHOF(gSubTypes);
2084 }
2085 
getAvailable(const char * type,MeasureUnit * dest,int32_t destCapacity,UErrorCode & errorCode)2086 int32_t MeasureUnit::getAvailable(
2087         const char *type,
2088         MeasureUnit *dest,
2089         int32_t destCapacity,
2090         UErrorCode &errorCode) {
2091     if (U_FAILURE(errorCode)) {
2092         return 0;
2093     }
2094     int32_t typeIdx = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), type);
2095     if (typeIdx == -1) {
2096         return 0;
2097     }
2098     int32_t len = gOffsets[typeIdx + 1] - gOffsets[typeIdx];
2099     if (destCapacity < len) {
2100         errorCode = U_BUFFER_OVERFLOW_ERROR;
2101         return len;
2102     }
2103     for (int subTypeIdx = 0; subTypeIdx < len; ++subTypeIdx) {
2104         dest[subTypeIdx].setTo(typeIdx, subTypeIdx);
2105     }
2106     return len;
2107 }
2108 
getAvailableTypes(UErrorCode & errorCode)2109 StringEnumeration* MeasureUnit::getAvailableTypes(UErrorCode &errorCode) {
2110     UEnumeration *uenum = uenum_openCharStringsEnumeration(
2111             gTypes, UPRV_LENGTHOF(gTypes), &errorCode);
2112     if (U_FAILURE(errorCode)) {
2113         uenum_close(uenum);
2114         return NULL;
2115     }
2116     StringEnumeration *result = new UStringEnumeration(uenum);
2117     if (result == NULL) {
2118         errorCode = U_MEMORY_ALLOCATION_ERROR;
2119         uenum_close(uenum);
2120         return NULL;
2121     }
2122     return result;
2123 }
2124 
getIndexCount()2125 int32_t MeasureUnit::getIndexCount() {
2126     return gIndexes[UPRV_LENGTHOF(gIndexes) - 1];
2127 }
2128 
internalGetIndexForTypeAndSubtype(const char * type,const char * subtype)2129 int32_t MeasureUnit::internalGetIndexForTypeAndSubtype(const char *type, const char *subtype) {
2130     int32_t t = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), type);
2131     if (t < 0) {
2132         return t;
2133     }
2134     int32_t st = binarySearch(gSubTypes, gOffsets[t], gOffsets[t + 1], subtype);
2135     if (st < 0) {
2136         return st;
2137     }
2138     return gIndexes[t] + st - gOffsets[t];
2139 }
2140 
resolveUnitPerUnit(const MeasureUnit & unit,const MeasureUnit & perUnit,bool * isResolved)2141 MeasureUnit MeasureUnit::resolveUnitPerUnit(
2142         const MeasureUnit &unit, const MeasureUnit &perUnit, bool* isResolved) {
2143     int32_t unitOffset = unit.getOffset();
2144     int32_t perUnitOffset = perUnit.getOffset();
2145 
2146     // binary search for (unitOffset, perUnitOffset)
2147     int32_t start = 0;
2148     int32_t end = UPRV_LENGTHOF(unitPerUnitToSingleUnit);
2149     while (start < end) {
2150         int32_t mid = (start + end) / 2;
2151         int32_t *midRow = unitPerUnitToSingleUnit[mid];
2152         if (unitOffset < midRow[0]) {
2153             end = mid;
2154         } else if (unitOffset > midRow[0]) {
2155             start = mid + 1;
2156         } else if (perUnitOffset < midRow[1]) {
2157             end = mid;
2158         } else if (perUnitOffset > midRow[1]) {
2159             start = mid + 1;
2160         } else {
2161             // We found a resolution for our unit / per-unit combo
2162             // return it.
2163             *isResolved = true;
2164             return MeasureUnit(midRow[2], midRow[3]);
2165         }
2166     }
2167 
2168     *isResolved = false;
2169     return MeasureUnit();
2170 }
2171 
create(int typeId,int subTypeId,UErrorCode & status)2172 MeasureUnit *MeasureUnit::create(int typeId, int subTypeId, UErrorCode &status) {
2173     if (U_FAILURE(status)) {
2174         return NULL;
2175     }
2176     MeasureUnit *result = new MeasureUnit(typeId, subTypeId);
2177     if (result == NULL) {
2178         status = U_MEMORY_ALLOCATION_ERROR;
2179     }
2180     return result;
2181 }
2182 
initTime(const char * timeId)2183 void MeasureUnit::initTime(const char *timeId) {
2184     int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "duration");
2185     U_ASSERT(result != -1);
2186     fTypeId = result;
2187     result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], timeId);
2188     U_ASSERT(result != -1);
2189     fSubTypeId = result - gOffsets[fTypeId];
2190 }
2191 
initCurrency(const char * isoCurrency)2192 void MeasureUnit::initCurrency(const char *isoCurrency) {
2193     int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "currency");
2194     U_ASSERT(result != -1);
2195     fTypeId = result;
2196     result = binarySearch(
2197             gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency);
2198     if (result != -1) {
2199         fSubTypeId = result - gOffsets[fTypeId];
2200     } else {
2201         uprv_strncpy(fCurrency, isoCurrency, UPRV_LENGTHOF(fCurrency));
2202         fCurrency[3] = 0;
2203     }
2204 }
2205 
initNoUnit(const char * subtype)2206 void MeasureUnit::initNoUnit(const char *subtype) {
2207     int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "none");
2208     U_ASSERT(result != -1);
2209     fTypeId = result;
2210     result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], subtype);
2211     U_ASSERT(result != -1);
2212     fSubTypeId = result - gOffsets[fTypeId];
2213 }
2214 
setTo(int32_t typeId,int32_t subTypeId)2215 void MeasureUnit::setTo(int32_t typeId, int32_t subTypeId) {
2216     fTypeId = typeId;
2217     fSubTypeId = subTypeId;
2218     fCurrency[0] = 0;
2219 }
2220 
getOffset() const2221 int32_t MeasureUnit::getOffset() const {
2222     return gOffsets[fTypeId] + fSubTypeId;
2223 }
2224 
2225 U_NAMESPACE_END
2226 
2227 #endif /* !UNCONFIG_NO_FORMATTING */
2228