measunit.cpp 29 KB

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