summaryrefslogtreecommitdiffstats
path: root/vendor/icu_locid/benches/iai_langid.rs
blob: f964d146225f0fa34adb93415204c2e06d7246fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// 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 ).

use icu_locid::{
    langid, subtags_language as language, subtags_region as region, LanguageIdentifier,
};

const LIDS: &[LanguageIdentifier] = &[
    langid!("en"),
    langid!("pl"),
    langid!("fr-CA"),
    langid!("zh-Hans"),
    langid!("en-US"),
    langid!("en-Latn-US"),
    langid!("sr-Cyrl-BA"),
];

const LIDS_STR: &[&str] = &[
    "en",
    "pl",
    "fr-CA",
    "zh-Hans",
    "en-US",
    "en-Latn-US",
    "sr-Cyrl-BA",
];

fn bench_langid_constr() {
    // Tests the instructions required to construct a LID from an str.

    let _: Vec<LanguageIdentifier> = LIDS_STR
        .iter()
        .map(|l| l.parse().expect("Failed to parse"))
        .collect();
}

fn bench_langid_compare_components() {
    // Tests the cost of comparing LID components.

    let result = LIDS
        .iter()
        .filter(|l| l.language == language!("en") && l.region == Some(region!("US")))
        .count();

    assert_eq!(result, 2);
}

fn bench_langid_compare_components_str() {
    // Tests the cost of comparing LID components to str.

    let result = LIDS
        .iter()
        .filter(|l| {
            l.language == language!("en") && l.region.map(|r| r == region!("US")).unwrap_or(false)
        })
        .count();

    assert_eq!(result, 2);
}

fn bench_langid_strict_cmp() {
    // Tests the cost of comparing a langid against byte strings.
    use core::cmp::Ordering;

    let lid = langid!("en_us");

    let result = LIDS_STR
        .iter()
        .filter(|s| lid.strict_cmp(s.as_bytes()) == Ordering::Equal)
        .count();

    assert_eq!(result, 1);
}

fn bench_langid_matching() {
    // Tests matching a LID against other LIDs.

    let lid = langid!("en_us");

    let count = LIDS.iter().filter(|l| lid == **l).count();
    assert_eq!(count, 1);
}

fn bench_langid_matching_str() {
    // Tests matching a LID against list of str.

    let lid = langid!("en_us");

    let count = LIDS_STR.iter().filter(|&l| lid.normalizing_eq(l)).count();
    assert_eq!(count, 1);
}

fn bench_langid_serialize() {
    // Tests serialization of LIDs.

    let _: Vec<String> = LIDS.iter().map(|l| l.to_string()).collect();
}

fn bench_langid_canonicalize() {
    // Tests canonicalization of strings.

    let _: Vec<String> = LIDS_STR
        .iter()
        .map(|l| LanguageIdentifier::canonicalize(l).expect("Canonicalization failed"))
        .collect();
}

iai::main!(
    bench_langid_constr,
    bench_langid_compare_components,
    bench_langid_compare_components_str,
    bench_langid_strict_cmp,
    bench_langid_matching,
    bench_langid_matching_str,
    bench_langid_serialize,
    bench_langid_canonicalize,
);