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