Skip to content

Commit 26b0037

Browse files
committed
Optimize performance
1 parent 2d7f7c5 commit 26b0037

File tree

2 files changed

+47
-38
lines changed

2 files changed

+47
-38
lines changed

src/negotiate/likely_subtags.rs

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,25 @@
1-
use icu_locid::LanguageIdentifier;
1+
use icu_locid::{
2+
langid,
3+
subtags::{language, region, Language, Region},
4+
LanguageIdentifier,
5+
};
26

3-
static REGION_MATCHING_KEYS: &[&str] = &[
4-
"az", "bg", "cs", "de", "es", "fi", "fr", "hu", "it", "lt", "lv", "nl", "pl", "ro", "ru",
7+
static REGION_MATCHING_KEYS: &[(Language, Region)] = &[
8+
(language!("az"), region!("AZ")),
9+
(language!("bg"), region!("BG")),
10+
(language!("cs"), region!("CS")),
11+
(language!("de"), region!("DE")),
12+
(language!("es"), region!("ES")),
13+
(language!("fi"), region!("FI")),
14+
(language!("fr"), region!("FR")),
15+
(language!("nu"), region!("NU")),
16+
(language!("it"), region!("IT")),
17+
(language!("lt"), region!("LT")),
18+
(language!("lv"), region!("LV")),
19+
(language!("nl"), region!("NL")),
20+
(language!("pl"), region!("PL")),
21+
(language!("ro"), region!("RO")),
22+
(language!("ru"), region!("RU")),
523
];
624

725
pub trait MockLikelySubtags {
@@ -10,30 +28,29 @@ pub trait MockLikelySubtags {
1028

1129
impl MockLikelySubtags for LanguageIdentifier {
1230
fn maximize(&mut self) -> bool {
13-
let extended = match self.to_string().as_str() {
14-
"en" => "en-Latn-US",
15-
"fr" => "fr-Latn-FR",
16-
"sr" => "sr-Cyrl-SR",
17-
"sr-RU" => "sr-Latn-SR",
18-
"az-IR" => "az-Arab-IR",
19-
"zh-GB" => "zh-Hant-GB",
20-
"zh-US" => "zh-Hant-US",
31+
let extended = match &self {
32+
b if *b == &langid!("en") => langid!("en-Latn-US"),
33+
b if *b == &langid!("fr") => langid!("fr-Latn-FR"),
34+
b if *b == &langid!("sr") => langid!("sr-Cyrl-SR"),
35+
b if *b == &langid!("sr-RU") => langid!("sr-Latn-SR"),
36+
b if *b == &langid!("az-IR") => langid!("az-Arab-IR"),
37+
b if *b == &langid!("zh-GB") => langid!("zh-Hant-GB"),
38+
b if *b == &langid!("zh-US") => langid!("zh-Hant-US"),
2139
_ => {
22-
let lang = self.language;
40+
let lang = &self.language;
2341

24-
for subtag in REGION_MATCHING_KEYS {
25-
if lang.strict_cmp(subtag.as_bytes()).is_eq() {
26-
self.region = Some(subtag.parse().unwrap());
27-
return true;
28-
}
42+
if let Ok(idx) = REGION_MATCHING_KEYS.binary_search_by(|(l, _)| l.cmp(lang)) {
43+
let subtag = REGION_MATCHING_KEYS[idx].1;
44+
self.region = Some(subtag);
45+
return true;
2946
}
3047
return false;
3148
}
3249
};
33-
let langid: LanguageIdentifier = extended.parse().expect("Failed to parse langid.");
34-
self.language = langid.language;
35-
self.script = langid.script;
36-
self.region = langid.region;
50+
let (language, script, region) = (extended.language, extended.script, extended.region);
51+
self.language = language;
52+
self.script = script;
53+
self.region = region;
3754
true
3855
}
3956
}

src/negotiate/mod.rs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -148,23 +148,14 @@ fn matches(
148148
range1: bool,
149149
range2: bool,
150150
) -> bool {
151-
let language = (range1 && lid1.language.is_empty())
151+
((range1 && lid1.language.is_empty())
152152
|| (range2 && lid2.language.is_empty())
153-
|| lid1.language == lid2.language;
154-
if !language {
155-
return false;
156-
}
157-
let script = subtag_matches(&lid1.script, &lid2.script, range1, range2);
158-
if !script {
159-
return false;
160-
}
161-
let region = subtag_matches(&lid1.region, &lid2.region, range1, range2);
162-
if !region {
163-
return false;
164-
}
165-
(range1 && lid1.variants.is_empty())
166-
|| (range2 && lid2.variants.is_empty())
167-
|| lid1.variants == lid2.variants
153+
|| lid1.language == lid2.language)
154+
&& subtag_matches(&lid1.script, &lid2.script, range1, range2)
155+
&& subtag_matches(&lid1.region, &lid2.region, range1, range2)
156+
&& ((range1 && lid1.variants.is_empty())
157+
|| (range2 && lid2.variants.is_empty())
158+
|| lid1.variants == lid2.variants)
168159
}
169160

170161
pub fn filter_matches<'a, R: 'a + AsRef<LanguageIdentifier>, A: 'a + AsRef<LanguageIdentifier>>(
@@ -177,7 +168,7 @@ pub fn filter_matches<'a, R: 'a + AsRef<LanguageIdentifier>, A: 'a + AsRef<Langu
177168
let mut available_locales: Vec<&A> = available.iter().collect();
178169

179170
for req in requested {
180-
let mut req = req.as_ref().to_owned();
171+
let req = req.as_ref();
181172
macro_rules! test_strategy {
182173
($self_as_range:expr, $other_as_range:expr) => {{
183174
let mut match_found = false;
@@ -216,6 +207,7 @@ pub fn filter_matches<'a, R: 'a + AsRef<LanguageIdentifier>, A: 'a + AsRef<Langu
216207
continue;
217208
}
218209

210+
let mut req = req.to_owned();
219211
// 3) Try to match against a maximized version of the requested locale
220212
if req.maximize() {
221213
test_strategy!(true, false);

0 commit comments

Comments
 (0)