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