Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/intl/icu/source/i18n/measunit.cpp
Line
Count
Source (jump to first uncovered line)
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
0
MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) {
565
0
    return MeasureUnit::create(0, 0, status);
566
0
}
567
568
0
MeasureUnit *MeasureUnit::createMeterPerSecondSquared(UErrorCode &status) {
569
0
    return MeasureUnit::create(0, 1, status);
570
0
}
571
572
0
MeasureUnit *MeasureUnit::createArcMinute(UErrorCode &status) {
573
0
    return MeasureUnit::create(1, 0, status);
574
0
}
575
576
0
MeasureUnit *MeasureUnit::createArcSecond(UErrorCode &status) {
577
0
    return MeasureUnit::create(1, 1, status);
578
0
}
579
580
0
MeasureUnit *MeasureUnit::createDegree(UErrorCode &status) {
581
0
    return MeasureUnit::create(1, 2, status);
582
0
}
583
584
0
MeasureUnit *MeasureUnit::createRadian(UErrorCode &status) {
585
0
    return MeasureUnit::create(1, 3, status);
586
0
}
587
588
0
MeasureUnit *MeasureUnit::createRevolutionAngle(UErrorCode &status) {
589
0
    return MeasureUnit::create(1, 4, status);
590
0
}
591
592
0
MeasureUnit *MeasureUnit::createAcre(UErrorCode &status) {
593
0
    return MeasureUnit::create(2, 0, status);
594
0
}
595
596
0
MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) {
597
0
    return MeasureUnit::create(2, 1, status);
598
0
}
599
600
0
MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) {
601
0
    return MeasureUnit::create(2, 2, status);
602
0
}
603
604
0
MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) {
605
0
    return MeasureUnit::create(2, 3, status);
606
0
}
607
608
0
MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) {
609
0
    return MeasureUnit::create(2, 4, status);
610
0
}
611
612
0
MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) {
613
0
    return MeasureUnit::create(2, 5, status);
614
0
}
615
616
0
MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) {
617
0
    return MeasureUnit::create(2, 6, status);
618
0
}
619
620
0
MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) {
621
0
    return MeasureUnit::create(2, 7, status);
622
0
}
623
624
0
MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) {
625
0
    return MeasureUnit::create(2, 8, status);
626
0
}
627
628
0
MeasureUnit *MeasureUnit::createKarat(UErrorCode &status) {
629
0
    return MeasureUnit::create(3, 0, status);
630
0
}
631
632
0
MeasureUnit *MeasureUnit::createMilligramPerDeciliter(UErrorCode &status) {
633
0
    return MeasureUnit::create(3, 1, status);
634
0
}
635
636
0
MeasureUnit *MeasureUnit::createMillimolePerLiter(UErrorCode &status) {
637
0
    return MeasureUnit::create(3, 2, status);
638
0
}
639
640
0
MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) {
641
0
    return MeasureUnit::create(3, 3, status);
642
0
}
643
644
0
MeasureUnit *MeasureUnit::createLiterPer100Kilometers(UErrorCode &status) {
645
0
    return MeasureUnit::create(4, 0, status);
646
0
}
647
648
0
MeasureUnit *MeasureUnit::createLiterPerKilometer(UErrorCode &status) {
649
0
    return MeasureUnit::create(4, 1, status);
650
0
}
651
652
0
MeasureUnit *MeasureUnit::createMilePerGallon(UErrorCode &status) {
653
0
    return MeasureUnit::create(4, 2, status);
654
0
}
655
656
0
MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) {
657
0
    return MeasureUnit::create(4, 3, status);
658
0
}
659
660
0
MeasureUnit *MeasureUnit::createBit(UErrorCode &status) {
661
0
    return MeasureUnit::create(6, 0, status);
662
0
}
663
664
0
MeasureUnit *MeasureUnit::createByte(UErrorCode &status) {
665
0
    return MeasureUnit::create(6, 1, status);
666
0
}
667
668
0
MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) {
669
0
    return MeasureUnit::create(6, 2, status);
670
0
}
671
672
0
MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) {
673
0
    return MeasureUnit::create(6, 3, status);
674
0
}
675
676
0
MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) {
677
0
    return MeasureUnit::create(6, 4, status);
678
0
}
679
680
0
MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) {
681
0
    return MeasureUnit::create(6, 5, status);
682
0
}
683
684
0
MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) {
685
0
    return MeasureUnit::create(6, 6, status);
686
0
}
687
688
0
MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) {
689
0
    return MeasureUnit::create(6, 7, status);
690
0
}
691
692
0
MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) {
693
0
    return MeasureUnit::create(6, 8, status);
694
0
}
695
696
0
MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) {
697
0
    return MeasureUnit::create(6, 9, status);
698
0
}
699
700
0
MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) {
701
0
    return MeasureUnit::create(7, 0, status);
702
0
}
703
704
0
MeasureUnit *MeasureUnit::createDay(UErrorCode &status) {
705
0
    return MeasureUnit::create(7, 1, status);
706
0
}
707
708
0
MeasureUnit *MeasureUnit::createHour(UErrorCode &status) {
709
0
    return MeasureUnit::create(7, 2, status);
710
0
}
711
712
0
MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) {
713
0
    return MeasureUnit::create(7, 3, status);
714
0
}
715
716
0
MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) {
717
0
    return MeasureUnit::create(7, 4, status);
718
0
}
719
720
0
MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) {
721
0
    return MeasureUnit::create(7, 5, status);
722
0
}
723
724
0
MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) {
725
0
    return MeasureUnit::create(7, 6, status);
726
0
}
727
728
0
MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) {
729
0
    return MeasureUnit::create(7, 7, status);
730
0
}
731
732
0
MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) {
733
0
    return MeasureUnit::create(7, 8, status);
734
0
}
735
736
0
MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) {
737
0
    return MeasureUnit::create(7, 9, status);
738
0
}
739
740
0
MeasureUnit *MeasureUnit::createYear(UErrorCode &status) {
741
0
    return MeasureUnit::create(7, 10, status);
742
0
}
743
744
0
MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) {
745
0
    return MeasureUnit::create(8, 0, status);
746
0
}
747
748
0
MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) {
749
0
    return MeasureUnit::create(8, 1, status);
750
0
}
751
752
0
MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) {
753
0
    return MeasureUnit::create(8, 2, status);
754
0
}
755
756
0
MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) {
757
0
    return MeasureUnit::create(8, 3, status);
758
0
}
759
760
0
MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) {
761
0
    return MeasureUnit::create(9, 0, status);
762
0
}
763
764
0
MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) {
765
0
    return MeasureUnit::create(9, 1, status);
766
0
}
767
768
0
MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) {
769
0
    return MeasureUnit::create(9, 2, status);
770
0
}
771
772
0
MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) {
773
0
    return MeasureUnit::create(9, 3, status);
774
0
}
775
776
0
MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) {
777
0
    return MeasureUnit::create(9, 4, status);
778
0
}
779
780
0
MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) {
781
0
    return MeasureUnit::create(9, 5, status);
782
0
}
783
784
0
MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) {
785
0
    return MeasureUnit::create(10, 0, status);
786
0
}
787
788
0
MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) {
789
0
    return MeasureUnit::create(10, 1, status);
790
0
}
791
792
0
MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) {
793
0
    return MeasureUnit::create(10, 2, status);
794
0
}
795
796
0
MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) {
797
0
    return MeasureUnit::create(10, 3, status);
798
0
}
799
800
0
MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) {
801
0
    return MeasureUnit::create(11, 0, status);
802
0
}
803
804
0
MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) {
805
0
    return MeasureUnit::create(11, 1, status);
806
0
}
807
808
0
MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) {
809
0
    return MeasureUnit::create(11, 2, status);
810
0
}
811
812
0
MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) {
813
0
    return MeasureUnit::create(11, 3, status);
814
0
}
815
816
0
MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) {
817
0
    return MeasureUnit::create(11, 4, status);
818
0
}
819
820
0
MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) {
821
0
    return MeasureUnit::create(11, 5, status);
822
0
}
823
824
0
MeasureUnit *MeasureUnit::createInch(UErrorCode &status) {
825
0
    return MeasureUnit::create(11, 6, status);
826
0
}
827
828
0
MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) {
829
0
    return MeasureUnit::create(11, 7, status);
830
0
}
831
832
0
MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) {
833
0
    return MeasureUnit::create(11, 8, status);
834
0
}
835
836
0
MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) {
837
0
    return MeasureUnit::create(11, 9, status);
838
0
}
839
840
0
MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) {
841
0
    return MeasureUnit::create(11, 10, status);
842
0
}
843
844
0
MeasureUnit *MeasureUnit::createMile(UErrorCode &status) {
845
0
    return MeasureUnit::create(11, 11, status);
846
0
}
847
848
0
MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) {
849
0
    return MeasureUnit::create(11, 12, status);
850
0
}
851
852
0
MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) {
853
0
    return MeasureUnit::create(11, 13, status);
854
0
}
855
856
0
MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) {
857
0
    return MeasureUnit::create(11, 14, status);
858
0
}
859
860
0
MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) {
861
0
    return MeasureUnit::create(11, 15, status);
862
0
}
863
864
0
MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) {
865
0
    return MeasureUnit::create(11, 16, status);
866
0
}
867
868
0
MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) {
869
0
    return MeasureUnit::create(11, 17, status);
870
0
}
871
872
0
MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) {
873
0
    return MeasureUnit::create(11, 18, status);
874
0
}
875
876
0
MeasureUnit *MeasureUnit::createYard(UErrorCode &status) {
877
0
    return MeasureUnit::create(11, 19, status);
878
0
}
879
880
0
MeasureUnit *MeasureUnit::createLux(UErrorCode &status) {
881
0
    return MeasureUnit::create(12, 0, status);
882
0
}
883
884
0
MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) {
885
0
    return MeasureUnit::create(13, 0, status);
886
0
}
887
888
0
MeasureUnit *MeasureUnit::createGram(UErrorCode &status) {
889
0
    return MeasureUnit::create(13, 1, status);
890
0
}
891
892
0
MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) {
893
0
    return MeasureUnit::create(13, 2, status);
894
0
}
895
896
0
MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) {
897
0
    return MeasureUnit::create(13, 3, status);
898
0
}
899
900
0
MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) {
901
0
    return MeasureUnit::create(13, 4, status);
902
0
}
903
904
0
MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) {
905
0
    return MeasureUnit::create(13, 5, status);
906
0
}
907
908
0
MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) {
909
0
    return MeasureUnit::create(13, 6, status);
910
0
}
911
912
0
MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) {
913
0
    return MeasureUnit::create(13, 7, status);
914
0
}
915
916
0
MeasureUnit *MeasureUnit::createPound(UErrorCode &status) {
917
0
    return MeasureUnit::create(13, 8, status);
918
0
}
919
920
0
MeasureUnit *MeasureUnit::createStone(UErrorCode &status) {
921
0
    return MeasureUnit::create(13, 9, status);
922
0
}
923
924
0
MeasureUnit *MeasureUnit::createTon(UErrorCode &status) {
925
0
    return MeasureUnit::create(13, 10, status);
926
0
}
927
928
0
MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) {
929
0
    return MeasureUnit::create(15, 0, status);
930
0
}
931
932
0
MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) {
933
0
    return MeasureUnit::create(15, 1, status);
934
0
}
935
936
0
MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) {
937
0
    return MeasureUnit::create(15, 2, status);
938
0
}
939
940
0
MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) {
941
0
    return MeasureUnit::create(15, 3, status);
942
0
}
943
944
0
MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) {
945
0
    return MeasureUnit::create(15, 4, status);
946
0
}
947
948
0
MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) {
949
0
    return MeasureUnit::create(15, 5, status);
950
0
}
951
952
0
MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) {
953
0
    return MeasureUnit::create(16, 0, status);
954
0
}
955
956
0
MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) {
957
0
    return MeasureUnit::create(16, 1, status);
958
0
}
959
960
0
MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) {
961
0
    return MeasureUnit::create(16, 2, status);
962
0
}
963
964
0
MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) {
965
0
    return MeasureUnit::create(16, 3, status);
966
0
}
967
968
0
MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) {
969
0
    return MeasureUnit::create(16, 4, status);
970
0
}
971
972
0
MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) {
973
0
    return MeasureUnit::create(17, 0, status);
974
0
}
975
976
0
MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) {
977
0
    return MeasureUnit::create(17, 1, status);
978
0
}
979
980
0
MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) {
981
0
    return MeasureUnit::create(17, 2, status);
982
0
}
983
984
0
MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) {
985
0
    return MeasureUnit::create(17, 3, status);
986
0
}
987
988
0
MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) {
989
0
    return MeasureUnit::create(18, 0, status);
990
0
}
991
992
0
MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) {
993
0
    return MeasureUnit::create(18, 1, status);
994
0
}
995
996
0
MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) {
997
0
    return MeasureUnit::create(18, 2, status);
998
0
}
999
1000
0
MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) {
1001
0
    return MeasureUnit::create(18, 3, status);
1002
0
}
1003
1004
0
MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) {
1005
0
    return MeasureUnit::create(19, 0, status);
1006
0
}
1007
1008
0
MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) {
1009
0
    return MeasureUnit::create(19, 1, status);
1010
0
}
1011
1012
0
MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) {
1013
0
    return MeasureUnit::create(19, 2, status);
1014
0
}
1015
1016
0
MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) {
1017
0
    return MeasureUnit::create(19, 3, status);
1018
0
}
1019
1020
0
MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) {
1021
0
    return MeasureUnit::create(19, 4, status);
1022
0
}
1023
1024
0
MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) {
1025
0
    return MeasureUnit::create(19, 5, status);
1026
0
}
1027
1028
0
MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) {
1029
0
    return MeasureUnit::create(19, 6, status);
1030
0
}
1031
1032
0
MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) {
1033
0
    return MeasureUnit::create(19, 7, status);
1034
0
}
1035
1036
0
MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) {
1037
0
    return MeasureUnit::create(19, 8, status);
1038
0
}
1039
1040
0
MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) {
1041
0
    return MeasureUnit::create(19, 9, status);
1042
0
}
1043
1044
0
MeasureUnit *MeasureUnit::createCup(UErrorCode &status) {
1045
0
    return MeasureUnit::create(19, 10, status);
1046
0
}
1047
1048
0
MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) {
1049
0
    return MeasureUnit::create(19, 11, status);
1050
0
}
1051
1052
0
MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) {
1053
0
    return MeasureUnit::create(19, 12, status);
1054
0
}
1055
1056
0
MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) {
1057
0
    return MeasureUnit::create(19, 13, status);
1058
0
}
1059
1060
0
MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) {
1061
0
    return MeasureUnit::create(19, 14, status);
1062
0
}
1063
1064
0
MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) {
1065
0
    return MeasureUnit::create(19, 15, status);
1066
0
}
1067
1068
0
MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) {
1069
0
    return MeasureUnit::create(19, 16, status);
1070
0
}
1071
1072
0
MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) {
1073
0
    return MeasureUnit::create(19, 17, status);
1074
0
}
1075
1076
0
MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) {
1077
0
    return MeasureUnit::create(19, 18, status);
1078
0
}
1079
1080
0
MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) {
1081
0
    return MeasureUnit::create(19, 19, status);
1082
0
}
1083
1084
0
MeasureUnit *MeasureUnit::createPint(UErrorCode &status) {
1085
0
    return MeasureUnit::create(19, 20, status);
1086
0
}
1087
1088
0
MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) {
1089
0
    return MeasureUnit::create(19, 21, status);
1090
0
}
1091
1092
0
MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) {
1093
0
    return MeasureUnit::create(19, 22, status);
1094
0
}
1095
1096
0
MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) {
1097
0
    return MeasureUnit::create(19, 23, status);
1098
0
}
1099
1100
0
MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) {
1101
0
    return MeasureUnit::create(19, 24, status);
1102
0
}
1103
1104
// End generated code
1105
1106
static int32_t binarySearch(
1107
0
        const char * const * array, int32_t start, int32_t end, const char * key) {
1108
0
    while (start < end) {
1109
0
        int32_t mid = (start + end) / 2;
1110
0
        int32_t cmp = uprv_strcmp(array[mid], key);
1111
0
        if (cmp < 0) {
1112
0
            start = mid + 1;
1113
0
            continue;
1114
0
        }
1115
0
        if (cmp == 0) {
1116
0
            return mid;
1117
0
        }
1118
0
        end = mid;
1119
0
    }
1120
0
    return -1;
1121
0
}
1122
1123
0
MeasureUnit::MeasureUnit() {
1124
0
    fCurrency[0] = 0;
1125
0
    fTypeId = kBaseTypeIdx;
1126
0
    fSubTypeId = kBaseSubTypeIdx;
1127
0
}
1128
1129
MeasureUnit::MeasureUnit(const MeasureUnit &other)
1130
0
        : fTypeId(other.fTypeId), fSubTypeId(other.fSubTypeId) {
1131
0
    uprv_strcpy(fCurrency, other.fCurrency);
1132
0
}
1133
1134
0
MeasureUnit &MeasureUnit::operator=(const MeasureUnit &other) {
1135
0
    if (this == &other) {
1136
0
        return *this;
1137
0
    }
1138
0
    fTypeId = other.fTypeId;
1139
0
    fSubTypeId = other.fSubTypeId;
1140
0
    uprv_strcpy(fCurrency, other.fCurrency);
1141
0
    return *this;
1142
0
}
1143
1144
0
UObject *MeasureUnit::clone() const {
1145
0
    return new MeasureUnit(*this);
1146
0
}
1147
1148
0
MeasureUnit::~MeasureUnit() {
1149
0
}
1150
1151
0
const char *MeasureUnit::getType() const {
1152
0
    return gTypes[fTypeId];
1153
0
}
1154
1155
0
const char *MeasureUnit::getSubtype() const {
1156
0
    return fCurrency[0] == 0 ? gSubTypes[getOffset()] : fCurrency;
1157
0
}
1158
1159
0
UBool MeasureUnit::operator==(const UObject& other) const {
1160
0
    if (this == &other) {  // Same object, equal
1161
0
        return TRUE;
1162
0
    }
1163
0
    if (typeid(*this) != typeid(other)) { // Different types, not equal
1164
0
        return FALSE;
1165
0
    }
1166
0
    const MeasureUnit &rhs = static_cast<const MeasureUnit&>(other);
1167
0
    return (
1168
0
            fTypeId == rhs.fTypeId
1169
0
            && fSubTypeId == rhs.fSubTypeId
1170
0
            && uprv_strcmp(fCurrency, rhs.fCurrency) == 0);
1171
0
}
1172
1173
0
int32_t MeasureUnit::getIndex() const {
1174
0
    return gIndexes[fTypeId] + fSubTypeId;
1175
0
}
1176
1177
int32_t MeasureUnit::getAvailable(
1178
        MeasureUnit *dest,
1179
        int32_t destCapacity,
1180
0
        UErrorCode &errorCode) {
1181
0
    if (U_FAILURE(errorCode)) {
1182
0
        return 0;
1183
0
    }
1184
0
    if (destCapacity < UPRV_LENGTHOF(gSubTypes)) {
1185
0
        errorCode = U_BUFFER_OVERFLOW_ERROR;
1186
0
        return UPRV_LENGTHOF(gSubTypes);
1187
0
    }
1188
0
    int32_t idx = 0;
1189
0
    for (int32_t typeIdx = 0; typeIdx < UPRV_LENGTHOF(gTypes); ++typeIdx) {
1190
0
        int32_t len = gOffsets[typeIdx + 1] - gOffsets[typeIdx];
1191
0
        for (int32_t subTypeIdx = 0; subTypeIdx < len; ++subTypeIdx) {
1192
0
            dest[idx].setTo(typeIdx, subTypeIdx);
1193
0
            ++idx;
1194
0
        }
1195
0
    }
1196
0
    U_ASSERT(idx == UPRV_LENGTHOF(gSubTypes));
1197
0
    return UPRV_LENGTHOF(gSubTypes);
1198
0
}
1199
1200
int32_t MeasureUnit::getAvailable(
1201
        const char *type,
1202
        MeasureUnit *dest,
1203
        int32_t destCapacity,
1204
0
        UErrorCode &errorCode) {
1205
0
    if (U_FAILURE(errorCode)) {
1206
0
        return 0;
1207
0
    }
1208
0
    int32_t typeIdx = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), type);
1209
0
    if (typeIdx == -1) {
1210
0
        return 0;
1211
0
    }
1212
0
    int32_t len = gOffsets[typeIdx + 1] - gOffsets[typeIdx];
1213
0
    if (destCapacity < len) {
1214
0
        errorCode = U_BUFFER_OVERFLOW_ERROR;
1215
0
        return len;
1216
0
    }
1217
0
    for (int subTypeIdx = 0; subTypeIdx < len; ++subTypeIdx) {
1218
0
        dest[subTypeIdx].setTo(typeIdx, subTypeIdx);
1219
0
    }
1220
0
    return len;
1221
0
}
1222
1223
0
StringEnumeration* MeasureUnit::getAvailableTypes(UErrorCode &errorCode) {
1224
0
    UEnumeration *uenum = uenum_openCharStringsEnumeration(
1225
0
            gTypes, UPRV_LENGTHOF(gTypes), &errorCode);
1226
0
    if (U_FAILURE(errorCode)) {
1227
0
        uenum_close(uenum);
1228
0
        return NULL;
1229
0
    }
1230
0
    StringEnumeration *result = new UStringEnumeration(uenum);
1231
0
    if (result == NULL) {
1232
0
        errorCode = U_MEMORY_ALLOCATION_ERROR;
1233
0
        uenum_close(uenum);
1234
0
        return NULL;
1235
0
    }
1236
0
    return result;
1237
0
}
1238
1239
0
int32_t MeasureUnit::getIndexCount() {
1240
0
    return gIndexes[UPRV_LENGTHOF(gIndexes) - 1];
1241
0
}
1242
1243
0
int32_t MeasureUnit::internalGetIndexForTypeAndSubtype(const char *type, const char *subtype) {
1244
0
    int32_t t = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), type);
1245
0
    if (t < 0) {
1246
0
        return t;
1247
0
    }
1248
0
    int32_t st = binarySearch(gSubTypes, gOffsets[t], gOffsets[t + 1], subtype);
1249
0
    if (st < 0) {
1250
0
        return st;
1251
0
    }
1252
0
    return gIndexes[t] + st - gOffsets[t];
1253
0
}
1254
1255
MeasureUnit MeasureUnit::resolveUnitPerUnit(
1256
0
        const MeasureUnit &unit, const MeasureUnit &perUnit, bool* isResolved) {
1257
0
    int32_t unitOffset = unit.getOffset();
1258
0
    int32_t perUnitOffset = perUnit.getOffset();
1259
0
1260
0
    // binary search for (unitOffset, perUnitOffset)
1261
0
    int32_t start = 0;
1262
0
    int32_t end = UPRV_LENGTHOF(unitPerUnitToSingleUnit);
1263
0
    while (start < end) {
1264
0
        int32_t mid = (start + end) / 2;
1265
0
        int32_t *midRow = unitPerUnitToSingleUnit[mid];
1266
0
        if (unitOffset < midRow[0]) {
1267
0
            end = mid;
1268
0
        } else if (unitOffset > midRow[0]) {
1269
0
            start = mid + 1;
1270
0
        } else if (perUnitOffset < midRow[1]) {
1271
0
            end = mid;
1272
0
        } else if (perUnitOffset > midRow[1]) {
1273
0
            start = mid + 1;
1274
0
        } else {
1275
0
            // We found a resolution for our unit / per-unit combo
1276
0
            // return it.
1277
0
            *isResolved = true;
1278
0
            return MeasureUnit(midRow[2], midRow[3]);
1279
0
        }
1280
0
    }
1281
0
1282
0
    *isResolved = false;
1283
0
    return MeasureUnit();
1284
0
}
1285
1286
0
MeasureUnit *MeasureUnit::create(int typeId, int subTypeId, UErrorCode &status) {
1287
0
    if (U_FAILURE(status)) {
1288
0
        return NULL;
1289
0
    }
1290
0
    MeasureUnit *result = new MeasureUnit(typeId, subTypeId);
1291
0
    if (result == NULL) {
1292
0
        status = U_MEMORY_ALLOCATION_ERROR;
1293
0
    }
1294
0
    return result;
1295
0
}
1296
1297
0
void MeasureUnit::initTime(const char *timeId) {
1298
0
    int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "duration");
1299
0
    U_ASSERT(result != -1);
1300
0
    fTypeId = result;
1301
0
    result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], timeId);
1302
0
    U_ASSERT(result != -1);
1303
0
    fSubTypeId = result - gOffsets[fTypeId]; 
1304
0
}
1305
1306
0
void MeasureUnit::initCurrency(const char *isoCurrency) {
1307
0
    int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "currency");
1308
0
    U_ASSERT(result != -1);
1309
0
    fTypeId = result;
1310
0
    result = binarySearch(
1311
0
            gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency);
1312
0
    if (result != -1) {
1313
0
        fSubTypeId = result - gOffsets[fTypeId];
1314
0
    } else {
1315
0
        uprv_strncpy(fCurrency, isoCurrency, UPRV_LENGTHOF(fCurrency));
1316
0
        fCurrency[3] = 0;
1317
0
    }
1318
0
}
1319
1320
0
void MeasureUnit::initNoUnit(const char *subtype) {
1321
0
    int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "none");
1322
0
    U_ASSERT(result != -1);
1323
0
    fTypeId = result;
1324
0
    result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], subtype);
1325
0
    U_ASSERT(result != -1);
1326
0
    fSubTypeId = result - gOffsets[fTypeId];
1327
0
}
1328
1329
0
void MeasureUnit::setTo(int32_t typeId, int32_t subTypeId) {
1330
0
    fTypeId = typeId;
1331
0
    fSubTypeId = subTypeId;
1332
0
    fCurrency[0] = 0;
1333
0
}
1334
1335
0
int32_t MeasureUnit::getOffset() const {
1336
0
    return gOffsets[fTypeId] + fSubTypeId;
1337
0
}
1338
1339
U_NAMESPACE_END
1340
1341
#endif /* !UNCONFIG_NO_FORMATTING */