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