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