Skip to content

Commit b7d567f

Browse files
authored
Rename AnyPayloadProvider to FixedProvider, make it generic (#5502)
Part 1 of #3947 not yet planning on doing part 2 <!-- Thank you for your pull request to ICU4X! Reminder: try to use [Conventional Comments](https://conventionalcomments.org/) to make comments clearer. Please see https://github.com/unicode-org/icu4x/blob/main/CONTRIBUTING.md for general information on contributing to ICU4X. -->
1 parent e266337 commit b7d567f

File tree

14 files changed

+193
-170
lines changed

14 files changed

+193
-170
lines changed

CHANGELOG.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,45 @@
11
# Changelog
22

3+
## icu4x 2.0
4+
5+
- Components
6+
- General
7+
- Compiled data updated to CLDR 45 and ICU 75 (unicode-org#4782)
8+
- `icu_calendar`
9+
- `icu_collections`
10+
- `icu_normalizer`
11+
- `icu_datetime`
12+
- `icu_experimental`
13+
- `icu_locid`
14+
- `icu_locid_transform`
15+
- `icu_plurals`
16+
- `icu_properties`
17+
- `icu_segmenter`
18+
- `icu_timezone`
19+
- Data model and providers
20+
- `icu_datagen`
21+
- `icu_provider`
22+
- `icu_provider_blob`
23+
- `icu_provider_adapters`
24+
- Replace `AnyPayloadProvider` with `FixedProvider<M>`
25+
- FFI:
26+
- All languages
27+
- JS
28+
- C++
29+
- `icu_harfbuzz`
30+
- Utilities
31+
- `calendrical_calculations`:
32+
- `databake`
33+
- `fixed_decimal`
34+
- `icu_pattern`
35+
- `litemap`
36+
- `yoke`
37+
- `zerofrom`
38+
- `zerotrie`
39+
- `zerovec`
40+
- `writeable`
41+
42+
343
## icu4x 1.5.x
444

545

components/decimal/benches/fixed_decimal_format.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion};
1111
use fixed_decimal::FixedDecimal;
1212
use icu_decimal::provider::DecimalSymbolsV1Marker;
1313
use icu_decimal::FixedDecimalFormatter;
14-
use icu_provider_adapters::any_payload::AnyPayloadProvider;
14+
use icu_provider_adapters::fixed::FixedProvider;
1515

1616
fn triangular_nums(range: f64) -> Vec<isize> {
1717
// Use Lcg64Xsh32, a small, fast PRNG.
@@ -26,7 +26,7 @@ fn triangular_nums(range: f64) -> Vec<isize> {
2626

2727
fn overview_bench(c: &mut Criterion) {
2828
let nums = triangular_nums(1e9);
29-
let provider = AnyPayloadProvider::new_default::<DecimalSymbolsV1Marker>();
29+
let provider = FixedProvider::<DecimalSymbolsV1Marker>::new_default();
3030
c.bench_function("icu_decimal/overview", |b| {
3131
b.iter(|| {
3232
// This benchmark demonstrates the performance of the format function on 1000 numbers

components/decimal/src/grouper.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ fn test_grouper() {
5858
use crate::FixedDecimalFormatter;
5959
use fixed_decimal::FixedDecimal;
6060
use icu_provider::prelude::*;
61-
use icu_provider_adapters::any_payload::AnyPayloadProvider;
61+
use icu_provider_adapters::fixed::FixedProvider;
6262
use writeable::assert_writeable_eq;
6363

6464
let western_sizes = GroupingSizesV1 {
@@ -154,7 +154,7 @@ fn test_grouper() {
154154
for cas in &cases {
155155
for i in 0..4 {
156156
let dec = FixedDecimal::from(1).multiplied_pow10((i as i16) + 3);
157-
let provider = AnyPayloadProvider::from_owned::<DecimalSymbolsV1Marker>(
157+
let provider = FixedProvider::<DecimalSymbolsV1Marker>::from_owned(
158158
crate::provider::DecimalSymbolsV1 {
159159
grouping_sizes: cas.sizes,
160160
..Default::default()

ffi/capi/src/decimal.rs

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,7 @@ pub mod ffi {
8181
}
8282
}
8383

84-
use icu_decimal::provider::{
85-
AffixesV1, DecimalSymbolsV1, DecimalSymbolsV1Marker, GroupingSizesV1,
86-
};
84+
use icu_decimal::provider::{AffixesV1, DecimalSymbolsV1, GroupingSizesV1};
8785
let mut new_digits = ['\0'; 10];
8886
for (old, new) in digits
8987
.iter()
@@ -113,22 +111,15 @@ pub mod ffi {
113111
.map(Into::into)
114112
.unwrap_or(options.grouping_strategy);
115113
Ok(Box::new(FixedDecimalFormatter(
116-
icu_decimal::FixedDecimalFormatter::try_new_with_any_provider(
117-
&icu_provider_adapters::any_payload::AnyPayloadProvider::from_any_payload::<
118-
icu_decimal::provider::DecimalSymbolsV1Marker,
119-
>(
120-
icu_provider::DataPayload::<DecimalSymbolsV1Marker>::from_owned(
121-
DecimalSymbolsV1 {
122-
plus_sign_affixes,
123-
minus_sign_affixes,
124-
decimal_separator: str_to_cow(decimal_separator),
125-
grouping_separator: str_to_cow(grouping_separator),
126-
grouping_sizes,
127-
digits,
128-
},
129-
)
130-
.wrap_into_any_payload(),
131-
),
114+
icu_decimal::FixedDecimalFormatter::try_new_unstable(
115+
&icu_provider_adapters::fixed::FixedProvider::from_owned(DecimalSymbolsV1 {
116+
plus_sign_affixes,
117+
minus_sign_affixes,
118+
decimal_separator: str_to_cow(decimal_separator),
119+
grouping_separator: str_to_cow(grouping_separator),
120+
grouping_sizes,
121+
digits,
122+
}),
132123
&Default::default(),
133124
options,
134125
)?,

provider/adapters/src/any_payload.rs

Lines changed: 0 additions & 131 deletions
This file was deleted.

provider/adapters/src/fixed.rs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// This file is part of ICU4X. For terms of use, please see the file
2+
// called LICENSE at the top level of the ICU4X source tree
3+
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4+
5+
//! Data provider always serving the same struct.
6+
7+
use core::fmt;
8+
use icu_provider::any::MaybeSendSync;
9+
use icu_provider::prelude::*;
10+
use yoke::trait_hack::YokeTraitHack;
11+
use yoke::Yokeable;
12+
13+
/// A data provider that returns clones of a fixed type-erased payload.
14+
///
15+
/// [`FixedProvider`] implements [`AnyProvider`], so it can be used in
16+
/// `*_with_any_provider` constructors across ICU4X.
17+
/// # Examples
18+
///
19+
/// ```
20+
/// use icu_provider::hello_world::*;
21+
/// use icu_provider::prelude::*;
22+
/// use icu_provider_adapters::fixed::FixedProvider;
23+
/// use std::borrow::Cow;
24+
/// use writeable::assert_writeable_eq;
25+
///
26+
/// let provider =
27+
/// FixedProvider::<HelloWorldV1Marker>::from_static(&HelloWorldV1 {
28+
/// message: Cow::Borrowed("custom hello world"),
29+
/// });
30+
///
31+
/// // Check that it works:
32+
/// let formatter = HelloWorldFormatter::try_new_with_any_provider(
33+
/// &provider,
34+
/// &Default::default(),
35+
/// )
36+
/// .expect("marker matches");
37+
/// assert_writeable_eq!(formatter.format(), "custom hello world");
38+
///
39+
/// # struct DummyMarker;
40+
/// # impl DynamicDataMarker for DummyMarker {
41+
/// # type DataStruct = <HelloWorldV1Marker as DynamicDataMarker>::DataStruct;
42+
/// # }
43+
/// # impl DataMarker for DummyMarker {
44+
/// # const INFO: DataMarkerInfo = DataMarkerInfo::from_path(icu_provider::marker::data_marker_path!("dummy@1"));
45+
/// # }
46+
/// // Requests for invalid markers get MissingDataMarker
47+
/// assert!(matches!(
48+
/// provider.load_any(DummyMarker::INFO, Default::default()),
49+
/// Err(DataError {
50+
/// kind: DataErrorKind::MarkerNotFound,
51+
/// ..
52+
/// })
53+
/// ))
54+
/// ```
55+
#[allow(clippy::exhaustive_structs)] // this type is stable
56+
pub struct FixedProvider<M: DataMarker> {
57+
data: DataPayload<M>,
58+
}
59+
60+
impl<M: DataMarker> FixedProvider<M> {
61+
/// Creates a `FixedProvider` with an owned (allocated) payload of the given data.
62+
pub fn from_owned(data: M::DataStruct) -> Self {
63+
Self::from_payload(DataPayload::from_owned(data))
64+
}
65+
66+
/// Creates a `FixedProvider` with a statically borrowed payload of the given data.
67+
pub fn from_static(data: &'static M::DataStruct) -> Self {
68+
FixedProvider {
69+
data: DataPayload::from_static_ref(data),
70+
}
71+
}
72+
73+
/// Creates a `FixedProvider` from an existing [`DataPayload`].
74+
pub fn from_payload(data: DataPayload<M>) -> Self {
75+
FixedProvider { data }
76+
}
77+
78+
/// Creates a `FixedProvider` with the default (allocated) version of the data struct.
79+
pub fn new_default() -> Self
80+
where
81+
M::DataStruct: Default,
82+
{
83+
Self::from_owned(M::DataStruct::default())
84+
}
85+
}
86+
87+
impl<M: DataMarker> AnyProvider for FixedProvider<M>
88+
where
89+
for<'a> YokeTraitHack<<M::DataStruct as Yokeable<'a>>::Output>: Clone,
90+
M::DataStruct: MaybeSendSync,
91+
{
92+
fn load_any(&self, marker: DataMarkerInfo, _: DataRequest) -> Result<AnyResponse, DataError> {
93+
marker.match_marker(M::INFO)?;
94+
Ok(AnyResponse {
95+
metadata: DataResponseMetadata::default(),
96+
payload: self.data.clone().wrap_into_any_payload(),
97+
})
98+
}
99+
}
100+
101+
impl<M> DataProvider<M> for FixedProvider<M>
102+
where
103+
M: DataMarker,
104+
for<'a> YokeTraitHack<<M::DataStruct as Yokeable<'a>>::Output>: Clone,
105+
{
106+
fn load(&self, _: DataRequest) -> Result<DataResponse<M>, DataError> {
107+
Ok(DataResponse {
108+
metadata: Default::default(),
109+
payload: self.data.clone(),
110+
})
111+
}
112+
}
113+
114+
impl<M> fmt::Debug for FixedProvider<M>
115+
where
116+
M: DynamicDataMarker,
117+
M: DataMarker,
118+
for<'a> &'a <M::DataStruct as Yokeable<'a>>::Output: fmt::Debug,
119+
{
120+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
121+
self.data.fmt(f)
122+
}
123+
}

provider/adapters/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727

2828
extern crate alloc;
2929

30-
pub mod any_payload;
3130
pub mod either;
3231
pub mod empty;
3332
pub mod fallback;
3433
pub mod filter;
34+
pub mod fixed;
3535
pub mod fork;
3636
mod helpers;

0 commit comments

Comments
 (0)