From 07c64f17cc08de722f91d05dc6291bde70a3b095 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Thu, 20 Mar 2025 07:39:39 +0100 Subject: [PATCH 01/16] Refactor MeasureUnitParser and update related components - Removed the dependency on `ZeroTrieSimpleAscii` in `MeasureUnitParser`, replacing it with `DataPayload` for better data handling. - Introduced new constructors for `MeasureUnitParser`, including a stable constructor and an unstable one that accepts a data provider. - Updated tests to directly instantiate `MeasureUnitParser` instead of using `ConverterFactory`. - Refactored `UnitsInfo` to replace `units_conversion_trie` with `conversion_info`, aligning with the new data structure. - Adjusted related components and tests to reflect these changes, ensuring consistency across the measurement unit parsing functionality. --- components/experimental/src/measure/parser.rs | 52 ++++-- .../experimental/src/measure/provider/trie.rs | 4 +- .../src/units/converter_factory.rs | 32 ++-- components/experimental/src/units/provider.rs | 8 +- .../experimental/tests/units/units_test.rs | 7 +- ffi/capi/src/lib.rs | 2 + ffi/capi/src/measure_unit_parser.rs | 70 ++++++++ ffi/capi/src/units_converter.rs | 34 +--- .../experimental/data/units_info_v1.rs.data | 4 +- provider/data/experimental/fingerprints.csv | 2 +- .../stubdata/units_info_v1.rs.data | 4 +- .../data/debug/experimental/UnitsInfoV1.json | 159 +----------------- provider/source/src/units/info.rs | 31 ++-- provider/source/src/units/trie.rs | 4 +- 14 files changed, 157 insertions(+), 256 deletions(-) create mode 100644 ffi/capi/src/measure_unit_parser.rs diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index 2141c2cb277..8cf7579ef03 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -3,38 +3,64 @@ // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use smallvec::SmallVec; -use zerotrie::ZeroTrieSimpleAscii; use crate::measure::measureunit::MeasureUnit; use crate::measure::power::get_power; use crate::measure::si_prefix::get_si_prefix; use crate::units::InvalidUnitError; +use icu_provider::prelude::*; +use icu_provider::DataError; + use super::provider::si_prefix::{Base, SiPrefix}; use super::provider::single_unit::SingleUnit; // TODO: add test cases for this parser after adding UnitsTest.txt to the test data. /// A parser for the CLDR unit identifier (e.g. `meter-per-square-second`) -pub struct MeasureUnitParser<'data> { +pub struct MeasureUnitParser { /// Contains the trie for the unit identifiers. - units_trie: &'data ZeroTrieSimpleAscii<[u8]>, + payload: DataPayload, } -impl<'data> MeasureUnitParser<'data> { - // TODO: revisit the public nature of the API. Maybe we should make it private and add a function to create it from a ConverterFactory. - /// Creates a new MeasureUnitParser from a ZeroTrie payload. - pub fn from_payload(payload: &'data ZeroTrieSimpleAscii<[u8]>) -> Self { +impl MeasureUnitParser { + icu_provider::gen_buffer_data_constructors!( + () -> error: DataError, + functions: [ + new: skip, + try_new_with_buffer_provider, + try_new_unstable, + Self, + ] + ); + + /// Creates a new [`ConverterFactory`] from compiled data. + /// + /// ✨ *Enabled with the `compiled_data` Cargo feature.* + /// + /// [📚 Help choosing a constructor](icu_provider::constructors) + #[cfg(feature = "compiled_data")] + pub const fn new() -> Self { Self { - units_trie: payload, + payload: DataPayload::from_static_ref(crate::provider::Baked::SINGLETON_UNITS_TRIE_V1), } } + #[doc = icu_provider::gen_buffer_unstable_docs!(UNSTABLE, Self::new)] + pub fn try_new_unstable(provider: &D) -> Result + where + D: ?Sized + DataProvider, + { + let payload = provider.load(DataRequest::default())?.payload; + + Ok(Self { payload }) + } + /// Get the unit id. /// NOTE: /// if the unit id is found, the function will return (unit id, part without the unit id and without `-` at the beginning of the remaining part if it exists). /// if the unit id is not found, the function will return an error. fn get_unit_id<'a>(&self, part: &'a [u8]) -> Result<(u16, &'a [u8]), InvalidUnitError> { - let mut cursor = self.units_trie.cursor(); + let mut cursor = self.payload.get().trie.cursor(); let mut longest_match = Err(InvalidUnitError); for (i, byte) in part.iter().enumerate() { @@ -190,7 +216,7 @@ impl<'data> MeasureUnitParser<'data> { #[cfg(test)] mod tests { - use crate::units::converter_factory::ConverterFactory; + use crate::measure::parser::MeasureUnitParser; #[test] fn test_parser_cases() { @@ -200,10 +226,9 @@ mod tests { ("portion-per-1000000000", 1, 1_000_000_000), ("liter-per-100-kilometer", 2, 100), ]; + let parser = MeasureUnitParser::new(); for (input, expected_len, expected_denominator) in test_cases { - let converter_factory = ConverterFactory::new(); - let parser = converter_factory.parser(); let measure_unit = parser.try_from_str(input).unwrap(); assert_eq!(measure_unit.single_units.len(), expected_len); assert_eq!(measure_unit.constant_denominator, expected_denominator); @@ -268,8 +293,7 @@ mod tests { continue; } - let converter_factory = ConverterFactory::new(); - let parser = converter_factory.parser(); + let parser = MeasureUnitParser::new(); let measure_unit = parser.try_from_str(input); if measure_unit.is_ok() { println!("OK: {}", input); diff --git a/components/experimental/src/measure/provider/trie.rs b/components/experimental/src/measure/provider/trie.rs index 85a73f907ab..edc532e0c8e 100644 --- a/components/experimental/src/measure/provider/trie.rs +++ b/components/experimental/src/measure/provider/trie.rs @@ -42,8 +42,8 @@ icu_provider::data_marker!( #[cfg_attr(feature = "datagen", databake(path = icu_experimental::measure::provider::trie))] #[cfg_attr(feature = "serde", derive(serde::Deserialize))] pub struct UnitsTrie<'data> { - // TODO: remove this field from units/provider::UnitsInfo once the `MeasureUnit` is fully used in the measurement units. - /// Maps from unit name (e.g. foot or meter) to its unit id. this id can be used to retrieve the conversion information from the `UnitsInfo`. + /// Maps from a unit name (e.g., "foot" or "meter") to its corresponding unit ID. + /// This ID represents the index of this unit in the `UnitsInfo` struct and can be used to retrieve the conversion information. #[cfg_attr(feature = "serde", serde(borrow))] pub trie: ZeroTrieSimpleAscii>, } diff --git a/components/experimental/src/units/converter_factory.rs b/components/experimental/src/units/converter_factory.rs index 27023e623f2..7f67de6b08f 100644 --- a/components/experimental/src/units/converter_factory.rs +++ b/components/experimental/src/units/converter_factory.rs @@ -3,7 +3,6 @@ // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use crate::measure::measureunit::MeasureUnit; -use crate::measure::parser::MeasureUnitParser; use crate::measure::provider::single_unit::SingleUnit; use crate::units::provider; use crate::units::ratio::IcuRatio; @@ -71,10 +70,6 @@ impl ConverterFactory { Ok(Self { payload }) } - pub fn parser(&self) -> MeasureUnitParser<'_> { - MeasureUnitParser::from_payload(self.payload.get().units_conversion_trie.as_borrowed()) - } - /// Calculates the offset between two units by performing the following steps: /// 1. Identify the conversion rate from the first unit to the base unit as ConversionRate1: N1/D1 with an Offset1: OffsetN1/OffsetD1. /// 2. Identify the conversion rate from the second unit to the base unit as ConversionRate2: N2/D2 with an Offset2: OffsetN2/OffsetD2. @@ -116,7 +111,7 @@ impl ConverterFactory { let input_conversion_info = self .payload .get() - .convert_infos + .conversion_info .get(input_unit.single_units[0].unit_id as usize); debug_assert!( input_conversion_info.is_some(), @@ -127,7 +122,7 @@ impl ConverterFactory { let output_conversion_info = self .payload .get() - .convert_infos + .conversion_info .get(output_unit.single_units[0].unit_id as usize); debug_assert!( output_conversion_info.is_some(), @@ -181,7 +176,7 @@ impl ConverterFactory { let items_from_item = factory .payload .get() - .convert_infos + .conversion_info .get(item.unit_id as usize); debug_assert!(items_from_item.is_some(), "Failed to get convert info"); @@ -250,7 +245,7 @@ impl ConverterFactory { let conversion_info = self .payload .get() - .convert_infos + .conversion_info .get(unit_item.unit_id as usize); debug_assert!(conversion_info.is_some(), "Failed to get conversion info"); let conversion_info = conversion_info?; @@ -339,12 +334,14 @@ impl ConverterFactory { #[cfg(test)] mod tests { use super::ConverterFactory; + use crate::measure::parser::MeasureUnitParser; #[test] fn test_converter_factory() { let factory = ConverterFactory::new(); - let input_unit = factory.parser().try_from_str("meter").unwrap(); - let output_unit = factory.parser().try_from_str("foot").unwrap(); + let parser = MeasureUnitParser::new(); + let input_unit = parser.try_from_str("meter").unwrap(); + let output_unit = parser.try_from_str("foot").unwrap(); let converter = factory.converter::(&input_unit, &output_unit).unwrap(); let result = converter.convert(&1000.0); assert!( @@ -357,11 +354,9 @@ mod tests { #[test] fn test_converter_factory_with_constant_denominator() { let factory = ConverterFactory::new(); - let input_unit = factory - .parser() - .try_from_str("liter-per-100-kilometer") - .unwrap(); - let output_unit = factory.parser().try_from_str("mile-per-gallon").unwrap(); + let parser = MeasureUnitParser::new(); + let input_unit = parser.try_from_str("liter-per-100-kilometer").unwrap(); + let output_unit = parser.try_from_str("mile-per-gallon").unwrap(); let converter = factory.converter::(&input_unit, &output_unit).unwrap(); let result = converter.convert(&1.0); assert!( @@ -374,8 +369,9 @@ mod tests { #[test] fn test_converter_factory_with_offset() { let factory = ConverterFactory::new(); - let input_unit = factory.parser().try_from_str("celsius").unwrap(); - let output_unit = factory.parser().try_from_str("fahrenheit").unwrap(); + let parser = MeasureUnitParser::new(); + let input_unit = parser.try_from_str("celsius").unwrap(); + let output_unit = parser.try_from_str("fahrenheit").unwrap(); let converter = factory.converter::(&input_unit, &output_unit).unwrap(); let result = converter.convert(&0.0); assert!( diff --git a/components/experimental/src/units/provider.rs b/components/experimental/src/units/provider.rs index f43c57a4e8d..c55f59ec119 100644 --- a/components/experimental/src/units/provider.rs +++ b/components/experimental/src/units/provider.rs @@ -11,7 +11,6 @@ use icu_provider::prelude::*; use num_bigint::BigInt; -use zerotrie::ZeroTrieSimpleAscii; use zerovec::{ule::AsULE, VarZeroVec, ZeroVec}; use crate::measure::provider::single_unit::SingleUnit; @@ -41,15 +40,10 @@ icu_provider::data_marker!(UnitsInfoV1, UnitsInfo<'static>, is_singleton = true) #[cfg_attr(feature = "datagen", databake(path = icu_experimental::units::provider))] #[cfg_attr(feature = "serde", derive(serde::Deserialize))] pub struct UnitsInfo<'data> { - // TODO: remove this field once we are using this map from `measure/provider::UnitsTrie`. - /// Maps from unit name (e.g. foot) to it is conversion information. - #[cfg_attr(feature = "serde", serde(borrow))] - pub units_conversion_trie: ZeroTrieSimpleAscii>, - /// Contains the conversion information, such as the conversion rate and the base unit. /// For example, the conversion information for the unit `foot` is `1 foot = 0.3048 meter`. #[cfg_attr(feature = "serde", serde(borrow))] - pub convert_infos: VarZeroVec<'data, ConversionInfoULE>, + pub conversion_info: VarZeroVec<'data, ConversionInfoULE>, } icu_provider::data_struct!(UnitsInfo<'_>, #[cfg(feature = "datagen")]); diff --git a/components/experimental/tests/units/units_test.rs b/components/experimental/tests/units/units_test.rs index da0b11b95a1..2fce2a6c2de 100644 --- a/components/experimental/tests/units/units_test.rs +++ b/components/experimental/tests/units/units_test.rs @@ -4,6 +4,7 @@ use core::str::FromStr; +use icu_experimental::measure::parser::MeasureUnitParser; use icu_experimental::units::converter::UnitsConverter; use icu_experimental::units::converter_factory::ConverterFactory; use icu_experimental::units::ratio::IcuRatio; @@ -38,7 +39,7 @@ fn test_cldr_unit_tests() { .collect(); let converter_factory = ConverterFactory::new(); - let parser = converter_factory.parser(); + let parser = MeasureUnitParser::new(); for test in tests { let input_unit = parser @@ -207,7 +208,7 @@ fn test_units_non_convertible() { ]; let converter_factory = ConverterFactory::new(); - let parser = converter_factory.parser(); + let parser = MeasureUnitParser::new(); for (input, output) in non_convertible_units.iter() { let input_unit = parser @@ -286,7 +287,7 @@ fn test_unparsable_units() { ]; let converter_factory = ConverterFactory::new(); - let parser = converter_factory.parser(); + let parser = MeasureUnitParser::new(); unparsable_units.iter().for_each(|unit| { assert!( diff --git a/ffi/capi/src/lib.rs b/ffi/capi/src/lib.rs index 3c211b4d2af..b60f1d94621 100644 --- a/ffi/capi/src/lib.rs +++ b/ffi/capi/src/lib.rs @@ -106,6 +106,8 @@ pub mod list; pub mod locale; #[cfg(feature = "locale")] pub mod locale_directionality; +#[cfg(feature = "experimental")] +pub mod measure_unit_parser; #[cfg(feature = "datetime")] pub mod neo_datetime; #[cfg(feature = "normalizer")] diff --git a/ffi/capi/src/measure_unit_parser.rs b/ffi/capi/src/measure_unit_parser.rs new file mode 100644 index 00000000000..284a93e4e6e --- /dev/null +++ b/ffi/capi/src/measure_unit_parser.rs @@ -0,0 +1,70 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). + +#[diplomat::bridge] +#[diplomat::abi_rename = "icu4x_{0}_mv1"] +#[diplomat::attr(auto, namespace = "icu4x")] +pub mod ffi { + use alloc::boxed::Box; + + #[cfg(feature = "buffer_provider")] + use crate::errors::ffi::DataError; + #[cfg(feature = "buffer_provider")] + use crate::provider::ffi::DataProvider; + + #[diplomat::opaque] + /// An ICU4X Measure Unit Parser object, capable of parsing the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. + #[diplomat::rust_link(icu::experimental::measure::parser::MeasureUnitParser, Struct)] + pub struct MeasureUnitParser(pub icu_experimental::measure::parser::MeasureUnitParser); + + impl MeasureUnitParser { + /// Construct a new [`MeasureUnitParser`] instance using compiled data. + #[diplomat::rust_link( + icu::experimental::measure::parser::MeasureUnitParser::new, + FnInStruct + )] + #[diplomat::attr(auto, constructor)] + #[cfg(feature = "compiled_data")] + pub fn create() -> Box { + Box::new(MeasureUnitParser( + icu_experimental::measure::parser::MeasureUnitParser::new(), + )) + } + /// Construct a new [`MeasureUnitParser`] instance using a particular data source. + #[diplomat::rust_link( + icu::experimental::measure::parser::MeasureUnitParser::new, + FnInStruct + )] + #[diplomat::attr(all(supports = fallible_constructors, supports = named_constructors), named_constructor = "with_provider")] + #[cfg(feature = "buffer_provider")] + pub fn create_with_provider( + provider: &DataProvider, + ) -> Result, DataError> { + Ok(Box::new(MeasureUnitParser( + icu_experimental::measure::parser::MeasureUnitParser::try_new_with_buffer_provider( + provider.get()?, + )?, + ))) + } + + #[diplomat::rust_link( + icu::experimental::measure::parser::MeasureUnitParser::parse, + FnInStruct + )] + pub fn parse(&self, unit_id: &DiplomatStr) -> Option> { + self.0 + .try_from_utf8(unit_id) + .ok() + .map(MeasureUnit) + .map(Box::new) + } + } + #[diplomat::opaque] + /// An ICU4X Measurement Unit object which represents a single unit of measurement + /// such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. + /// + /// You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. + #[diplomat::rust_link(icu::experimental::measure::measureunit::MeasureUnit, Struct)] + pub struct MeasureUnit(pub icu_experimental::measure::measureunit::MeasureUnit); +} diff --git a/ffi/capi/src/units_converter.rs b/ffi/capi/src/units_converter.rs index 32f2e71c898..4ee15ae6a31 100644 --- a/ffi/capi/src/units_converter.rs +++ b/ffi/capi/src/units_converter.rs @@ -65,44 +65,14 @@ pub mod ffi { .map(UnitsConverter) .map(Box::new) } - - /// Creates a parser to parse the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. - #[diplomat::rust_link( - icu::experimental::units::converter_factory::ConverterFactory::parser, - FnInStruct - )] - pub fn parser<'a>(&'a self) -> Box> { - MeasureUnitParser(self.0.parser()).into() - } - } - - #[diplomat::opaque] - /// An ICU4X Measurement Unit parser object which is capable of parsing the CLDR unit identifier - /// (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. - #[diplomat::rust_link(icu::experimental::measure::parser::MeasureUnitParser, Struct)] - pub struct MeasureUnitParser<'a>(pub icu_experimental::measure::parser::MeasureUnitParser<'a>); - - impl<'a> MeasureUnitParser<'a> { - /// Parses the CLDR unit identifier (e.g. `meter-per-square-second`) and returns the corresponding [`MeasureUnit`], - /// if the identifier is valid. - #[diplomat::rust_link( - icu::experimental::measure::parser::MeasureUnitParser::parse, - FnInStruct - )] - pub fn parse(&self, unit_id: &DiplomatStr) -> Option> { - self.0 - .try_from_utf8(unit_id) - .ok() - .map(MeasureUnit) - .map(Box::new) - } } + // TODO: This is now duplicated in measure_unit_parser.rs, is that okay ? #[diplomat::opaque] /// An ICU4X Measurement Unit object which represents a single unit of measurement /// such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. /// - /// You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse_measure_unit` method. + /// You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. #[diplomat::rust_link(icu::experimental::measure::measureunit::MeasureUnit, Struct)] pub struct MeasureUnit(pub icu_experimental::measure::measureunit::MeasureUnit); diff --git a/provider/data/experimental/data/units_info_v1.rs.data b/provider/data/experimental/data/units_info_v1.rs.data index 242e3131f64..512c3168ddd 100644 --- a/provider/data/experimental/data/units_info_v1.rs.data +++ b/provider/data/experimental/data/units_info_v1.rs.data @@ -4,7 +4,7 @@ /// `icu`'s `_unstable` constructors. /// /// Using this implementation will embed the following data in the binary's data segment: -/// * 5622B[^1] for the singleton data struct +/// * 4266B[^1] for the singleton data struct /// /// [^1]: these numbers can be smaller in practice due to linker deduplication #[doc(hidden)] @@ -16,7 +16,7 @@ macro_rules! __impl_units_info_v1 { #[clippy::msrv = "1.81"] impl $provider { #[doc(hidden)] - pub const SINGLETON_UNITS_INFO_V1: &'static ::DataStruct = &icu::experimental::units::provider::UnitsInfo { units_conversion_trie: zerotrie::ZeroTrieSimpleAscii { store: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xE1x1abcdefghijklmnopqrstvwy\0\0\0\0\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\rJ\x95\xEDDl\xC9\x0E6BX\x99\xC1\xFB\x19D\xBC\xD3\x01\x7F\xB6\xBB\xD700-kilometer\x80\xC5cmrst\x03\x08\x1A*re\x81pere\x82c-\xC2ms\x06inute\x83econd\x84tronomical-unit\x85mosphere\x86\xC6aeiruy\x06\x17\x190;r\x87rel\x88\xC2ac\x06ufort\x89querel\x8At\x8Bitish-thermal-unit\x8C-it\x8D\xC2-s\x03jp\x8Ehel\x8Fte\x90\0\xC5aehou\x1B+5<\xC3lnr\x0B\x11orie\x90\x01-it\x90\x02dela\x90\x03at\x90\x04\xC2ln\x06sius\x90\x05tury\x90\x06\xC2ao\x04in\x90\x07\x90\x08ulomb\x90\tp\x90\n-\xC2jm\x03p\x90\x0Betric\x90\x0C\xC5aeoru\x14;>H\xC2ly\x05ton\x90\r\x90\x0E-person\x90\x0F\xC3cgs\x05\nade\x90\x10ree\x90\x11sert-spoon\x90\x12-imperial\x90\x13t\x90\x14\xC2ao\x03m\x90\x15p\x90\x16nam\x90\x17\xC3alm\x14 rth-\xC2mr\x05ass\x90\x18adius\x90\x19ectronvolt\x90\x1A\x90\x1B\xC4alou\x18.I\xC3hrt\t\rrenheit\x90\x1Cad\x90\x1Dhom\x90\x1Euid-ounce\x90\x1F-imperial\x90 \xC2or\x0F\xC2dt\tcalorie\x90!\x90\"tnight\x90#\xC2nr\x02\x90$long\x90%\xC3-ar\x071force\x90&\xC2ls\x10lon\x90'-imperial\x90(oline-energy-density\x90)a\xC3imy\x03\x05n\x90*\x90+\x90,\xC2eo\x14\xC3cnr\x06\ntare\x90-ry\x90.tz\x90/\xC2ru\tsepower\x900r\x901\xC2nt\x04ch\x902em\x903\xC2io\x06gger\x904\xC2-u\x04jp\x905le\x906\xC5aeino\x0C\x17'+\xC2rt\x04at\x907al\x908\xC2ln\x05vin\x909\x90:logram\x90;-force\x90aji\x90?\xC2iu\x1A\xC2gt\x12ht-\xC2sy\x06peed\x90@ear\x90Aer\x90B\xC2mx\x04en\x90C\x90D\xC3eio\x05 ter\x90E\xC2ln\x12e\x90F-scandinavian\x90Gute\x90H\xC2ln\x03e\x90Ith\x90J-person\x90K\xC3aei\r\x13utical-mile\x90Lwton\x90Mght\x90N\xC4fhsu\x0F\x12\x17\xC2gh\x08lucose\x90Og\x90Pm\x90Qaji\x90Rnce\x90S-troy\x90T\xC4aeio\x0E.T\xC2rs\x05sec\x90Ucal\x90Vr\xC2cm\x05ent\x90W\xC2iy\x0Cll\xC2ei\x02\x90Xon\x90Yriad\x90Z\xC2nx\x1E\xC2ct\x03h\x90[\x90\\-\xC2im\tmperial\x90]etric\x90^el\x90_\xC3iru\x04\nnt\x90`tion\x90and\x90b-force\x90cuart\x90d\xC2-e\nimperial\x90er\x90f\xC4aeio\x0F\x19#\xC2dn\x05ian\x90gkine\x90hvolution\x90i\xC2-n\x04jp\x90j\x90kd\x90l\xC8aehilotu\x03\x10'6:[ki\x90m\xC2-c\x04jp\x90nond\x90oaku\x90p-\xC2cl\x06loth\x90qength\x90re\xC2mv\x05ens\x90sert\x90tug\x90ular-\xC3lmr\x0B\x10uminosity\x90vass\x90wadius\x90x\xC2eo\x08radian\x90yne\x90zn\x90{\xC4aeho\n\x19!blespoon\x90|\xC2as\x07spoon\x90}la\x90~erm-us\x90\x7F\xC2-n\x04jp\x91\0\x91\x01ne\x91\x02olt\x91\x03\xC2ae\x04tt\x91\x04\xC2be\x04er\x91\x05k\x91\x06-person\x91\x07\xC2ae\x04rd\x91\x08ar\x91\t-person\x91\n") } }, convert_infos: unsafe { zerovec::vecs::VarZeroVec16::from_bytes_unchecked(b"\x9B\0\x16\0/\0C\0X\0n\0\x86\0\xA6\0\xC6\0\xE2\0\xFB\0\x0F\x01#\x01H\x01m\x01\x82\x01\x9F\x01\xB3\x01\xD2\x01\xF2\x01\x06\x02\x1B\x020\x02D\x02Z\x02p\x02\x89\x02\xA5\x02\xBA\x02\xCF\x02\xF6\x02\x0C\x03\"\x036\x03K\x03g\x03\x81\x03\x95\x03\xB1\x03\xCE\x03\xE3\x03\x01\x04\x17\x04A\x04U\x04j\x04\x8D\x04\xA3\x04\xBF\x04\xD9\x04\xF8\x04\x0E\x05$\x059\x05N\x05j\x05\x85\x05\x9E\x05\xC6\x05\xE0\x05\xF5\x05\x0E\x06#\x06F\x06_\x06\x88\x06\x9D\x06\xB2\x06\xC6\x06\xE2\x06\xF6\x06\x14\x07(\x07J\x07^\x07r\x07\x86\x07\xA7\x07\xC2\x07\xD8\x07\xEE\x07\n\x08$\x089\x08W\x08p\x08\x84\x08\x9A\x08\xAF\x08\xC3\x08\xE0\x08\xF4\x08\x08\t\x1D\t;\tO\tv\t\x9A\t\xBD\t\xD3\t\xED\t\x06\n'\nE\nY\nn\n\x84\n\x99\n\xB6\n\xD1\n\xEA\n\xFF\n\x13\x0B)\x0B=\x0BW\x0B\x7F\x0B\x9A\x0B\xB3\x0B\xC7\x0B\xE1\x0B\xF5\x0B\t\x0C\x1E\x0C3\x0CI\x0Ca\x0Cv\x0C\x8A\x0C\xA2\x0C\xB6\x0C\xCA\x0C\xED\x0C\x06\r#\rL\rl\r\x83\r\xA4\r\xBE\r\xD3\r\xEF\r\x0B\x0E)\x0EJ\x0Ea\x0Ey\x0E\x8E\x0E\xB1\x0E\xCF\x0E\xF2\x0E\x08\x0F\x1E\x0F4\x0FH\x0F\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0\xA0\x86\x01\x01\0\x01\0\0\0\x05\0\t\0\x0C\0\r\0\x02\0\0U\0\x92:\xD8\x12-1\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0y\0\x01`T\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0y\0\x01\x80\xC6\x13\0\x01\0\0\0\x05\0\n\0\x0B\0\x0C\0\x01\0\0U\0lZ\xBA\xD4\"\x01\0\x01\0\0\0\x0F\0\x12\0\x13\0\x14\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\xCD\x8B\x01\x01\0\x01\0\0\0\x0F\0\x12\0\x13\0\x14\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\xA0\x86\x01\x01\0\x01\0\0\0\x05\0\n\0\x0F\0\x10\0\x03\0\0U\0\x8D\x19FP\x02\0QJ\x8D\x0E\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0U\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x0B\0\x01\x01\0\x01\0\0\0\x0F\0\x14\0\x18\0\x19\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xB7o\xFE\x85\x05\xA0RW\x01\0\x01\0\0\0\x0F\0\x14\0\x18\0\x19\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\x007\xBCOH\x0C\x80\xF0\xFA\x02\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\x90\x01y\0\x01\0\0\0\x05\0\n\0\x10\0\x11\0\x03\0\0U\0\x7F\x9D\x93G3\0\xA4\x071\xAF\x05\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x0B\0\x08\x01\0\x01\0\0\0\x0F\0\x11\0\x12\0\x13\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x0B\x02}\0\x01\0\0\0\x0F\0\x11\0\x13\0\x14\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xE3(\xC4\t\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x13\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x01\x88\x13\0\x01\0\0\0\x05\0\x06\0\x07\0\t\0\x01\0\0I\0\x01\x01W\x15\x14\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0d\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0\x1D1q\x02\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x02\0\0U\0\x80O\x12y\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0\x7F\0\x01\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0 J\xA9\xD1\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\x10'\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xA0\x0F\0\x01\0\0\x01\x05\0\n\0\x1A\0\x1B\0\x01\0\0K\0\x0B\x1A\x95\xA9&\0\0\0\0@\"\x8A\tz\xC4\x86Z\xA8L;K\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80Q\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80Q\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\n\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0y\0\x01h\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\x10\xA5\xD4\xE8\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x03\0\0U\0\xD1\xEF\x06\0\0\x08\xAF/\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0o\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\x88Rjt\0\x01\0\0\0\x05\0\t\0\x10\0\x11\0\x03\0\0U\x003\xB3f\t\0\0\xC0\xBC\xF7\xE9\n\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\xE8\x03\x01\0\x01\0\0\0\x05\0\x10\0\x11\0\x12\0\x01\0\0K\0\0\0\xA02H\x88X\x9C\xA9\xF0\x04\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0tRa\x01\0\x01\0\0\0\x0F\0\x12\0\x1D\0\x1E\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x81r\x18\0\0\0JH\x01\x14\x16\x95E\x08\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0+\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\t\0\x01\0\0I\0\x05\t\x8F\xB3\xB4\0\0\0\x14\0\x15\0\x16\0\x17\0\x04\0\0\x7F\0\x02\0\0\x02\0\xFF\0\0K\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0w\x04q\x02\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0QJ\x8D\x0E\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x03\0\0U\0\xD1\xEF\x06\0\xA0\xAC\xB9\x03\0\x01\0\0\0\x0F\0\x11\0\x12\0\x13\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0X\x10\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0}\x01\xE2\x04\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\0u\x12\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x03@\x1F\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0:b}\0\x01\0\0\0\n\0\r\0\x0F\0\x10\0\x01\0\0U\0\xFE\0\0\x7F\0%\xFE\x02 N\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\xE1\xF5\x05\0\x01\0\0\0\x0F\0\x17\0\x1B\0\x1C\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\0\xA0\x06a\x8C\xF2\x05\nu\xD0W\x01\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x01\0\0K\0\x13\xE0b\0\xE8vH\x17\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x01\xE8\x03\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\x10'\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xFE\0\0\x02\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0y\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x0F\0\x16\0\x1C\0\x1D\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0'\\\xBC\r\x81v\x84\0 =\x88y-\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0\x7F\0\x10\x0E\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x7F\x88\x13\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0C\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\xCBL\x9CT\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0(y\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01\x18\0\x01\0\0\0\n\0\x14\0\x15\0\x16\0\x01\0\0C\0\xFF\0\0\x7F\0\0\0\xC6\\\x14_)\x17\x86\x7F\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0I\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x18y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0K\0\x01\x01\0\x01\0\0\0\x0F\0\x12\0\x14\0\x15\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\0%\xFE\x02 N\0\x01\0\0\0\n\0\x0C\0\x0E\0\x0F\0\x01\0\0U\0\xFF\0\0\x7F\0\xCF\x01\x84\x03\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x03\0\0U\0a\t\xFE3\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x03\0\0U\0\x01@\r\x03\0\x01\0\0\0\n\0\x0E\0\x0F\0\x10\0\x01\0\0U\0\xFF\0\0\x7F\0Jx\xDE\x11\x01\0\x01\0\0\0\x05\0\x0C\0\r\0\x0E\0\x01\0\0U\0\xC0F\"\xF7{\x9C!\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xE8\x03\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0\x13\0\x02\0\0U\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0\x13\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0\xD0\x11\x03}\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0\x10'\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x7F\0<\x01\0\x01\0\0\0\x05\0\x0F\0\x10\0\x11\0\x01\0\0C\0\0\0\xC6\\\x14_)\x17\x86\x7F\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x0C\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x0C\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0<\x07\x01\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0^\0\x01\x01\0\x01\0\0\0\n\0\x17\0\x1A\0\x1B\0\x01\0\0C\0\xFF\0\0K\0\0\0\0g\x1A\x8E|F.\x15\x96\x02LU}\x1B\0\x01\0\0\0\x0F\0\x14\0\x17\0\x18\0\x01\0\0K\0\xFE\0\0U\0\xFE\0\0\x7F\0+\xA3S5\x06@\r\x03\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\xFE\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x03\0\0U\0\x03@\r\x03\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\x85 \xB4\x02\0\x10^_\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x01\0\0K\0s\xDD\x0B@x}\x01\0\x01\0\0\x01\x05\0\x10\0\x14\0\x15\0\x01\0\0U\0\0\xA0\xF1\xE1;\xB0\xD7G1\x81\nc\xE0\x87\x18\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01d\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0q\0\x01\xE8\x03\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0q\0\x01@B\x0F\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0q\0\x01\x10'\0\x01\0\0\0\x05\0\t\0\x10\0\x11\0\x03\0\0U\0\x99\x194\x1C\0\0\x80(\xA5F\x07\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\x10\xA5\xD4\xE8\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\x08\xAF/\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xD0\x07\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0o\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0U\0\x7F@~\x05\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01\x01\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\x85 \xB4\x02\0\xE1\xF5\x05\0\x01\0\0\0\x0F\0\x15\0\x1B\0\x1C\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\09\xA9V]\x17\x08\0 J\xA9\xD1\x01\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\x88Rjt\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\x84\xD7\x17\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x04\0\x01\0\0\x01\x05\0\t\0\r\0\x0E\0\x01\0\0y\x000y\xE7\x03c\xE0\x87\x18\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0I\0\x05\t\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0y\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0\x80\xCAy\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x01*v\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0\x1D1\xC4\t\0\x01\0\0\0\x05\0\x07\0\x0B\0\x0C\0\x03\0\0U\0a\t\xC0rUO\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\xE0.y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x0B\0\x0C\0\x03\0\0U\0a\t\xE0\xF1\xEE\x07\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x05y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x04y\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x03\0\0\x7F\0\x02\0\0\x02\0\xFF\0\0K\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x0B\0\x10\0\x11\0\x01\0\0K\09\xA9V]\x17\x08\0\xD0\xFD\xEE\x8D\0\x01\0\0\0\x0F\0\x1B\0\x1C\0\x1D\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\0\0\0\xF2\xED\xD4\xD4\x94\r\xA5<\x01\x01\0\x01\0\0\0\x05\0\x12\0\x13\0\x14\0\x01\0\0K\0\0\0\x006?\x15\xD0\x1C(\xD5\x17\x19\x19\x01\0\x01\0\0\0\x05\0\t\0\n\0\x0B\0\x01\0\0U\0 \x8Aw)\x01\0\x01\0\0\x01\x05\0\x0C\0\x14\0\x15\0\x02\0\0y\0\0i\xFE\r#>\x0FIf\x17\xFD0\xC2Y\x02\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\xA3\xE3\xEC\x12\x80\xF0\xFA\x02\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x02]\x02\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\x003\xB3f\t\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\xFE\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x0F\0\x13\0\x14\0\x15\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xD0\x80I\x06\x01\0\x01\0\0\0\x05\0\x07\0\n\0\x0B\0\x03\0\0U\0a\t\xEC\x07\x02\0\x01\0\0\0\x05\0\t\0\x0B\0\x0C\0\x01\0\0K\0\x85 \xB4\x02P\xC3\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0K\0\xE8\x03\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\x01\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80:\t\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80:\t\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0w\x04\xE2\x04\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x01\0\x01") } }; + pub const SINGLETON_UNITS_INFO_V1: &'static ::DataStruct = &icu::experimental::units::provider::UnitsInfo { conversion_info: unsafe { zerovec::vecs::VarZeroVec16::from_bytes_unchecked(b"\x9B\0\x16\0/\0C\0X\0n\0\x86\0\xA6\0\xC6\0\xE2\0\xFB\0\x0F\x01#\x01H\x01m\x01\x82\x01\x9F\x01\xB3\x01\xD2\x01\xF2\x01\x06\x02\x1B\x020\x02D\x02Z\x02p\x02\x89\x02\xA5\x02\xBA\x02\xCF\x02\xF6\x02\x0C\x03\"\x036\x03K\x03g\x03\x81\x03\x95\x03\xB1\x03\xCE\x03\xE3\x03\x01\x04\x17\x04A\x04U\x04j\x04\x8D\x04\xA3\x04\xBF\x04\xD9\x04\xF8\x04\x0E\x05$\x059\x05N\x05j\x05\x85\x05\x9E\x05\xC6\x05\xE0\x05\xF5\x05\x0E\x06#\x06F\x06_\x06\x88\x06\x9D\x06\xB2\x06\xC6\x06\xE2\x06\xF6\x06\x14\x07(\x07J\x07^\x07r\x07\x86\x07\xA7\x07\xC2\x07\xD8\x07\xEE\x07\n\x08$\x089\x08W\x08p\x08\x84\x08\x9A\x08\xAF\x08\xC3\x08\xE0\x08\xF4\x08\x08\t\x1D\t;\tO\tv\t\x9A\t\xBD\t\xD3\t\xED\t\x06\n'\nE\nY\nn\n\x84\n\x99\n\xB6\n\xD1\n\xEA\n\xFF\n\x13\x0B)\x0B=\x0BW\x0B\x7F\x0B\x9A\x0B\xB3\x0B\xC7\x0B\xE1\x0B\xF5\x0B\t\x0C\x1E\x0C3\x0CI\x0Ca\x0Cv\x0C\x8A\x0C\xA2\x0C\xB6\x0C\xCA\x0C\xED\x0C\x06\r#\rL\rl\r\x83\r\xA4\r\xBE\r\xD3\r\xEF\r\x0B\x0E)\x0EJ\x0Ea\x0Ey\x0E\x8E\x0E\xB1\x0E\xCF\x0E\xF2\x0E\x08\x0F\x1E\x0F4\x0FH\x0F\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0\xA0\x86\x01\x01\0\x01\0\0\0\x05\0\t\0\x0C\0\r\0\x02\0\0U\0\x92:\xD8\x12-1\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0y\0\x01`T\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0y\0\x01\x80\xC6\x13\0\x01\0\0\0\x05\0\n\0\x0B\0\x0C\0\x01\0\0U\0lZ\xBA\xD4\"\x01\0\x01\0\0\0\x0F\0\x12\0\x13\0\x14\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\xCD\x8B\x01\x01\0\x01\0\0\0\x0F\0\x12\0\x13\0\x14\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\xA0\x86\x01\x01\0\x01\0\0\0\x05\0\n\0\x0F\0\x10\0\x03\0\0U\0\x8D\x19FP\x02\0QJ\x8D\x0E\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0U\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x0B\0\x01\x01\0\x01\0\0\0\x0F\0\x14\0\x18\0\x19\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xB7o\xFE\x85\x05\xA0RW\x01\0\x01\0\0\0\x0F\0\x14\0\x18\0\x19\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\x007\xBCOH\x0C\x80\xF0\xFA\x02\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\x90\x01y\0\x01\0\0\0\x05\0\n\0\x10\0\x11\0\x03\0\0U\0\x7F\x9D\x93G3\0\xA4\x071\xAF\x05\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x0B\0\x08\x01\0\x01\0\0\0\x0F\0\x11\0\x12\0\x13\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x0B\x02}\0\x01\0\0\0\x0F\0\x11\0\x13\0\x14\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xE3(\xC4\t\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x13\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x01\x88\x13\0\x01\0\0\0\x05\0\x06\0\x07\0\t\0\x01\0\0I\0\x01\x01W\x15\x14\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0d\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0\x1D1q\x02\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x02\0\0U\0\x80O\x12y\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0\x7F\0\x01\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0 J\xA9\xD1\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\x10'\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xA0\x0F\0\x01\0\0\x01\x05\0\n\0\x1A\0\x1B\0\x01\0\0K\0\x0B\x1A\x95\xA9&\0\0\0\0@\"\x8A\tz\xC4\x86Z\xA8L;K\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80Q\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80Q\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\n\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0y\0\x01h\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\x10\xA5\xD4\xE8\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x03\0\0U\0\xD1\xEF\x06\0\0\x08\xAF/\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0o\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\x88Rjt\0\x01\0\0\0\x05\0\t\0\x10\0\x11\0\x03\0\0U\x003\xB3f\t\0\0\xC0\xBC\xF7\xE9\n\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\xE8\x03\x01\0\x01\0\0\0\x05\0\x10\0\x11\0\x12\0\x01\0\0K\0\0\0\xA02H\x88X\x9C\xA9\xF0\x04\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0tRa\x01\0\x01\0\0\0\x0F\0\x12\0\x1D\0\x1E\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x81r\x18\0\0\0JH\x01\x14\x16\x95E\x08\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0+\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\t\0\x01\0\0I\0\x05\t\x8F\xB3\xB4\0\0\0\x14\0\x15\0\x16\0\x17\0\x04\0\0\x7F\0\x02\0\0\x02\0\xFF\0\0K\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0w\x04q\x02\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0QJ\x8D\x0E\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x03\0\0U\0\xD1\xEF\x06\0\xA0\xAC\xB9\x03\0\x01\0\0\0\x0F\0\x11\0\x12\0\x13\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0X\x10\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0}\x01\xE2\x04\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\0u\x12\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x03@\x1F\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0:b}\0\x01\0\0\0\n\0\r\0\x0F\0\x10\0\x01\0\0U\0\xFE\0\0\x7F\0%\xFE\x02 N\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\xE1\xF5\x05\0\x01\0\0\0\x0F\0\x17\0\x1B\0\x1C\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\0\xA0\x06a\x8C\xF2\x05\nu\xD0W\x01\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x01\0\0K\0\x13\xE0b\0\xE8vH\x17\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x01\xE8\x03\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\x10'\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xFE\0\0\x02\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0y\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x0F\0\x16\0\x1C\0\x1D\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0'\\\xBC\r\x81v\x84\0 =\x88y-\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0\x7F\0\x10\x0E\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x7F\x88\x13\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0C\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\xCBL\x9CT\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0(y\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01\x18\0\x01\0\0\0\n\0\x14\0\x15\0\x16\0\x01\0\0C\0\xFF\0\0\x7F\0\0\0\xC6\\\x14_)\x17\x86\x7F\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0I\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x18y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0K\0\x01\x01\0\x01\0\0\0\x0F\0\x12\0\x14\0\x15\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\0%\xFE\x02 N\0\x01\0\0\0\n\0\x0C\0\x0E\0\x0F\0\x01\0\0U\0\xFF\0\0\x7F\0\xCF\x01\x84\x03\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x03\0\0U\0a\t\xFE3\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x03\0\0U\0\x01@\r\x03\0\x01\0\0\0\n\0\x0E\0\x0F\0\x10\0\x01\0\0U\0\xFF\0\0\x7F\0Jx\xDE\x11\x01\0\x01\0\0\0\x05\0\x0C\0\r\0\x0E\0\x01\0\0U\0\xC0F\"\xF7{\x9C!\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xE8\x03\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0\x13\0\x02\0\0U\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0\x13\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0\xD0\x11\x03}\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0\x10'\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x7F\0<\x01\0\x01\0\0\0\x05\0\x0F\0\x10\0\x11\0\x01\0\0C\0\0\0\xC6\\\x14_)\x17\x86\x7F\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x0C\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x0C\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0<\x07\x01\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0^\0\x01\x01\0\x01\0\0\0\n\0\x17\0\x1A\0\x1B\0\x01\0\0C\0\xFF\0\0K\0\0\0\0g\x1A\x8E|F.\x15\x96\x02LU}\x1B\0\x01\0\0\0\x0F\0\x14\0\x17\0\x18\0\x01\0\0K\0\xFE\0\0U\0\xFE\0\0\x7F\0+\xA3S5\x06@\r\x03\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\xFE\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x03\0\0U\0\x03@\r\x03\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\x85 \xB4\x02\0\x10^_\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x01\0\0K\0s\xDD\x0B@x}\x01\0\x01\0\0\x01\x05\0\x10\0\x14\0\x15\0\x01\0\0U\0\0\xA0\xF1\xE1;\xB0\xD7G1\x81\nc\xE0\x87\x18\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01d\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0q\0\x01\xE8\x03\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0q\0\x01@B\x0F\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0q\0\x01\x10'\0\x01\0\0\0\x05\0\t\0\x10\0\x11\0\x03\0\0U\0\x99\x194\x1C\0\0\x80(\xA5F\x07\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\x10\xA5\xD4\xE8\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\x08\xAF/\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xD0\x07\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0o\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0U\0\x7F@~\x05\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01\x01\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\x85 \xB4\x02\0\xE1\xF5\x05\0\x01\0\0\0\x0F\0\x15\0\x1B\0\x1C\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\09\xA9V]\x17\x08\0 J\xA9\xD1\x01\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\x88Rjt\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\x84\xD7\x17\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x04\0\x01\0\0\x01\x05\0\t\0\r\0\x0E\0\x01\0\0y\x000y\xE7\x03c\xE0\x87\x18\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0I\0\x05\t\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0y\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0\x80\xCAy\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x01*v\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0\x1D1\xC4\t\0\x01\0\0\0\x05\0\x07\0\x0B\0\x0C\0\x03\0\0U\0a\t\xC0rUO\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\xE0.y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x0B\0\x0C\0\x03\0\0U\0a\t\xE0\xF1\xEE\x07\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x05y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x04y\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x03\0\0\x7F\0\x02\0\0\x02\0\xFF\0\0K\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x0B\0\x10\0\x11\0\x01\0\0K\09\xA9V]\x17\x08\0\xD0\xFD\xEE\x8D\0\x01\0\0\0\x0F\0\x1B\0\x1C\0\x1D\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\0\0\0\xF2\xED\xD4\xD4\x94\r\xA5<\x01\x01\0\x01\0\0\0\x05\0\x12\0\x13\0\x14\0\x01\0\0K\0\0\0\x006?\x15\xD0\x1C(\xD5\x17\x19\x19\x01\0\x01\0\0\0\x05\0\t\0\n\0\x0B\0\x01\0\0U\0 \x8Aw)\x01\0\x01\0\0\x01\x05\0\x0C\0\x14\0\x15\0\x02\0\0y\0\0i\xFE\r#>\x0FIf\x17\xFD0\xC2Y\x02\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\xA3\xE3\xEC\x12\x80\xF0\xFA\x02\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x02]\x02\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\x003\xB3f\t\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\xFE\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x0F\0\x13\0\x14\0\x15\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xD0\x80I\x06\x01\0\x01\0\0\0\x05\0\x07\0\n\0\x0B\0\x03\0\0U\0a\t\xEC\x07\x02\0\x01\0\0\0\x05\0\t\0\x0B\0\x0C\0\x01\0\0K\0\x85 \xB4\x02P\xC3\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0K\0\xE8\x03\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\x01\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80:\t\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80:\t\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0w\x04\xE2\x04\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x01\0\x01") } }; } #[clippy::msrv = "1.81"] impl icu_provider::DataProvider for $provider { diff --git a/provider/data/experimental/fingerprints.csv b/provider/data/experimental/fingerprints.csv index 6021eabc4cd..db663bd584f 100644 --- a/provider/data/experimental/fingerprints.csv +++ b/provider/data/experimental/fingerprints.csv @@ -97985,7 +97985,7 @@ units/essentials/v1, zh/long, 419B, 328B, 162bb2ddf0424f5 units/essentials/v1, zu/long, 472B, 381B, 9d8d26c99e1c6c2d units/essentials/v1, zu/narrow, 368B, 277B, 91d5c729f7a05ce9 units/essentials/v1, zu/short, 366B, 275B, 1ede7e00e34c0972 -units/info/v1, , 5622B, 5579B, 29bf593f70f52f7e +units/info/v1, , 4266B, 4244B, bfab744371ecba28 units/trie/v1, , 1356B, 1335B, c02e6bb603fb4d72 variant/display/names/v1, , 483B, 91 identifiers variant/display/names/v1, , 131758B, 127803B, 89 unique payloads diff --git a/provider/data/experimental/stubdata/units_info_v1.rs.data b/provider/data/experimental/stubdata/units_info_v1.rs.data index 242e3131f64..512c3168ddd 100644 --- a/provider/data/experimental/stubdata/units_info_v1.rs.data +++ b/provider/data/experimental/stubdata/units_info_v1.rs.data @@ -4,7 +4,7 @@ /// `icu`'s `_unstable` constructors. /// /// Using this implementation will embed the following data in the binary's data segment: -/// * 5622B[^1] for the singleton data struct +/// * 4266B[^1] for the singleton data struct /// /// [^1]: these numbers can be smaller in practice due to linker deduplication #[doc(hidden)] @@ -16,7 +16,7 @@ macro_rules! __impl_units_info_v1 { #[clippy::msrv = "1.81"] impl $provider { #[doc(hidden)] - pub const SINGLETON_UNITS_INFO_V1: &'static ::DataStruct = &icu::experimental::units::provider::UnitsInfo { units_conversion_trie: zerotrie::ZeroTrieSimpleAscii { store: unsafe { zerovec::ZeroVec::from_bytes_unchecked(b"\xE1x1abcdefghijklmnopqrstvwy\0\0\0\0\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\rJ\x95\xEDDl\xC9\x0E6BX\x99\xC1\xFB\x19D\xBC\xD3\x01\x7F\xB6\xBB\xD700-kilometer\x80\xC5cmrst\x03\x08\x1A*re\x81pere\x82c-\xC2ms\x06inute\x83econd\x84tronomical-unit\x85mosphere\x86\xC6aeiruy\x06\x17\x190;r\x87rel\x88\xC2ac\x06ufort\x89querel\x8At\x8Bitish-thermal-unit\x8C-it\x8D\xC2-s\x03jp\x8Ehel\x8Fte\x90\0\xC5aehou\x1B+5<\xC3lnr\x0B\x11orie\x90\x01-it\x90\x02dela\x90\x03at\x90\x04\xC2ln\x06sius\x90\x05tury\x90\x06\xC2ao\x04in\x90\x07\x90\x08ulomb\x90\tp\x90\n-\xC2jm\x03p\x90\x0Betric\x90\x0C\xC5aeoru\x14;>H\xC2ly\x05ton\x90\r\x90\x0E-person\x90\x0F\xC3cgs\x05\nade\x90\x10ree\x90\x11sert-spoon\x90\x12-imperial\x90\x13t\x90\x14\xC2ao\x03m\x90\x15p\x90\x16nam\x90\x17\xC3alm\x14 rth-\xC2mr\x05ass\x90\x18adius\x90\x19ectronvolt\x90\x1A\x90\x1B\xC4alou\x18.I\xC3hrt\t\rrenheit\x90\x1Cad\x90\x1Dhom\x90\x1Euid-ounce\x90\x1F-imperial\x90 \xC2or\x0F\xC2dt\tcalorie\x90!\x90\"tnight\x90#\xC2nr\x02\x90$long\x90%\xC3-ar\x071force\x90&\xC2ls\x10lon\x90'-imperial\x90(oline-energy-density\x90)a\xC3imy\x03\x05n\x90*\x90+\x90,\xC2eo\x14\xC3cnr\x06\ntare\x90-ry\x90.tz\x90/\xC2ru\tsepower\x900r\x901\xC2nt\x04ch\x902em\x903\xC2io\x06gger\x904\xC2-u\x04jp\x905le\x906\xC5aeino\x0C\x17'+\xC2rt\x04at\x907al\x908\xC2ln\x05vin\x909\x90:logram\x90;-force\x90aji\x90?\xC2iu\x1A\xC2gt\x12ht-\xC2sy\x06peed\x90@ear\x90Aer\x90B\xC2mx\x04en\x90C\x90D\xC3eio\x05 ter\x90E\xC2ln\x12e\x90F-scandinavian\x90Gute\x90H\xC2ln\x03e\x90Ith\x90J-person\x90K\xC3aei\r\x13utical-mile\x90Lwton\x90Mght\x90N\xC4fhsu\x0F\x12\x17\xC2gh\x08lucose\x90Og\x90Pm\x90Qaji\x90Rnce\x90S-troy\x90T\xC4aeio\x0E.T\xC2rs\x05sec\x90Ucal\x90Vr\xC2cm\x05ent\x90W\xC2iy\x0Cll\xC2ei\x02\x90Xon\x90Yriad\x90Z\xC2nx\x1E\xC2ct\x03h\x90[\x90\\-\xC2im\tmperial\x90]etric\x90^el\x90_\xC3iru\x04\nnt\x90`tion\x90and\x90b-force\x90cuart\x90d\xC2-e\nimperial\x90er\x90f\xC4aeio\x0F\x19#\xC2dn\x05ian\x90gkine\x90hvolution\x90i\xC2-n\x04jp\x90j\x90kd\x90l\xC8aehilotu\x03\x10'6:[ki\x90m\xC2-c\x04jp\x90nond\x90oaku\x90p-\xC2cl\x06loth\x90qength\x90re\xC2mv\x05ens\x90sert\x90tug\x90ular-\xC3lmr\x0B\x10uminosity\x90vass\x90wadius\x90x\xC2eo\x08radian\x90yne\x90zn\x90{\xC4aeho\n\x19!blespoon\x90|\xC2as\x07spoon\x90}la\x90~erm-us\x90\x7F\xC2-n\x04jp\x91\0\x91\x01ne\x91\x02olt\x91\x03\xC2ae\x04tt\x91\x04\xC2be\x04er\x91\x05k\x91\x06-person\x91\x07\xC2ae\x04rd\x91\x08ar\x91\t-person\x91\n") } }, convert_infos: unsafe { zerovec::vecs::VarZeroVec16::from_bytes_unchecked(b"\x9B\0\x16\0/\0C\0X\0n\0\x86\0\xA6\0\xC6\0\xE2\0\xFB\0\x0F\x01#\x01H\x01m\x01\x82\x01\x9F\x01\xB3\x01\xD2\x01\xF2\x01\x06\x02\x1B\x020\x02D\x02Z\x02p\x02\x89\x02\xA5\x02\xBA\x02\xCF\x02\xF6\x02\x0C\x03\"\x036\x03K\x03g\x03\x81\x03\x95\x03\xB1\x03\xCE\x03\xE3\x03\x01\x04\x17\x04A\x04U\x04j\x04\x8D\x04\xA3\x04\xBF\x04\xD9\x04\xF8\x04\x0E\x05$\x059\x05N\x05j\x05\x85\x05\x9E\x05\xC6\x05\xE0\x05\xF5\x05\x0E\x06#\x06F\x06_\x06\x88\x06\x9D\x06\xB2\x06\xC6\x06\xE2\x06\xF6\x06\x14\x07(\x07J\x07^\x07r\x07\x86\x07\xA7\x07\xC2\x07\xD8\x07\xEE\x07\n\x08$\x089\x08W\x08p\x08\x84\x08\x9A\x08\xAF\x08\xC3\x08\xE0\x08\xF4\x08\x08\t\x1D\t;\tO\tv\t\x9A\t\xBD\t\xD3\t\xED\t\x06\n'\nE\nY\nn\n\x84\n\x99\n\xB6\n\xD1\n\xEA\n\xFF\n\x13\x0B)\x0B=\x0BW\x0B\x7F\x0B\x9A\x0B\xB3\x0B\xC7\x0B\xE1\x0B\xF5\x0B\t\x0C\x1E\x0C3\x0CI\x0Ca\x0Cv\x0C\x8A\x0C\xA2\x0C\xB6\x0C\xCA\x0C\xED\x0C\x06\r#\rL\rl\r\x83\r\xA4\r\xBE\r\xD3\r\xEF\r\x0B\x0E)\x0EJ\x0Ea\x0Ey\x0E\x8E\x0E\xB1\x0E\xCF\x0E\xF2\x0E\x08\x0F\x1E\x0F4\x0FH\x0F\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0\xA0\x86\x01\x01\0\x01\0\0\0\x05\0\t\0\x0C\0\r\0\x02\0\0U\0\x92:\xD8\x12-1\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0y\0\x01`T\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0y\0\x01\x80\xC6\x13\0\x01\0\0\0\x05\0\n\0\x0B\0\x0C\0\x01\0\0U\0lZ\xBA\xD4\"\x01\0\x01\0\0\0\x0F\0\x12\0\x13\0\x14\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\xCD\x8B\x01\x01\0\x01\0\0\0\x0F\0\x12\0\x13\0\x14\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\xA0\x86\x01\x01\0\x01\0\0\0\x05\0\n\0\x0F\0\x10\0\x03\0\0U\0\x8D\x19FP\x02\0QJ\x8D\x0E\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0U\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x0B\0\x01\x01\0\x01\0\0\0\x0F\0\x14\0\x18\0\x19\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xB7o\xFE\x85\x05\xA0RW\x01\0\x01\0\0\0\x0F\0\x14\0\x18\0\x19\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\x007\xBCOH\x0C\x80\xF0\xFA\x02\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\x90\x01y\0\x01\0\0\0\x05\0\n\0\x10\0\x11\0\x03\0\0U\0\x7F\x9D\x93G3\0\xA4\x071\xAF\x05\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x0B\0\x08\x01\0\x01\0\0\0\x0F\0\x11\0\x12\0\x13\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x0B\x02}\0\x01\0\0\0\x0F\0\x11\0\x13\0\x14\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xE3(\xC4\t\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x13\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x01\x88\x13\0\x01\0\0\0\x05\0\x06\0\x07\0\t\0\x01\0\0I\0\x01\x01W\x15\x14\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0d\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0\x1D1q\x02\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x02\0\0U\0\x80O\x12y\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0\x7F\0\x01\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0 J\xA9\xD1\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\x10'\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xA0\x0F\0\x01\0\0\x01\x05\0\n\0\x1A\0\x1B\0\x01\0\0K\0\x0B\x1A\x95\xA9&\0\0\0\0@\"\x8A\tz\xC4\x86Z\xA8L;K\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80Q\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80Q\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\n\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0y\0\x01h\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\x10\xA5\xD4\xE8\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x03\0\0U\0\xD1\xEF\x06\0\0\x08\xAF/\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0o\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\x88Rjt\0\x01\0\0\0\x05\0\t\0\x10\0\x11\0\x03\0\0U\x003\xB3f\t\0\0\xC0\xBC\xF7\xE9\n\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\xE8\x03\x01\0\x01\0\0\0\x05\0\x10\0\x11\0\x12\0\x01\0\0K\0\0\0\xA02H\x88X\x9C\xA9\xF0\x04\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0tRa\x01\0\x01\0\0\0\x0F\0\x12\0\x1D\0\x1E\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x81r\x18\0\0\0JH\x01\x14\x16\x95E\x08\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0+\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\t\0\x01\0\0I\0\x05\t\x8F\xB3\xB4\0\0\0\x14\0\x15\0\x16\0\x17\0\x04\0\0\x7F\0\x02\0\0\x02\0\xFF\0\0K\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0w\x04q\x02\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0QJ\x8D\x0E\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x03\0\0U\0\xD1\xEF\x06\0\xA0\xAC\xB9\x03\0\x01\0\0\0\x0F\0\x11\0\x12\0\x13\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0X\x10\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0}\x01\xE2\x04\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\0u\x12\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x03@\x1F\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0:b}\0\x01\0\0\0\n\0\r\0\x0F\0\x10\0\x01\0\0U\0\xFE\0\0\x7F\0%\xFE\x02 N\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\xE1\xF5\x05\0\x01\0\0\0\x0F\0\x17\0\x1B\0\x1C\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\0\xA0\x06a\x8C\xF2\x05\nu\xD0W\x01\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x01\0\0K\0\x13\xE0b\0\xE8vH\x17\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x01\xE8\x03\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\x10'\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xFE\0\0\x02\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0y\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x0F\0\x16\0\x1C\0\x1D\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0'\\\xBC\r\x81v\x84\0 =\x88y-\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0\x7F\0\x10\x0E\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x7F\x88\x13\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0C\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\xCBL\x9CT\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0(y\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01\x18\0\x01\0\0\0\n\0\x14\0\x15\0\x16\0\x01\0\0C\0\xFF\0\0\x7F\0\0\0\xC6\\\x14_)\x17\x86\x7F\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0I\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x18y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0K\0\x01\x01\0\x01\0\0\0\x0F\0\x12\0\x14\0\x15\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\0%\xFE\x02 N\0\x01\0\0\0\n\0\x0C\0\x0E\0\x0F\0\x01\0\0U\0\xFF\0\0\x7F\0\xCF\x01\x84\x03\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x03\0\0U\0a\t\xFE3\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x03\0\0U\0\x01@\r\x03\0\x01\0\0\0\n\0\x0E\0\x0F\0\x10\0\x01\0\0U\0\xFF\0\0\x7F\0Jx\xDE\x11\x01\0\x01\0\0\0\x05\0\x0C\0\r\0\x0E\0\x01\0\0U\0\xC0F\"\xF7{\x9C!\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xE8\x03\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0\x13\0\x02\0\0U\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0\x13\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0\xD0\x11\x03}\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0\x10'\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x7F\0<\x01\0\x01\0\0\0\x05\0\x0F\0\x10\0\x11\0\x01\0\0C\0\0\0\xC6\\\x14_)\x17\x86\x7F\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x0C\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x0C\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0<\x07\x01\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0^\0\x01\x01\0\x01\0\0\0\n\0\x17\0\x1A\0\x1B\0\x01\0\0C\0\xFF\0\0K\0\0\0\0g\x1A\x8E|F.\x15\x96\x02LU}\x1B\0\x01\0\0\0\x0F\0\x14\0\x17\0\x18\0\x01\0\0K\0\xFE\0\0U\0\xFE\0\0\x7F\0+\xA3S5\x06@\r\x03\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\xFE\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x03\0\0U\0\x03@\r\x03\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\x85 \xB4\x02\0\x10^_\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x01\0\0K\0s\xDD\x0B@x}\x01\0\x01\0\0\x01\x05\0\x10\0\x14\0\x15\0\x01\0\0U\0\0\xA0\xF1\xE1;\xB0\xD7G1\x81\nc\xE0\x87\x18\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01d\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0q\0\x01\xE8\x03\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0q\0\x01@B\x0F\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0q\0\x01\x10'\0\x01\0\0\0\x05\0\t\0\x10\0\x11\0\x03\0\0U\0\x99\x194\x1C\0\0\x80(\xA5F\x07\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\x10\xA5\xD4\xE8\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\x08\xAF/\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xD0\x07\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0o\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0U\0\x7F@~\x05\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01\x01\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\x85 \xB4\x02\0\xE1\xF5\x05\0\x01\0\0\0\x0F\0\x15\0\x1B\0\x1C\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\09\xA9V]\x17\x08\0 J\xA9\xD1\x01\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\x88Rjt\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\x84\xD7\x17\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x04\0\x01\0\0\x01\x05\0\t\0\r\0\x0E\0\x01\0\0y\x000y\xE7\x03c\xE0\x87\x18\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0I\0\x05\t\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0y\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0\x80\xCAy\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x01*v\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0\x1D1\xC4\t\0\x01\0\0\0\x05\0\x07\0\x0B\0\x0C\0\x03\0\0U\0a\t\xC0rUO\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\xE0.y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x0B\0\x0C\0\x03\0\0U\0a\t\xE0\xF1\xEE\x07\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x05y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x04y\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x03\0\0\x7F\0\x02\0\0\x02\0\xFF\0\0K\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x0B\0\x10\0\x11\0\x01\0\0K\09\xA9V]\x17\x08\0\xD0\xFD\xEE\x8D\0\x01\0\0\0\x0F\0\x1B\0\x1C\0\x1D\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\0\0\0\xF2\xED\xD4\xD4\x94\r\xA5<\x01\x01\0\x01\0\0\0\x05\0\x12\0\x13\0\x14\0\x01\0\0K\0\0\0\x006?\x15\xD0\x1C(\xD5\x17\x19\x19\x01\0\x01\0\0\0\x05\0\t\0\n\0\x0B\0\x01\0\0U\0 \x8Aw)\x01\0\x01\0\0\x01\x05\0\x0C\0\x14\0\x15\0\x02\0\0y\0\0i\xFE\r#>\x0FIf\x17\xFD0\xC2Y\x02\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\xA3\xE3\xEC\x12\x80\xF0\xFA\x02\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x02]\x02\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\x003\xB3f\t\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\xFE\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x0F\0\x13\0\x14\0\x15\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xD0\x80I\x06\x01\0\x01\0\0\0\x05\0\x07\0\n\0\x0B\0\x03\0\0U\0a\t\xEC\x07\x02\0\x01\0\0\0\x05\0\t\0\x0B\0\x0C\0\x01\0\0K\0\x85 \xB4\x02P\xC3\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0K\0\xE8\x03\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\x01\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80:\t\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80:\t\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0w\x04\xE2\x04\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x01\0\x01") } }; + pub const SINGLETON_UNITS_INFO_V1: &'static ::DataStruct = &icu::experimental::units::provider::UnitsInfo { conversion_info: unsafe { zerovec::vecs::VarZeroVec16::from_bytes_unchecked(b"\x9B\0\x16\0/\0C\0X\0n\0\x86\0\xA6\0\xC6\0\xE2\0\xFB\0\x0F\x01#\x01H\x01m\x01\x82\x01\x9F\x01\xB3\x01\xD2\x01\xF2\x01\x06\x02\x1B\x020\x02D\x02Z\x02p\x02\x89\x02\xA5\x02\xBA\x02\xCF\x02\xF6\x02\x0C\x03\"\x036\x03K\x03g\x03\x81\x03\x95\x03\xB1\x03\xCE\x03\xE3\x03\x01\x04\x17\x04A\x04U\x04j\x04\x8D\x04\xA3\x04\xBF\x04\xD9\x04\xF8\x04\x0E\x05$\x059\x05N\x05j\x05\x85\x05\x9E\x05\xC6\x05\xE0\x05\xF5\x05\x0E\x06#\x06F\x06_\x06\x88\x06\x9D\x06\xB2\x06\xC6\x06\xE2\x06\xF6\x06\x14\x07(\x07J\x07^\x07r\x07\x86\x07\xA7\x07\xC2\x07\xD8\x07\xEE\x07\n\x08$\x089\x08W\x08p\x08\x84\x08\x9A\x08\xAF\x08\xC3\x08\xE0\x08\xF4\x08\x08\t\x1D\t;\tO\tv\t\x9A\t\xBD\t\xD3\t\xED\t\x06\n'\nE\nY\nn\n\x84\n\x99\n\xB6\n\xD1\n\xEA\n\xFF\n\x13\x0B)\x0B=\x0BW\x0B\x7F\x0B\x9A\x0B\xB3\x0B\xC7\x0B\xE1\x0B\xF5\x0B\t\x0C\x1E\x0C3\x0CI\x0Ca\x0Cv\x0C\x8A\x0C\xA2\x0C\xB6\x0C\xCA\x0C\xED\x0C\x06\r#\rL\rl\r\x83\r\xA4\r\xBE\r\xD3\r\xEF\r\x0B\x0E)\x0EJ\x0Ea\x0Ey\x0E\x8E\x0E\xB1\x0E\xCF\x0E\xF2\x0E\x08\x0F\x1E\x0F4\x0FH\x0F\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0\xA0\x86\x01\x01\0\x01\0\0\0\x05\0\t\0\x0C\0\r\0\x02\0\0U\0\x92:\xD8\x12-1\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0y\0\x01`T\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0y\0\x01\x80\xC6\x13\0\x01\0\0\0\x05\0\n\0\x0B\0\x0C\0\x01\0\0U\0lZ\xBA\xD4\"\x01\0\x01\0\0\0\x0F\0\x12\0\x13\0\x14\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\xCD\x8B\x01\x01\0\x01\0\0\0\x0F\0\x12\0\x13\0\x14\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\xA0\x86\x01\x01\0\x01\0\0\0\x05\0\n\0\x0F\0\x10\0\x03\0\0U\0\x8D\x19FP\x02\0QJ\x8D\x0E\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0U\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x0B\0\x01\x01\0\x01\0\0\0\x0F\0\x14\0\x18\0\x19\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xB7o\xFE\x85\x05\xA0RW\x01\0\x01\0\0\0\x0F\0\x14\0\x18\0\x19\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\x007\xBCOH\x0C\x80\xF0\xFA\x02\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\x90\x01y\0\x01\0\0\0\x05\0\n\0\x10\0\x11\0\x03\0\0U\0\x7F\x9D\x93G3\0\xA4\x071\xAF\x05\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x0B\0\x08\x01\0\x01\0\0\0\x0F\0\x11\0\x12\0\x13\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x0B\x02}\0\x01\0\0\0\x0F\0\x11\0\x13\0\x14\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xE3(\xC4\t\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x13\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x01\x88\x13\0\x01\0\0\0\x05\0\x06\0\x07\0\t\0\x01\0\0I\0\x01\x01W\x15\x14\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0d\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0\x1D1q\x02\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x02\0\0U\0\x80O\x12y\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0\x7F\0\x01\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0 J\xA9\xD1\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\x10'\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xA0\x0F\0\x01\0\0\x01\x05\0\n\0\x1A\0\x1B\0\x01\0\0K\0\x0B\x1A\x95\xA9&\0\0\0\0@\"\x8A\tz\xC4\x86Z\xA8L;K\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80Q\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80Q\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\n\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0y\0\x01h\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\x10\xA5\xD4\xE8\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x03\0\0U\0\xD1\xEF\x06\0\0\x08\xAF/\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0o\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\x88Rjt\0\x01\0\0\0\x05\0\t\0\x10\0\x11\0\x03\0\0U\x003\xB3f\t\0\0\xC0\xBC\xF7\xE9\n\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\xE8\x03\x01\0\x01\0\0\0\x05\0\x10\0\x11\0\x12\0\x01\0\0K\0\0\0\xA02H\x88X\x9C\xA9\xF0\x04\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0tRa\x01\0\x01\0\0\0\x0F\0\x12\0\x1D\0\x1E\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x81r\x18\0\0\0JH\x01\x14\x16\x95E\x08\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0+\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\t\0\x01\0\0I\0\x05\t\x8F\xB3\xB4\0\0\0\x14\0\x15\0\x16\0\x17\0\x04\0\0\x7F\0\x02\0\0\x02\0\xFF\0\0K\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0w\x04q\x02\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0QJ\x8D\x0E\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x03\0\0U\0\xD1\xEF\x06\0\xA0\xAC\xB9\x03\0\x01\0\0\0\x0F\0\x11\0\x12\0\x13\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0X\x10\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0}\x01\xE2\x04\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\0u\x12\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x03@\x1F\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0:b}\0\x01\0\0\0\n\0\r\0\x0F\0\x10\0\x01\0\0U\0\xFE\0\0\x7F\0%\xFE\x02 N\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\xE1\xF5\x05\0\x01\0\0\0\x0F\0\x17\0\x1B\0\x1C\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\0\xA0\x06a\x8C\xF2\x05\nu\xD0W\x01\0\x01\0\0\0\x05\0\x08\0\r\0\x0E\0\x01\0\0K\0\x13\xE0b\0\xE8vH\x17\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0K\0\x01\xE8\x03\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\x10'\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xFE\0\0\x02\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0y\0\xFF\0\0\x7F\0\x01\x01\0\x01\0\0\0\x0F\0\x16\0\x1C\0\x1D\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0'\\\xBC\r\x81v\x84\0 =\x88y-\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0\x7F\0\x10\x0E\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x7F\x88\x13\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0C\0\x01\x01\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\xCBL\x9CT\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0(y\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01\x18\0\x01\0\0\0\n\0\x14\0\x15\0\x16\0\x01\0\0C\0\xFF\0\0\x7F\0\0\0\xC6\\\x14_)\x17\x86\x7F\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0I\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x18y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0K\0\x01\x01\0\x01\0\0\0\x0F\0\x12\0\x14\0\x15\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\0%\xFE\x02 N\0\x01\0\0\0\n\0\x0C\0\x0E\0\x0F\0\x01\0\0U\0\xFF\0\0\x7F\0\xCF\x01\x84\x03\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x03\0\0U\0a\t\xFE3\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x03\0\0U\0\x01@\r\x03\0\x01\0\0\0\n\0\x0E\0\x0F\0\x10\0\x01\0\0U\0\xFF\0\0\x7F\0Jx\xDE\x11\x01\0\x01\0\0\0\x05\0\x0C\0\r\0\x0E\0\x01\0\0U\0\xC0F\"\xF7{\x9C!\x01\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xE8\x03\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0\x13\0\x02\0\0U\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x01\0\0\x13\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0U\0\xD0\x11\x03}\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0\x10'\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x7F\0<\x01\0\x01\0\0\0\x05\0\x0F\0\x10\0\x11\0\x01\0\0C\0\0\0\xC6\\\x14_)\x17\x86\x7F\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x0C\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x0C\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0<\x07\x01\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0^\0\x01\x01\0\x01\0\0\0\n\0\x17\0\x1A\0\x1B\0\x01\0\0C\0\xFF\0\0K\0\0\0\0g\x1A\x8E|F.\x15\x96\x02LU}\x1B\0\x01\0\0\0\x0F\0\x14\0\x17\0\x18\0\x01\0\0K\0\xFE\0\0U\0\xFE\0\0\x7F\0+\xA3S5\x06@\r\x03\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\xFE\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x03\0\0U\0\x03@\r\x03\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\x85 \xB4\x02\0\x10^_\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x01\0\0K\0s\xDD\x0B@x}\x01\0\x01\0\0\x01\x05\0\x10\0\x14\0\x15\0\x01\0\0U\0\0\xA0\xF1\xE1;\xB0\xD7G1\x81\nc\xE0\x87\x18\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\xFF\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01d\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0q\0\x01\xE8\x03\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0q\0\x01@B\x0F\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0q\0\x01\x10'\0\x01\0\0\0\x05\0\t\0\x10\0\x11\0\x03\0\0U\0\x99\x194\x1C\0\0\x80(\xA5F\x07\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\x10\xA5\xD4\xE8\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\x08\xAF/\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x03\0\0U\0\x01\xD0\x07\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0o\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\t\0\n\0\x01\0\0U\0\x7F@~\x05\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0q\0\x01\x01\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\x85 \xB4\x02\0\xE1\xF5\x05\0\x01\0\0\0\x0F\0\x15\0\x1B\0\x1C\0\x01\0\0K\0\x01\0\0U\0\xFE\0\0\x7F\09\xA9V]\x17\x08\0 J\xA9\xD1\x01\0\x01\0\0\0\x05\0\t\0\x0E\0\x0F\0\x03\0\0U\0\x99\x194\x1C\0\x88Rjt\0\x01\0\0\0\x05\0\x08\0\x0C\0\r\0\x03\0\0U\0\xD1\xEF\x06\0\x84\xD7\x17\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x04\0\x01\0\0\x01\x05\0\t\0\r\0\x0E\0\x01\0\0y\x000y\xE7\x03c\xE0\x87\x18\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0I\0\x05\t\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0y\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0U\0\x80\xCAy\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x01*v\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0\x1D1\xC4\t\0\x01\0\0\0\x05\0\x07\0\x0B\0\x0C\0\x03\0\0U\0a\t\xC0rUO\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x02\0\0U\0\xE0.y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x07\0\x0B\0\x0C\0\x03\0\0U\0a\t\xE0\xF1\xEE\x07\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x05y\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0U\0\x04y\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x03\0\0\x7F\0\x02\0\0\x02\0\xFF\0\0K\0\xFE\0\0U\0\x01\x01\0\x01\0\0\0\n\0\x0B\0\x0C\0\r\0\x02\0\0U\0\xFE\0\0\x7F\0\x01\x01\0\x01\0\0\0\x05\0\x0B\0\x10\0\x11\0\x01\0\0K\09\xA9V]\x17\x08\0\xD0\xFD\xEE\x8D\0\x01\0\0\0\x0F\0\x1B\0\x1C\0\x1D\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\0\0\0\xF2\xED\xD4\xD4\x94\r\xA5<\x01\x01\0\x01\0\0\0\x05\0\x12\0\x13\0\x14\0\x01\0\0K\0\0\0\x006?\x15\xD0\x1C(\xD5\x17\x19\x19\x01\0\x01\0\0\0\x05\0\t\0\n\0\x0B\0\x01\0\0U\0 \x8Aw)\x01\0\x01\0\0\x01\x05\0\x0C\0\x14\0\x15\0\x02\0\0y\0\0i\xFE\r#>\x0FIf\x17\xFD0\xC2Y\x02\0\x01\0\0\0\x05\0\t\0\r\0\x0E\0\x01\0\0K\0\xA3\xE3\xEC\x12\x80\xF0\xFA\x02\0\x01\0\0\0\x05\0\x06\0\x08\0\t\0\x01\0\0U\0\x02]\x02\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\0\x99\x194\x1C\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x05\0\t\0\x0F\0\x10\0\x03\0\0U\x003\xB3f\t\0\0\xA2\x94\x1A\x1D\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\xFE\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x0F\0\x13\0\x14\0\x15\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xD0\x80I\x06\x01\0\x01\0\0\0\x05\0\x07\0\n\0\x0B\0\x03\0\0U\0a\t\xEC\x07\x02\0\x01\0\0\0\x05\0\t\0\x0B\0\x0C\0\x01\0\0K\0\x85 \xB4\x02P\xC3\0\x01\0\0\0\x05\0\x07\0\x08\0\t\0\x01\0\0K\0\xE8\x03\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x0F\0\x10\0\x11\0\x12\0\x01\0\0K\0\x02\0\0U\0\xFD\0\0\x7F\0\x01\x01\0\x01\0\0\0\x14\0\x15\0\x16\0\x17\0\x01\0\0K\0\x02\0\0U\0\xFE\0\0\x7F\0\xFF\0\0\x02\0\x01\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80:\t\x01\0\x01\0\0\0\x05\0\x08\0\t\0\n\0\x01\0\0\x7F\0\x80:\t\x01\0\x01\0\0\0\x05\0\x07\0\t\0\n\0\x01\0\0U\0w\x04\xE2\x04\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x01\0\x01\0\0\0\x05\0\x06\0\x07\0\x08\0\x01\0\0\x99\0\x01\x01\0\x01") } }; } #[clippy::msrv = "1.81"] impl icu_provider::DataProvider for $provider { diff --git a/provider/source/data/debug/experimental/UnitsInfoV1.json b/provider/source/data/debug/experimental/UnitsInfoV1.json index f11f9a4aa27..a3b7a282259 100644 --- a/provider/source/data/debug/experimental/UnitsInfoV1.json +++ b/provider/source/data/debug/experimental/UnitsInfoV1.json @@ -1,162 +1,5 @@ { - "units_conversion_trie": { - "100-kilometer": 0, - "acre": 1, - "ampere": 2, - "arc-minute": 3, - "arc-second": 4, - "astronomical-unit": 5, - "atmosphere": 6, - "bar": 7, - "barrel": 8, - "beaufort": 9, - "becquerel": 10, - "bit": 11, - "british-thermal-unit": 12, - "british-thermal-unit-it": 13, - "bu-jp": 14, - "bushel": 15, - "byte": 16, - "calorie": 17, - "calorie-it": 18, - "candela": 19, - "carat": 20, - "celsius": 21, - "century": 22, - "chain": 23, - "cho": 24, - "coulomb": 25, - "cup": 26, - "cup-jp": 27, - "cup-metric": 28, - "dalton": 29, - "day": 30, - "day-person": 31, - "decade": 32, - "degree": 33, - "dessert-spoon": 34, - "dessert-spoon-imperial": 35, - "dot": 36, - "dram": 37, - "drop": 38, - "dunam": 39, - "earth-mass": 40, - "earth-radius": 41, - "electronvolt": 42, - "em": 43, - "fahrenheit": 44, - "farad": 45, - "fathom": 46, - "fluid-ounce": 47, - "fluid-ounce-imperial": 48, - "foodcalorie": 49, - "foot": 50, - "fortnight": 51, - "fun": 52, - "furlong": 53, - "g-force": 54, - "gallon": 55, - "gallon-imperial": 56, - "gasoline-energy-density": 57, - "grain": 58, - "gram": 59, - "gray": 60, - "hectare": 61, - "henry": 62, - "hertz": 63, - "horsepower": 64, - "hour": 65, - "inch": 66, - "item": 67, - "jigger": 68, - "jo-jp": 69, - "joule": 70, - "karat": 71, - "katal": 72, - "kelvin": 73, - "ken": 74, - "kilogram": 75, - "kilogram-force": 76, - "knot": 77, - "koku": 78, - "kosaji": 79, - "light-speed": 80, - "light-year": 81, - "liter": 82, - "lumen": 83, - "lux": 84, - "meter": 85, - "mile": 86, - "mile-scandinavian": 87, - "minute": 88, - "mole": 89, - "month": 90, - "month-person": 91, - "nautical-mile": 92, - "newton": 93, - "night": 94, - "ofglucose": 95, - "ofhg": 96, - "ohm": 97, - "osaji": 98, - "ounce": 99, - "ounce-troy": 100, - "parsec": 101, - "pascal": 102, - "percent": 103, - "permille": 104, - "permillion": 105, - "permyriad": 106, - "pinch": 107, - "pint": 108, - "pint-imperial": 109, - "pint-metric": 110, - "pixel": 111, - "point": 112, - "portion": 113, - "pound": 114, - "pound-force": 115, - "quart": 116, - "quart-imperial": 117, - "quarter": 118, - "radian": 119, - "rankine": 120, - "revolution": 121, - "ri-jp": 122, - "rin": 123, - "rod": 124, - "sai": 125, - "se-jp": 126, - "second": 127, - "shaku": 128, - "shaku-cloth": 129, - "shaku-length": 130, - "siemens": 131, - "sievert": 132, - "slug": 133, - "solar-luminosity": 134, - "solar-mass": 135, - "solar-radius": 136, - "steradian": 137, - "stone": 138, - "sun": 139, - "tablespoon": 140, - "teaspoon": 141, - "tesla": 142, - "therm-us": 143, - "to-jp": 144, - "ton": 145, - "tonne": 146, - "volt": 147, - "watt": 148, - "weber": 149, - "week": 150, - "week-person": 151, - "yard": 152, - "year": 153, - "year-person": 154 - }, - "convert_infos": [ + "conversion_info": [ { "basic_units": [ { diff --git a/provider/source/src/units/info.rs b/provider/source/src/units/info.rs index 6f20061582e..f72c6e88f60 100644 --- a/provider/source/src/units/info.rs +++ b/provider/source/src/units/info.rs @@ -9,7 +9,6 @@ use crate::{cldr_serde, units::helpers::ScientificNumber}; use icu::experimental::measure::parser::MeasureUnitParser; use icu::experimental::units::provider::{ConversionInfo, UnitsInfo, UnitsInfoV1}; use icu_provider::prelude::*; -use zerotrie::ZeroTrieSimpleAscii; use zerovec::VarZeroVec; use super::helpers::{extract_conversion_info, process_constants, process_factor}; @@ -60,15 +59,10 @@ impl DataProvider for SourceDataProvider { conversion_info_map.insert(unit_name.as_bytes().to_vec(), convert_unit_index); } - let units_conversion_trie = - ZeroTrieSimpleAscii::try_from(&conversion_info_map).map_err(|e| { - DataError::custom("Could not create ZeroTrie from units.json data") - .with_display_context(&e) - })?; + // TODO: now we need to create `MeasureUnitParser` in order to create the conversion info. how to do that ? + let parser = MeasureUnitParser::new(); - let parser = MeasureUnitParser::from_payload(units_conversion_trie.as_borrowed()); - - let convert_infos = convert_units_vec + let conversion_info = convert_units_vec .iter() .map(|convert_unit| { extract_conversion_info( @@ -81,8 +75,7 @@ impl DataProvider for SourceDataProvider { .collect::, DataError>>()?; let result = UnitsInfo { - units_conversion_trie: units_conversion_trie.convert_store(), - convert_infos: VarZeroVec::from(&convert_infos), + conversion_info: VarZeroVec::from(&conversion_info), }; Ok(DataResponse { @@ -102,6 +95,7 @@ impl crate::IterableDataProviderCached for SourceDataProvider { fn test_basic() { use icu::experimental::measure::provider::si_prefix::{Base, SiPrefix}; use icu::experimental::measure::provider::single_unit::SingleUnit; + use icu::experimental::measure::provider::trie::UnitsTrieV1; use icu::experimental::units::provider::*; use icu::locale::langid; use icu_provider::prelude::*; @@ -120,15 +114,22 @@ fn test_basic() { }) .unwrap(); + let und_trie: DataResponse = provider + .load(DataRequest { + id: DataIdentifierCow::from_locale(langid!("und").into()).as_borrowed(), + ..Default::default() + }) + .unwrap(); + let units_info = und.payload.get().to_owned(); - let units_info_map = &units_info.units_conversion_trie; - let convert_units = &units_info.convert_infos; + let units_info_map = &und_trie.payload.get().trie; + let conversion_info = &units_info.conversion_info; let meter_index = units_info_map.get("meter").unwrap(); let big_one = BigUint::from(1u32); - let meter_convert_ule = convert_units.zvl_get(meter_index).unwrap(); + let meter_convert_ule = conversion_info.zvl_get(meter_index).unwrap(); let meter_convert: ConversionInfo = ZeroFrom::zero_from(meter_convert_ule); assert_eq!(meter_convert.factor_sign, Sign::Positive); @@ -170,7 +171,7 @@ fn test_basic() { ); let foot_convert_index = units_info_map.get("foot").unwrap(); - let foot_convert_ule = convert_units.zvl_get(foot_convert_index).unwrap(); + let foot_convert_ule = conversion_info.zvl_get(foot_convert_index).unwrap(); let foot_convert: ConversionInfo = ZeroFrom::zero_from(foot_convert_ule); let ft_to_m = Ratio::new(BigUint::from(3048u32), BigUint::from(10000u32)); diff --git a/provider/source/src/units/trie.rs b/provider/source/src/units/trie.rs index 24ab8ea0962..443cf3e03d4 100644 --- a/provider/source/src/units/trie.rs +++ b/provider/source/src/units/trie.rs @@ -86,13 +86,13 @@ fn test_basic() { let units_info = und_info.payload.get().to_owned(); let meter_id = trie.get("meter").unwrap(); let foot_id = trie.get("foot").unwrap(); - let convert_infos = &units_info.convert_infos[meter_id]; + let convert_infos = &units_info.conversion_info[meter_id]; let basic_units = &convert_infos.basic_units(); // Meter should have the same id as the one in the info because it is the `root` unit for length. assert_eq!(basic_units.first().unwrap().unit_id, meter_id as u16); - let convert_infos = &units_info.convert_infos[foot_id]; + let convert_infos = &units_info.conversion_info[foot_id]; let basic_units = &convert_infos.basic_units(); // Foot should have the same id as meter because meter is the root unit for length. assert_eq!(basic_units.first().unwrap().unit_id, meter_id as u16); From 9e0402a6d424287bb1148ce1af7771e53358ca0d Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Mon, 24 Mar 2025 09:38:05 +0100 Subject: [PATCH 02/16] Fix datagen --- components/experimental/src/measure/parser.rs | 8 +++++++- provider/source/src/units/info.rs | 20 +++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index 8cf7579ef03..f772e5b7c3a 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -27,7 +27,7 @@ impl MeasureUnitParser { () -> error: DataError, functions: [ new: skip, - try_new_with_buffer_provider, + try_new_with_buffer_provider, try_new_unstable, Self, ] @@ -55,6 +55,12 @@ impl MeasureUnitParser { Ok(Self { payload }) } + // TODO: remove this function after being able to use the `try_new_with_buffer_provider` constructor in `provider/source/src/units/info.rs`. + /// Creates a new [`MeasureUnitParser`] from a [`DataPayload`]. + pub fn from_payload(payload: DataPayload) -> Self { + Self { payload } + } + /// Get the unit id. /// NOTE: /// if the unit id is found, the function will return (unit id, part without the unit id and without `-` at the beginning of the remaining part if it exists). diff --git a/provider/source/src/units/info.rs b/provider/source/src/units/info.rs index f72c6e88f60..b23ae8b05c0 100644 --- a/provider/source/src/units/info.rs +++ b/provider/source/src/units/info.rs @@ -9,7 +9,9 @@ use crate::{cldr_serde, units::helpers::ScientificNumber}; use icu::experimental::measure::parser::MeasureUnitParser; use icu::experimental::units::provider::{ConversionInfo, UnitsInfo, UnitsInfoV1}; use icu_provider::prelude::*; +use zerotrie::ZeroTrieSimpleAscii; use zerovec::VarZeroVec; +use icu::experimental::measure::provider::trie::UnitsTrie; use super::helpers::{extract_conversion_info, process_constants, process_factor}; @@ -59,9 +61,23 @@ impl DataProvider for SourceDataProvider { conversion_info_map.insert(unit_name.as_bytes().to_vec(), convert_unit_index); } - // TODO: now we need to create `MeasureUnitParser` in order to create the conversion info. how to do that ? - let parser = MeasureUnitParser::new(); + // TODO: remove this once we can use the `try_new_with_buffer_provider` constructor in `components/experimental/src/measure/parser.rs`. + // OR just using `MeasureUnitParser::new()` + let units_conversion_trie = + ZeroTrieSimpleAscii::try_from(&conversion_info_map).map_err(|e| { + DataError::custom("Could not create ZeroTrie from units.json data") + .with_display_context(&e) + })?; + + // Convert the trie to use ZeroVec and wrap it in UnitsTrie + let units_trie = UnitsTrie { + trie: units_conversion_trie.convert_store(), + }; + let parser = MeasureUnitParser::from_payload(DataPayload::from_owned( + units_trie, + )); + let conversion_info = convert_units_vec .iter() .map(|convert_unit| { From 519b366bd87d96fc03dee305c70b1aae7b51ef75 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Mon, 24 Mar 2025 09:45:49 +0100 Subject: [PATCH 03/16] fix datagen --- provider/source/src/units/info.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/provider/source/src/units/info.rs b/provider/source/src/units/info.rs index b23ae8b05c0..43c1c40d4e0 100644 --- a/provider/source/src/units/info.rs +++ b/provider/source/src/units/info.rs @@ -7,11 +7,11 @@ use std::collections::{BTreeMap, HashSet}; use crate::SourceDataProvider; use crate::{cldr_serde, units::helpers::ScientificNumber}; use icu::experimental::measure::parser::MeasureUnitParser; +use icu::experimental::measure::provider::trie::UnitsTrie; use icu::experimental::units::provider::{ConversionInfo, UnitsInfo, UnitsInfoV1}; use icu_provider::prelude::*; use zerotrie::ZeroTrieSimpleAscii; use zerovec::VarZeroVec; -use icu::experimental::measure::provider::trie::UnitsTrie; use super::helpers::{extract_conversion_info, process_constants, process_factor}; @@ -74,10 +74,8 @@ impl DataProvider for SourceDataProvider { trie: units_conversion_trie.convert_store(), }; - let parser = MeasureUnitParser::from_payload(DataPayload::from_owned( - units_trie, - )); - + let parser = MeasureUnitParser::from_payload(DataPayload::from_owned(units_trie)); + let conversion_info = convert_units_vec .iter() .map(|convert_unit| { From 405e29a6e14dbf4521f1c010b21672520c1f7b48 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Mon, 24 Mar 2025 09:55:48 +0100 Subject: [PATCH 04/16] fix ffi --- ffi/capi/bindings/c/MeasureUnitParser.h | 7 +++ ffi/capi/bindings/c/UnitsConverterFactory.h | 3 - ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp | 2 +- .../cpp/icu4x/MeasureUnitParser.d.hpp | 23 +++++-- .../bindings/cpp/icu4x/MeasureUnitParser.hpp | 17 ++++++ .../cpp/icu4x/UnitsConverterFactory.d.hpp | 9 --- .../cpp/icu4x/UnitsConverterFactory.hpp | 8 --- ffi/capi/bindings/dart/MeasureUnit.g.dart | 2 +- .../bindings/dart/MeasureUnitParser.g.dart | 39 +++++++++--- .../dart/UnitsConverterFactory.g.dart | 15 ----- ffi/capi/bindings/js/MeasureUnit.d.ts | 2 +- ffi/capi/bindings/js/MeasureUnit.mjs | 2 +- ffi/capi/bindings/js/MeasureUnitParser.d.ts | 15 +++-- ffi/capi/bindings/js/MeasureUnitParser.mjs | 60 +++++++++++++++---- .../bindings/js/UnitsConverterFactory.d.ts | 8 --- .../bindings/js/UnitsConverterFactory.mjs | 19 ------ ffi/capi/bindings/js/index.d.ts | 8 +-- ffi/capi/bindings/js/index.mjs | 8 +-- ffi/capi/src/measure_unit_parser.rs | 15 ++--- ffi/capi/src/units_converter.rs | 10 +--- 20 files changed, 156 insertions(+), 116 deletions(-) diff --git a/ffi/capi/bindings/c/MeasureUnitParser.h b/ffi/capi/bindings/c/MeasureUnitParser.h index 29e0d5d6c45..1bf5dc23302 100644 --- a/ffi/capi/bindings/c/MeasureUnitParser.h +++ b/ffi/capi/bindings/c/MeasureUnitParser.h @@ -7,6 +7,8 @@ #include #include "diplomat_runtime.h" +#include "DataError.d.h" +#include "DataProvider.d.h" #include "MeasureUnit.d.h" #include "MeasureUnitParser.d.h" @@ -16,6 +18,11 @@ +MeasureUnitParser* icu4x_MeasureUnitParser_create_mv1(void); + +typedef struct icu4x_MeasureUnitParser_create_with_provider_mv1_result {union {MeasureUnitParser* ok; DataError err;}; bool is_ok;} icu4x_MeasureUnitParser_create_with_provider_mv1_result; +icu4x_MeasureUnitParser_create_with_provider_mv1_result icu4x_MeasureUnitParser_create_with_provider_mv1(const DataProvider* provider); + MeasureUnit* icu4x_MeasureUnitParser_parse_mv1(const MeasureUnitParser* self, DiplomatStringView unit_id); diff --git a/ffi/capi/bindings/c/UnitsConverterFactory.h b/ffi/capi/bindings/c/UnitsConverterFactory.h index b2d6aeb536e..9a3c0daaad9 100644 --- a/ffi/capi/bindings/c/UnitsConverterFactory.h +++ b/ffi/capi/bindings/c/UnitsConverterFactory.h @@ -10,7 +10,6 @@ #include "DataError.d.h" #include "DataProvider.d.h" #include "MeasureUnit.d.h" -#include "MeasureUnitParser.d.h" #include "UnitsConverter.d.h" #include "UnitsConverterFactory.d.h" @@ -27,8 +26,6 @@ icu4x_UnitsConverterFactory_create_with_provider_mv1_result icu4x_UnitsConverter UnitsConverter* icu4x_UnitsConverterFactory_converter_mv1(const UnitsConverterFactory* self, const MeasureUnit* from, const MeasureUnit* to); -MeasureUnitParser* icu4x_UnitsConverterFactory_parser_mv1(const UnitsConverterFactory* self); - void icu4x_UnitsConverterFactory_destroy_mv1(UnitsConverterFactory* self); diff --git a/ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp b/ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp index 46b761080f0..d38c8fc6fcd 100644 --- a/ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp +++ b/ffi/capi/bindings/cpp/icu4x/MeasureUnit.d.hpp @@ -22,7 +22,7 @@ namespace icu4x { * An ICU4X Measurement Unit object which represents a single unit of measurement * such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. * - * You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse_measure_unit` method. + * You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. * * See the [Rust documentation for `MeasureUnit`](https://docs.rs/icu/latest/icu/experimental/measure/measureunit/struct.MeasureUnit.html) for more information. */ diff --git a/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.d.hpp b/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.d.hpp index 02050b6c2b6..8a59ca9df7f 100644 --- a/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.d.hpp +++ b/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.d.hpp @@ -11,8 +11,13 @@ #include "../diplomat_runtime.hpp" namespace icu4x { +namespace capi { struct DataProvider; } +class DataProvider; namespace capi { struct MeasureUnit; } class MeasureUnit; +namespace capi { struct MeasureUnitParser; } +class MeasureUnitParser; +class DataError; } @@ -24,8 +29,7 @@ namespace capi { namespace icu4x { /** - * An ICU4X Measurement Unit parser object which is capable of parsing the CLDR unit identifier - * (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. + * An ICU4X Measure Unit Parser object, capable of parsing the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. * * See the [Rust documentation for `MeasureUnitParser`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html) for more information. */ @@ -33,9 +37,20 @@ class MeasureUnitParser { public: /** - * Parses the CLDR unit identifier (e.g. `meter-per-square-second`) and returns the corresponding [`MeasureUnit`], - * if the identifier is valid. + * Construct a new [`MeasureUnitParser`] instance using compiled data. * + * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.new) for more information. + */ + inline static std::unique_ptr create(); + + /** + * Construct a new [`MeasureUnitParser`] instance using a particular data source. + * + * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.new) for more information. + */ + inline static diplomat::result, icu4x::DataError> create_with_provider(const icu4x::DataProvider& provider); + + /** * See the [Rust documentation for `parse`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.parse) for more information. */ inline std::unique_ptr parse(std::string_view unit_id) const; diff --git a/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.hpp b/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.hpp index 3d96216f991..75bf2a94825 100644 --- a/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.hpp +++ b/ffi/capi/bindings/cpp/icu4x/MeasureUnitParser.hpp @@ -11,6 +11,8 @@ #include #include #include "../diplomat_runtime.hpp" +#include "DataError.hpp" +#include "DataProvider.hpp" #include "MeasureUnit.hpp" @@ -18,6 +20,11 @@ namespace icu4x { namespace capi { extern "C" { + icu4x::capi::MeasureUnitParser* icu4x_MeasureUnitParser_create_mv1(void); + + typedef struct icu4x_MeasureUnitParser_create_with_provider_mv1_result {union {icu4x::capi::MeasureUnitParser* ok; icu4x::capi::DataError err;}; bool is_ok;} icu4x_MeasureUnitParser_create_with_provider_mv1_result; + icu4x_MeasureUnitParser_create_with_provider_mv1_result icu4x_MeasureUnitParser_create_with_provider_mv1(const icu4x::capi::DataProvider* provider); + icu4x::capi::MeasureUnit* icu4x_MeasureUnitParser_parse_mv1(const icu4x::capi::MeasureUnitParser* self, diplomat::capi::DiplomatStringView unit_id); @@ -27,6 +34,16 @@ namespace capi { } // namespace capi } // namespace +inline std::unique_ptr icu4x::MeasureUnitParser::create() { + auto result = icu4x::capi::icu4x_MeasureUnitParser_create_mv1(); + return std::unique_ptr(icu4x::MeasureUnitParser::FromFFI(result)); +} + +inline diplomat::result, icu4x::DataError> icu4x::MeasureUnitParser::create_with_provider(const icu4x::DataProvider& provider) { + auto result = icu4x::capi::icu4x_MeasureUnitParser_create_with_provider_mv1(provider.AsFFI()); + return result.is_ok ? diplomat::result, icu4x::DataError>(diplomat::Ok>(std::unique_ptr(icu4x::MeasureUnitParser::FromFFI(result.ok)))) : diplomat::result, icu4x::DataError>(diplomat::Err(icu4x::DataError::FromFFI(result.err))); +} + inline std::unique_ptr icu4x::MeasureUnitParser::parse(std::string_view unit_id) const { auto result = icu4x::capi::icu4x_MeasureUnitParser_parse_mv1(this->AsFFI(), {unit_id.data(), unit_id.size()}); diff --git a/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.d.hpp b/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.d.hpp index 3332c0788f3..2ef3ba8c451 100644 --- a/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.d.hpp +++ b/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.d.hpp @@ -15,8 +15,6 @@ namespace capi { struct DataProvider; } class DataProvider; namespace capi { struct MeasureUnit; } class MeasureUnit; -namespace capi { struct MeasureUnitParser; } -class MeasureUnitParser; namespace capi { struct UnitsConverter; } class UnitsConverter; namespace capi { struct UnitsConverterFactory; } @@ -66,13 +64,6 @@ class UnitsConverterFactory { */ inline std::unique_ptr converter(const icu4x::MeasureUnit& from, const icu4x::MeasureUnit& to) const; - /** - * Creates a parser to parse the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. - * - * See the [Rust documentation for `parser`](https://docs.rs/icu/latest/icu/experimental/units/converter_factory/struct.ConverterFactory.html#method.parser) for more information. - */ - inline std::unique_ptr parser() const; - inline const icu4x::capi::UnitsConverterFactory* AsFFI() const; inline icu4x::capi::UnitsConverterFactory* AsFFI(); inline static const icu4x::UnitsConverterFactory* FromFFI(const icu4x::capi::UnitsConverterFactory* ptr); diff --git a/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.hpp b/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.hpp index e08e352a19c..4282a4287fe 100644 --- a/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.hpp +++ b/ffi/capi/bindings/cpp/icu4x/UnitsConverterFactory.hpp @@ -14,7 +14,6 @@ #include "DataError.hpp" #include "DataProvider.hpp" #include "MeasureUnit.hpp" -#include "MeasureUnitParser.hpp" #include "UnitsConverter.hpp" @@ -29,8 +28,6 @@ namespace capi { icu4x::capi::UnitsConverter* icu4x_UnitsConverterFactory_converter_mv1(const icu4x::capi::UnitsConverterFactory* self, const icu4x::capi::MeasureUnit* from, const icu4x::capi::MeasureUnit* to); - icu4x::capi::MeasureUnitParser* icu4x_UnitsConverterFactory_parser_mv1(const icu4x::capi::UnitsConverterFactory* self); - void icu4x_UnitsConverterFactory_destroy_mv1(UnitsConverterFactory* self); @@ -55,11 +52,6 @@ inline std::unique_ptr icu4x::UnitsConverterFactory::conv return std::unique_ptr(icu4x::UnitsConverter::FromFFI(result)); } -inline std::unique_ptr icu4x::UnitsConverterFactory::parser() const { - auto result = icu4x::capi::icu4x_UnitsConverterFactory_parser_mv1(this->AsFFI()); - return std::unique_ptr(icu4x::MeasureUnitParser::FromFFI(result)); -} - inline const icu4x::capi::UnitsConverterFactory* icu4x::UnitsConverterFactory::AsFFI() const { return reinterpret_cast(this); } diff --git a/ffi/capi/bindings/dart/MeasureUnit.g.dart b/ffi/capi/bindings/dart/MeasureUnit.g.dart index 042856ab1dc..5bb803b832e 100644 --- a/ffi/capi/bindings/dart/MeasureUnit.g.dart +++ b/ffi/capi/bindings/dart/MeasureUnit.g.dart @@ -6,7 +6,7 @@ part of 'lib.g.dart'; /// An ICU4X Measurement Unit object which represents a single unit of measurement /// such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. /// -/// You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse_measure_unit` method. +/// You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. /// /// See the [Rust documentation for `MeasureUnit`](https://docs.rs/icu/latest/icu/experimental/measure/measureunit/struct.MeasureUnit.html) for more information. final class MeasureUnit implements ffi.Finalizable { diff --git a/ffi/capi/bindings/dart/MeasureUnitParser.g.dart b/ffi/capi/bindings/dart/MeasureUnitParser.g.dart index e5874f43f57..a15802bce0b 100644 --- a/ffi/capi/bindings/dart/MeasureUnitParser.g.dart +++ b/ffi/capi/bindings/dart/MeasureUnitParser.g.dart @@ -3,8 +3,7 @@ part of 'lib.g.dart'; -/// An ICU4X Measurement Unit parser object which is capable of parsing the CLDR unit identifier -/// (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. +/// An ICU4X Measure Unit Parser object, capable of parsing the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. /// /// See the [Rust documentation for `MeasureUnitParser`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html) for more information. final class MeasureUnitParser implements ffi.Finalizable { @@ -13,14 +12,12 @@ final class MeasureUnitParser implements ffi.Finalizable { // These are "used" in the sense that they keep dependencies alive // ignore: unused_field final core.List _selfEdge; - // ignore: unused_field - final core.List _aEdge; // This takes in a list of lifetime edges (including for &self borrows) // corresponding to data this may borrow from. These should be flat arrays containing // references to objects, and this object will hold on to them to keep them alive and // maintain borrow validity. - MeasureUnitParser._fromFfi(this._ffi, this._selfEdge, this._aEdge) { + MeasureUnitParser._fromFfi(this._ffi, this._selfEdge) { if (_selfEdge.isEmpty) { _finalizer.attach(this, _ffi.cast()); } @@ -28,9 +25,27 @@ final class MeasureUnitParser implements ffi.Finalizable { static final _finalizer = ffi.NativeFinalizer(ffi.Native.addressOf(_icu4x_MeasureUnitParser_destroy_mv1)); - /// Parses the CLDR unit identifier (e.g. `meter-per-square-second`) and returns the corresponding [`MeasureUnit`], - /// if the identifier is valid. + /// Construct a new [`MeasureUnitParser`] instance using compiled data. + /// + /// See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.new) for more information. + factory MeasureUnitParser() { + final result = _icu4x_MeasureUnitParser_create_mv1(); + return MeasureUnitParser._fromFfi(result, []); + } + + /// Construct a new [`MeasureUnitParser`] instance using a particular data source. + /// + /// See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.new) for more information. /// + /// Throws [DataError] on failure. + factory MeasureUnitParser.withProvider(DataProvider provider) { + final result = _icu4x_MeasureUnitParser_create_with_provider_mv1(provider._ffi); + if (!result.isOk) { + throw DataError.values[result.union.err]; + } + return MeasureUnitParser._fromFfi(result.union.ok, []); + } + /// See the [Rust documentation for `parse`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.parse) for more information. MeasureUnit? parse(String unitId) { final temp = _FinalizedArena(); @@ -44,6 +59,16 @@ final class MeasureUnitParser implements ffi.Finalizable { // ignore: non_constant_identifier_names external void _icu4x_MeasureUnitParser_destroy_mv1(ffi.Pointer self); +@_DiplomatFfiUse('icu4x_MeasureUnitParser_create_mv1') +@ffi.Native Function()>(isLeaf: true, symbol: 'icu4x_MeasureUnitParser_create_mv1') +// ignore: non_constant_identifier_names +external ffi.Pointer _icu4x_MeasureUnitParser_create_mv1(); + +@_DiplomatFfiUse('icu4x_MeasureUnitParser_create_with_provider_mv1') +@ffi.Native<_ResultOpaqueInt32 Function(ffi.Pointer)>(isLeaf: true, symbol: 'icu4x_MeasureUnitParser_create_with_provider_mv1') +// ignore: non_constant_identifier_names +external _ResultOpaqueInt32 _icu4x_MeasureUnitParser_create_with_provider_mv1(ffi.Pointer provider); + @_DiplomatFfiUse('icu4x_MeasureUnitParser_parse_mv1') @ffi.Native Function(ffi.Pointer, _SliceUtf8)>(isLeaf: true, symbol: 'icu4x_MeasureUnitParser_parse_mv1') // ignore: non_constant_identifier_names diff --git a/ffi/capi/bindings/dart/UnitsConverterFactory.g.dart b/ffi/capi/bindings/dart/UnitsConverterFactory.g.dart index cee8ee4b031..f878c7fecc0 100644 --- a/ffi/capi/bindings/dart/UnitsConverterFactory.g.dart +++ b/ffi/capi/bindings/dart/UnitsConverterFactory.g.dart @@ -58,16 +58,6 @@ final class UnitsConverterFactory implements ffi.Finalizable { final result = _icu4x_UnitsConverterFactory_converter_mv1(_ffi, from._ffi, to._ffi); return result.address == 0 ? null : UnitsConverter._fromFfi(result, []); } - - /// Creates a parser to parse the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. - /// - /// See the [Rust documentation for `parser`](https://docs.rs/icu/latest/icu/experimental/units/converter_factory/struct.ConverterFactory.html#method.parser) for more information. - MeasureUnitParser parser() { - // This lifetime edge depends on lifetimes: 'a - core.List aEdges = [this]; - final result = _icu4x_UnitsConverterFactory_parser_mv1(_ffi); - return MeasureUnitParser._fromFfi(result, [], aEdges); - } } @_DiplomatFfiUse('icu4x_UnitsConverterFactory_destroy_mv1') @@ -90,9 +80,4 @@ external _ResultOpaqueInt32 _icu4x_UnitsConverterFactory_create_with_provider_mv // ignore: non_constant_identifier_names external ffi.Pointer _icu4x_UnitsConverterFactory_converter_mv1(ffi.Pointer self, ffi.Pointer from, ffi.Pointer to); -@_DiplomatFfiUse('icu4x_UnitsConverterFactory_parser_mv1') -@ffi.Native Function(ffi.Pointer)>(isLeaf: true, symbol: 'icu4x_UnitsConverterFactory_parser_mv1') -// ignore: non_constant_identifier_names -external ffi.Pointer _icu4x_UnitsConverterFactory_parser_mv1(ffi.Pointer self); - // dart format on diff --git a/ffi/capi/bindings/js/MeasureUnit.d.ts b/ffi/capi/bindings/js/MeasureUnit.d.ts index 80367cf48b1..b1c0adedac8 100644 --- a/ffi/capi/bindings/js/MeasureUnit.d.ts +++ b/ffi/capi/bindings/js/MeasureUnit.d.ts @@ -6,7 +6,7 @@ import type { pointer, codepoint } from "./diplomat-runtime.d.ts"; * An ICU4X Measurement Unit object which represents a single unit of measurement * such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. * - * You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse_measure_unit` method. + * You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. * * See the [Rust documentation for `MeasureUnit`](https://docs.rs/icu/latest/icu/experimental/measure/measureunit/struct.MeasureUnit.html) for more information. */ diff --git a/ffi/capi/bindings/js/MeasureUnit.mjs b/ffi/capi/bindings/js/MeasureUnit.mjs index aa53e7f5304..471bf6fee10 100644 --- a/ffi/capi/bindings/js/MeasureUnit.mjs +++ b/ffi/capi/bindings/js/MeasureUnit.mjs @@ -7,7 +7,7 @@ import * as diplomatRuntime from "./diplomat-runtime.mjs"; * An ICU4X Measurement Unit object which represents a single unit of measurement * such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. * - * You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse_measure_unit` method. + * You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. * * See the [Rust documentation for `MeasureUnit`](https://docs.rs/icu/latest/icu/experimental/measure/measureunit/struct.MeasureUnit.html) for more information. */ diff --git a/ffi/capi/bindings/js/MeasureUnitParser.d.ts b/ffi/capi/bindings/js/MeasureUnitParser.d.ts index 203a0d0e6d6..16cf4078945 100644 --- a/ffi/capi/bindings/js/MeasureUnitParser.d.ts +++ b/ffi/capi/bindings/js/MeasureUnitParser.d.ts @@ -1,11 +1,12 @@ // generated by diplomat-tool +import type { DataError } from "./DataError" +import type { DataProvider } from "./DataProvider" import type { MeasureUnit } from "./MeasureUnit" import type { pointer, codepoint } from "./diplomat-runtime.d.ts"; /** - * An ICU4X Measurement Unit parser object which is capable of parsing the CLDR unit identifier - * (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. + * An ICU4X Measure Unit Parser object, capable of parsing the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. * * See the [Rust documentation for `MeasureUnitParser`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html) for more information. */ @@ -16,10 +17,16 @@ export class MeasureUnitParser { get ffiValue(): pointer; /** - * Parses the CLDR unit identifier (e.g. `meter-per-square-second`) and returns the corresponding [`MeasureUnit`], - * if the identifier is valid. + * Construct a new [`MeasureUnitParser`] instance using a particular data source. * + * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.new) for more information. + */ + static createWithProvider(provider: DataProvider): MeasureUnitParser; + + /** * See the [Rust documentation for `parse`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.parse) for more information. */ parse(unitId: string): MeasureUnit | null; + + constructor(); } \ No newline at end of file diff --git a/ffi/capi/bindings/js/MeasureUnitParser.mjs b/ffi/capi/bindings/js/MeasureUnitParser.mjs index dba5ce7de08..ea16e8f08f3 100644 --- a/ffi/capi/bindings/js/MeasureUnitParser.mjs +++ b/ffi/capi/bindings/js/MeasureUnitParser.mjs @@ -1,12 +1,13 @@ // generated by diplomat-tool +import { DataError } from "./DataError.mjs" +import { DataProvider } from "./DataProvider.mjs" import { MeasureUnit } from "./MeasureUnit.mjs" import wasm from "./diplomat-wasm.mjs"; import * as diplomatRuntime from "./diplomat-runtime.mjs"; /** - * An ICU4X Measurement Unit parser object which is capable of parsing the CLDR unit identifier - * (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. + * An ICU4X Measure Unit Parser object, capable of parsing the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. * * See the [Rust documentation for `MeasureUnitParser`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html) for more information. */ @@ -22,17 +23,13 @@ export class MeasureUnitParser { // Lifetimes are only to keep dependencies alive. // Since JS won't garbage collect until there are no incoming edges. #selfEdge = []; - #aEdge = []; - #internalConstructor(symbol, ptr, selfEdge, aEdge) { + #internalConstructor(symbol, ptr, selfEdge) { if (symbol !== diplomatRuntime.internalConstructor) { console.error("MeasureUnitParser is an Opaque type. You cannot call its constructor."); return; } - - this.#aEdge = aEdge; - this.#ptr = ptr; this.#selfEdge = selfEdge; @@ -48,9 +45,44 @@ export class MeasureUnitParser { } /** - * Parses the CLDR unit identifier (e.g. `meter-per-square-second`) and returns the corresponding [`MeasureUnit`], - * if the identifier is valid. + * Construct a new [`MeasureUnitParser`] instance using compiled data. + * + * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.new) for more information. + */ + #defaultConstructor() { + const result = wasm.icu4x_MeasureUnitParser_create_mv1(); + + try { + return new MeasureUnitParser(diplomatRuntime.internalConstructor, result, []); + } + + finally {} + } + + /** + * Construct a new [`MeasureUnitParser`] instance using a particular data source. * + * See the [Rust documentation for `new`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.new) for more information. + */ + static createWithProvider(provider) { + const diplomatReceive = new diplomatRuntime.DiplomatReceiveBuf(wasm, 5, 4, true); + + const result = wasm.icu4x_MeasureUnitParser_create_with_provider_mv1(diplomatReceive.buffer, provider.ffiValue); + + try { + if (!diplomatReceive.resultFlag) { + const cause = new DataError(diplomatRuntime.internalConstructor, diplomatRuntime.enumDiscriminant(wasm, diplomatReceive.buffer)); + throw new globalThis.Error('DataError: ' + cause.value, { cause }); + } + return new MeasureUnitParser(diplomatRuntime.internalConstructor, diplomatRuntime.ptrRead(wasm, diplomatReceive.buffer), []); + } + + finally { + diplomatReceive.free(); + } + } + + /** * See the [Rust documentation for `parse`](https://docs.rs/icu/latest/icu/experimental/measure/parser/struct.MeasureUnitParser.html#method.parse) for more information. */ parse(unitId) { @@ -69,7 +101,13 @@ export class MeasureUnitParser { } } - constructor(symbol, ptr, selfEdge, aEdge) { - return this.#internalConstructor(...arguments) + constructor() { + if (arguments[0] === diplomatRuntime.exposeConstructor) { + return this.#internalConstructor(...Array.prototype.slice.call(arguments, 1)); + } else if (arguments[0] === diplomatRuntime.internalConstructor) { + return this.#internalConstructor(...arguments); + } else { + return this.#defaultConstructor(...arguments); + } } } \ No newline at end of file diff --git a/ffi/capi/bindings/js/UnitsConverterFactory.d.ts b/ffi/capi/bindings/js/UnitsConverterFactory.d.ts index 6274366d862..de2fc4d5a80 100644 --- a/ffi/capi/bindings/js/UnitsConverterFactory.d.ts +++ b/ffi/capi/bindings/js/UnitsConverterFactory.d.ts @@ -2,7 +2,6 @@ import type { DataError } from "./DataError" import type { DataProvider } from "./DataProvider" import type { MeasureUnit } from "./MeasureUnit" -import type { MeasureUnitParser } from "./MeasureUnitParser" import type { UnitsConverter } from "./UnitsConverter" import type { pointer, codepoint } from "./diplomat-runtime.d.ts"; @@ -37,12 +36,5 @@ export class UnitsConverterFactory { */ converter(from: MeasureUnit, to: MeasureUnit): UnitsConverter | null; - /** - * Creates a parser to parse the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. - * - * See the [Rust documentation for `parser`](https://docs.rs/icu/latest/icu/experimental/units/converter_factory/struct.ConverterFactory.html#method.parser) for more information. - */ - parser(): MeasureUnitParser; - constructor(); } \ No newline at end of file diff --git a/ffi/capi/bindings/js/UnitsConverterFactory.mjs b/ffi/capi/bindings/js/UnitsConverterFactory.mjs index c5523d236ad..9a68d1e85de 100644 --- a/ffi/capi/bindings/js/UnitsConverterFactory.mjs +++ b/ffi/capi/bindings/js/UnitsConverterFactory.mjs @@ -2,7 +2,6 @@ import { DataError } from "./DataError.mjs" import { DataProvider } from "./DataProvider.mjs" import { MeasureUnit } from "./MeasureUnit.mjs" -import { MeasureUnitParser } from "./MeasureUnitParser.mjs" import { UnitsConverter } from "./UnitsConverter.mjs" import wasm from "./diplomat-wasm.mjs"; import * as diplomatRuntime from "./diplomat-runtime.mjs"; @@ -104,24 +103,6 @@ export class UnitsConverterFactory { finally {} } - /** - * Creates a parser to parse the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. - * - * See the [Rust documentation for `parser`](https://docs.rs/icu/latest/icu/experimental/units/converter_factory/struct.ConverterFactory.html#method.parser) for more information. - */ - parser() { - // This lifetime edge depends on lifetimes 'a - let aEdges = [this]; - - const result = wasm.icu4x_UnitsConverterFactory_parser_mv1(this.ffiValue); - - try { - return new MeasureUnitParser(diplomatRuntime.internalConstructor, result, [], aEdges); - } - - finally {} - } - constructor() { if (arguments[0] === diplomatRuntime.exposeConstructor) { return this.#internalConstructor(...Array.prototype.slice.call(arguments, 1)); diff --git a/ffi/capi/bindings/js/index.d.ts b/ffi/capi/bindings/js/index.d.ts index 5f4c0220d6a..857727b6d4b 100644 --- a/ffi/capi/bindings/js/index.d.ts +++ b/ffi/capi/bindings/js/index.d.ts @@ -116,6 +116,10 @@ export { LocaleDirectionality } from "./LocaleDirectionality" export { Logger } from "./Logger" +export { MeasureUnit } from "./MeasureUnit" + +export { MeasureUnitParser } from "./MeasureUnitParser" + export { DateTimeFormatter } from "./DateTimeFormatter" export { DateTimeFormatterGregorian } from "./DateTimeFormatterGregorian" @@ -198,10 +202,6 @@ export { TimeZone } from "./TimeZone" export { TimeZoneInfo } from "./TimeZoneInfo" -export { MeasureUnit } from "./MeasureUnit" - -export { MeasureUnitParser } from "./MeasureUnitParser" - export { UnitsConverter } from "./UnitsConverter" export { UnitsConverterFactory } from "./UnitsConverterFactory" diff --git a/ffi/capi/bindings/js/index.mjs b/ffi/capi/bindings/js/index.mjs index 77f6fbd23f5..cf77bfa85fd 100644 --- a/ffi/capi/bindings/js/index.mjs +++ b/ffi/capi/bindings/js/index.mjs @@ -114,6 +114,10 @@ export { LocaleDirectionality } from "./LocaleDirectionality.mjs" export { Logger } from "./Logger.mjs" +export { MeasureUnit } from "./MeasureUnit.mjs" + +export { MeasureUnitParser } from "./MeasureUnitParser.mjs" + export { DateTimeFormatter } from "./DateTimeFormatter.mjs" export { DateTimeFormatterGregorian } from "./DateTimeFormatterGregorian.mjs" @@ -196,10 +200,6 @@ export { TimeZone } from "./TimeZone.mjs" export { TimeZoneInfo } from "./TimeZoneInfo.mjs" -export { MeasureUnit } from "./MeasureUnit.mjs" - -export { MeasureUnitParser } from "./MeasureUnitParser.mjs" - export { UnitsConverter } from "./UnitsConverter.mjs" export { UnitsConverterFactory } from "./UnitsConverterFactory.mjs" diff --git a/ffi/capi/src/measure_unit_parser.rs b/ffi/capi/src/measure_unit_parser.rs index 284a93e4e6e..45043b42c75 100644 --- a/ffi/capi/src/measure_unit_parser.rs +++ b/ffi/capi/src/measure_unit_parser.rs @@ -13,6 +13,14 @@ pub mod ffi { #[cfg(feature = "buffer_provider")] use crate::provider::ffi::DataProvider; + #[diplomat::opaque] + /// An ICU4X Measurement Unit object which represents a single unit of measurement + /// such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. + /// + /// You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. + #[diplomat::rust_link(icu::experimental::measure::measureunit::MeasureUnit, Struct)] + pub struct MeasureUnit(pub icu_experimental::measure::measureunit::MeasureUnit); + #[diplomat::opaque] /// An ICU4X Measure Unit Parser object, capable of parsing the CLDR unit identifier (e.g. `meter-per-square-second`) and get the [`MeasureUnit`]. #[diplomat::rust_link(icu::experimental::measure::parser::MeasureUnitParser, Struct)] @@ -60,11 +68,4 @@ pub mod ffi { .map(Box::new) } } - #[diplomat::opaque] - /// An ICU4X Measurement Unit object which represents a single unit of measurement - /// such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. - /// - /// You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. - #[diplomat::rust_link(icu::experimental::measure::measureunit::MeasureUnit, Struct)] - pub struct MeasureUnit(pub icu_experimental::measure::measureunit::MeasureUnit); } diff --git a/ffi/capi/src/units_converter.rs b/ffi/capi/src/units_converter.rs index 4ee15ae6a31..0fa8384e585 100644 --- a/ffi/capi/src/units_converter.rs +++ b/ffi/capi/src/units_converter.rs @@ -6,6 +6,7 @@ #[diplomat::abi_rename = "icu4x_{0}_mv1"] #[diplomat::attr(auto, namespace = "icu4x")] pub mod ffi { + use crate::measure_unit_parser::ffi::MeasureUnit; use alloc::boxed::Box; #[cfg(feature = "buffer_provider")] @@ -67,15 +68,6 @@ pub mod ffi { } } - // TODO: This is now duplicated in measure_unit_parser.rs, is that okay ? - #[diplomat::opaque] - /// An ICU4X Measurement Unit object which represents a single unit of measurement - /// such as `meter`, `second`, `kilometer-per-hour`, `square-meter`, etc. - /// - /// You can create an instance of this object using [`MeasureUnitParser`] by calling the `parse` method. - #[diplomat::rust_link(icu::experimental::measure::measureunit::MeasureUnit, Struct)] - pub struct MeasureUnit(pub icu_experimental::measure::measureunit::MeasureUnit); - #[diplomat::opaque] /// An ICU4X Units Converter object, capable of converting between two [`MeasureUnit`]s. /// From 4b7b0b27c82c5b0ebcd017922419e142839ff762 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Mon, 24 Mar 2025 10:00:32 +0100 Subject: [PATCH 05/16] fix ffi test --- tutorials/cpp/units_converter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/cpp/units_converter.cpp b/tutorials/cpp/units_converter.cpp index 1626fe84bfe..dbfd29c7cd6 100644 --- a/tutorials/cpp/units_converter.cpp +++ b/tutorials/cpp/units_converter.cpp @@ -13,7 +13,7 @@ using namespace icu4x; int main() { auto converter_factory = UnitsConverterFactory::create(); - auto parser = converter_factory->parser(); + auto parser = MeasureUnitParser::create(); auto from = parser->parse("meter"); auto to = parser->parse("foot"); auto converter = converter_factory->converter(*from.get(), *to.get()); From 78df1dc4df11a698d3442316756f011a537fd618 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Mon, 24 Mar 2025 10:06:13 +0100 Subject: [PATCH 06/16] small fixes --- components/experimental/src/measure/parser.rs | 2 +- components/experimental/tests/units/units_test.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index f772e5b7c3a..75bcd0bdbfb 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -33,7 +33,7 @@ impl MeasureUnitParser { ] ); - /// Creates a new [`ConverterFactory`] from compiled data. + /// Creates a new [`MeasureUnitParser`] from compiled data. /// /// ✨ *Enabled with the `compiled_data` Cargo feature.* /// diff --git a/components/experimental/tests/units/units_test.rs b/components/experimental/tests/units/units_test.rs index 2fce2a6c2de..9ceee9977c3 100644 --- a/components/experimental/tests/units/units_test.rs +++ b/components/experimental/tests/units/units_test.rs @@ -286,7 +286,6 @@ fn test_unparsable_units() { "meter second", ]; - let converter_factory = ConverterFactory::new(); let parser = MeasureUnitParser::new(); unparsable_units.iter().for_each(|unit| { From 88e7cc93aeb12bd9b19899579f815d941bdc1c8e Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 05:47:07 +0100 Subject: [PATCH 07/16] Update provider/source/src/units/info.rs Co-authored-by: Robert Bastian <4706271+robertbastian@users.noreply.github.com> --- provider/source/src/units/info.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/provider/source/src/units/info.rs b/provider/source/src/units/info.rs index 43c1c40d4e0..2ac0870fca8 100644 --- a/provider/source/src/units/info.rs +++ b/provider/source/src/units/info.rs @@ -129,10 +129,7 @@ fn test_basic() { .unwrap(); let und_trie: DataResponse = provider - .load(DataRequest { - id: DataIdentifierCow::from_locale(langid!("und").into()).as_borrowed(), - ..Default::default() - }) + .load(Default::default()) .unwrap(); let units_info = und.payload.get().to_owned(); From 3183519e66d645c5f34c06a2c761817a1490a27f Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 05:47:28 +0100 Subject: [PATCH 08/16] Update provider/source/src/units/info.rs Co-authored-by: Robert Bastian <4706271+robertbastian@users.noreply.github.com> --- provider/source/src/units/info.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/source/src/units/info.rs b/provider/source/src/units/info.rs index 2ac0870fca8..9543ea3c15d 100644 --- a/provider/source/src/units/info.rs +++ b/provider/source/src/units/info.rs @@ -74,7 +74,7 @@ impl DataProvider for SourceDataProvider { trie: units_conversion_trie.convert_store(), }; - let parser = MeasureUnitParser::from_payload(DataPayload::from_owned(units_trie)); + let parser = MeasureUnitParser::try_new_unstable(FixedProvider::from_owned(units_trie)); let conversion_info = convert_units_vec .iter() From f9904753c83e5fe3a9536f5e21932a249ba5f24b Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 05:53:06 +0100 Subject: [PATCH 09/16] fix --- components/experimental/src/measure/parser.rs | 6 ------ provider/source/src/units/info.rs | 7 +++---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index 75bcd0bdbfb..f1ae24b2553 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -55,12 +55,6 @@ impl MeasureUnitParser { Ok(Self { payload }) } - // TODO: remove this function after being able to use the `try_new_with_buffer_provider` constructor in `provider/source/src/units/info.rs`. - /// Creates a new [`MeasureUnitParser`] from a [`DataPayload`]. - pub fn from_payload(payload: DataPayload) -> Self { - Self { payload } - } - /// Get the unit id. /// NOTE: /// if the unit id is found, the function will return (unit id, part without the unit id and without `-` at the beginning of the remaining part if it exists). diff --git a/provider/source/src/units/info.rs b/provider/source/src/units/info.rs index 9543ea3c15d..fc723d05138 100644 --- a/provider/source/src/units/info.rs +++ b/provider/source/src/units/info.rs @@ -10,6 +10,7 @@ use icu::experimental::measure::parser::MeasureUnitParser; use icu::experimental::measure::provider::trie::UnitsTrie; use icu::experimental::units::provider::{ConversionInfo, UnitsInfo, UnitsInfoV1}; use icu_provider::prelude::*; +use icu_provider_adapters::fixed::FixedProvider; use zerotrie::ZeroTrieSimpleAscii; use zerovec::VarZeroVec; @@ -74,7 +75,7 @@ impl DataProvider for SourceDataProvider { trie: units_conversion_trie.convert_store(), }; - let parser = MeasureUnitParser::try_new_unstable(FixedProvider::from_owned(units_trie)); + let parser = MeasureUnitParser::try_new_unstable(&FixedProvider::from_owned(units_trie))?; let conversion_info = convert_units_vec .iter() @@ -128,9 +129,7 @@ fn test_basic() { }) .unwrap(); - let und_trie: DataResponse = provider - .load(Default::default()) - .unwrap(); + let und_trie: DataResponse = provider.load(Default::default()).unwrap(); let units_info = und.payload.get().to_owned(); let units_info_map = &und_trie.payload.get().trie; From 5cae0e6207bebeadf7eeb50020b9688e2547f17c Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 05:55:52 +0100 Subject: [PATCH 10/16] fix --- components/experimental/src/measure/parser.rs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index f1ae24b2553..d8bc2a5b7df 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -23,16 +23,6 @@ pub struct MeasureUnitParser { } impl MeasureUnitParser { - icu_provider::gen_buffer_data_constructors!( - () -> error: DataError, - functions: [ - new: skip, - try_new_with_buffer_provider, - try_new_unstable, - Self, - ] - ); - /// Creates a new [`MeasureUnitParser`] from compiled data. /// /// ✨ *Enabled with the `compiled_data` Cargo feature.* @@ -55,6 +45,16 @@ impl MeasureUnitParser { Ok(Self { payload }) } + icu_provider::gen_buffer_data_constructors!( + () -> error: DataError, + functions: [ + new: skip, + try_new_with_buffer_provider, + try_new_unstable, + Self, + ] + ); + /// Get the unit id. /// NOTE: /// if the unit id is found, the function will return (unit id, part without the unit id and without `-` at the beginning of the remaining part if it exists). From 8287f574c28b0bc2972d8f5d73c0f19ebd863f11 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 05:58:22 +0100 Subject: [PATCH 11/16] fix after merging --- ffi/capi/bindings/js/index.d.ts | 4 ---- ffi/capi/bindings/js/index.mjs | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/ffi/capi/bindings/js/index.d.ts b/ffi/capi/bindings/js/index.d.ts index c3e82f7a02f..9771005b571 100644 --- a/ffi/capi/bindings/js/index.d.ts +++ b/ffi/capi/bindings/js/index.d.ts @@ -204,10 +204,6 @@ export { TimeZoneInfo } from "./TimeZoneInfo" export { TimeZoneFormatter } from "./TimeZoneFormatter" -export { MeasureUnit } from "./MeasureUnit" - -export { MeasureUnitParser } from "./MeasureUnitParser" - export { UnitsConverter } from "./UnitsConverter" export { UnitsConverterFactory } from "./UnitsConverterFactory" diff --git a/ffi/capi/bindings/js/index.mjs b/ffi/capi/bindings/js/index.mjs index 9a4471eaa08..61515f46122 100644 --- a/ffi/capi/bindings/js/index.mjs +++ b/ffi/capi/bindings/js/index.mjs @@ -112,6 +112,10 @@ export { LocaleDirectionality } from "./LocaleDirectionality.mjs" export { Logger } from "./Logger.mjs" +export { MeasureUnit } from "./MeasureUnit.mjs" + +export { MeasureUnitParser } from "./MeasureUnitParser.mjs" + export { DateTimeFormatter } from "./DateTimeFormatter.mjs" export { DateTimeFormatterGregorian } from "./DateTimeFormatterGregorian.mjs" @@ -198,10 +202,6 @@ export { TimeZoneInfo } from "./TimeZoneInfo.mjs" export { TimeZoneFormatter } from "./TimeZoneFormatter.mjs" -export { MeasureUnit } from "./MeasureUnit.mjs" - -export { MeasureUnitParser } from "./MeasureUnitParser.mjs" - export { UnitsConverter } from "./UnitsConverter.mjs" export { UnitsConverterFactory } from "./UnitsConverterFactory.mjs" From e1fc55f7ee8905e12a8ae078e3996bc41d50efb0 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 06:10:56 +0100 Subject: [PATCH 12/16] fix clippy --- components/experimental/src/measure/parser.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index d8bc2a5b7df..221cbb207a6 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -22,6 +22,12 @@ pub struct MeasureUnitParser { payload: DataPayload, } +impl Default for MeasureUnitParser { + fn default() -> Self { + Self::new() + } +} + impl MeasureUnitParser { /// Creates a new [`MeasureUnitParser`] from compiled data. /// From ddf06b628482327250e11d2f8809c7197bedaed3 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 06:14:05 +0100 Subject: [PATCH 13/16] revert clippy --- components/experimental/src/measure/parser.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index 221cbb207a6..d8bc2a5b7df 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -22,12 +22,6 @@ pub struct MeasureUnitParser { payload: DataPayload, } -impl Default for MeasureUnitParser { - fn default() -> Self { - Self::new() - } -} - impl MeasureUnitParser { /// Creates a new [`MeasureUnitParser`] from compiled data. /// From 2fe49c5b2bd307a35bc044db41731d2f802f3768 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 06:20:37 +0100 Subject: [PATCH 14/16] fix clippy --- components/experimental/src/measure/parser.rs | 10 ++++++---- components/experimental/src/units/converter_factory.rs | 6 +++--- components/experimental/tests/units/units_test.rs | 6 +++--- ffi/capi/src/measure_unit_parser.rs | 2 +- provider/source/src/units/info.rs | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index d8bc2a5b7df..d8b55ccea54 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -22,19 +22,21 @@ pub struct MeasureUnitParser { payload: DataPayload, } -impl MeasureUnitParser { +impl Default for MeasureUnitParser { /// Creates a new [`MeasureUnitParser`] from compiled data. /// /// ✨ *Enabled with the `compiled_data` Cargo feature.* /// /// [📚 Help choosing a constructor](icu_provider::constructors) #[cfg(feature = "compiled_data")] - pub const fn new() -> Self { + fn default() -> Self { Self { payload: DataPayload::from_static_ref(crate::provider::Baked::SINGLETON_UNITS_TRIE_V1), } } +} +impl MeasureUnitParser { #[doc = icu_provider::gen_buffer_unstable_docs!(UNSTABLE, Self::new)] pub fn try_new_unstable(provider: &D) -> Result where @@ -226,7 +228,7 @@ mod tests { ("portion-per-1000000000", 1, 1_000_000_000), ("liter-per-100-kilometer", 2, 100), ]; - let parser = MeasureUnitParser::new(); + let parser = MeasureUnitParser::default(); for (input, expected_len, expected_denominator) in test_cases { let measure_unit = parser.try_from_str(input).unwrap(); @@ -293,7 +295,7 @@ mod tests { continue; } - let parser = MeasureUnitParser::new(); + let parser = MeasureUnitParser::default(); let measure_unit = parser.try_from_str(input); if measure_unit.is_ok() { println!("OK: {}", input); diff --git a/components/experimental/src/units/converter_factory.rs b/components/experimental/src/units/converter_factory.rs index 7f67de6b08f..06c14eaa43d 100644 --- a/components/experimental/src/units/converter_factory.rs +++ b/components/experimental/src/units/converter_factory.rs @@ -339,7 +339,7 @@ mod tests { #[test] fn test_converter_factory() { let factory = ConverterFactory::new(); - let parser = MeasureUnitParser::new(); + let parser = MeasureUnitParser::default(); let input_unit = parser.try_from_str("meter").unwrap(); let output_unit = parser.try_from_str("foot").unwrap(); let converter = factory.converter::(&input_unit, &output_unit).unwrap(); @@ -354,7 +354,7 @@ mod tests { #[test] fn test_converter_factory_with_constant_denominator() { let factory = ConverterFactory::new(); - let parser = MeasureUnitParser::new(); + let parser = MeasureUnitParser::default(); let input_unit = parser.try_from_str("liter-per-100-kilometer").unwrap(); let output_unit = parser.try_from_str("mile-per-gallon").unwrap(); let converter = factory.converter::(&input_unit, &output_unit).unwrap(); @@ -369,7 +369,7 @@ mod tests { #[test] fn test_converter_factory_with_offset() { let factory = ConverterFactory::new(); - let parser = MeasureUnitParser::new(); + let parser = MeasureUnitParser::default(); let input_unit = parser.try_from_str("celsius").unwrap(); let output_unit = parser.try_from_str("fahrenheit").unwrap(); let converter = factory.converter::(&input_unit, &output_unit).unwrap(); diff --git a/components/experimental/tests/units/units_test.rs b/components/experimental/tests/units/units_test.rs index 9ceee9977c3..9cb9b8f6090 100644 --- a/components/experimental/tests/units/units_test.rs +++ b/components/experimental/tests/units/units_test.rs @@ -39,7 +39,7 @@ fn test_cldr_unit_tests() { .collect(); let converter_factory = ConverterFactory::new(); - let parser = MeasureUnitParser::new(); + let parser = MeasureUnitParser::default(); for test in tests { let input_unit = parser @@ -208,7 +208,7 @@ fn test_units_non_convertible() { ]; let converter_factory = ConverterFactory::new(); - let parser = MeasureUnitParser::new(); + let parser = MeasureUnitParser::default(); for (input, output) in non_convertible_units.iter() { let input_unit = parser @@ -286,7 +286,7 @@ fn test_unparsable_units() { "meter second", ]; - let parser = MeasureUnitParser::new(); + let parser = MeasureUnitParser::default(); unparsable_units.iter().for_each(|unit| { assert!( diff --git a/ffi/capi/src/measure_unit_parser.rs b/ffi/capi/src/measure_unit_parser.rs index 45043b42c75..a5cecf64ecd 100644 --- a/ffi/capi/src/measure_unit_parser.rs +++ b/ffi/capi/src/measure_unit_parser.rs @@ -36,7 +36,7 @@ pub mod ffi { #[cfg(feature = "compiled_data")] pub fn create() -> Box { Box::new(MeasureUnitParser( - icu_experimental::measure::parser::MeasureUnitParser::new(), + icu_experimental::measure::parser::MeasureUnitParser::default(), )) } /// Construct a new [`MeasureUnitParser`] instance using a particular data source. diff --git a/provider/source/src/units/info.rs b/provider/source/src/units/info.rs index fc723d05138..4a4b8872b45 100644 --- a/provider/source/src/units/info.rs +++ b/provider/source/src/units/info.rs @@ -63,7 +63,7 @@ impl DataProvider for SourceDataProvider { } // TODO: remove this once we can use the `try_new_with_buffer_provider` constructor in `components/experimental/src/measure/parser.rs`. - // OR just using `MeasureUnitParser::new()` + // OR just using `MeasureUnitParser::default()` let units_conversion_trie = ZeroTrieSimpleAscii::try_from(&conversion_info_map).map_err(|e| { DataError::custom("Could not create ZeroTrie from units.json data") From e3921bf7cc522bf23c2f2d3e0eddbcdfc5c4f4c9 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 09:43:45 +0100 Subject: [PATCH 15/16] fix --- components/experimental/src/measure/parser.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index d8b55ccea54..4fd785c71b1 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -22,6 +22,7 @@ pub struct MeasureUnitParser { payload: DataPayload, } +#[cfg(feature = "compiled_data")] impl Default for MeasureUnitParser { /// Creates a new [`MeasureUnitParser`] from compiled data. /// From 1695fd2de8b922b8196c3f252650b1737c910d26 Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Tue, 25 Mar 2025 09:57:10 +0100 Subject: [PATCH 16/16] fix doc --- components/experimental/src/measure/parser.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/components/experimental/src/measure/parser.rs b/components/experimental/src/measure/parser.rs index 4fd785c71b1..a5c764a0cf0 100644 --- a/components/experimental/src/measure/parser.rs +++ b/components/experimental/src/measure/parser.rs @@ -38,6 +38,18 @@ impl Default for MeasureUnitParser { } impl MeasureUnitParser { + /// Creates a new [`MeasureUnitParser`] from compiled data. + /// + /// ✨ *Enabled with the `compiled_data` Cargo feature.* + /// + /// [📚 Help choosing a constructor](icu_provider::constructors) + #[cfg(feature = "compiled_data")] + pub const fn new() -> Self { + Self { + payload: DataPayload::from_static_ref(crate::provider::Baked::SINGLETON_UNITS_TRIE_V1), + } + } + #[doc = icu_provider::gen_buffer_unstable_docs!(UNSTABLE, Self::new)] pub fn try_new_unstable(provider: &D) -> Result where