• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // This example demonstrates the use of ZeroTrieSimpleAscii to look up data based on a region code.
6 
7 #![allow(dead_code)]
8 #![no_main] // https://github.com/unicode-org/icu4x/issues/395
9 icu_benchmark_macros::instrument!();
10 
11 use zerotrie::ZeroTriePerfectHash;
12 use zerotrie::ZeroTrieSimpleAscii;
13 
14 mod weekday {
15     pub const MON: usize = 1;
16     pub const FRI: usize = 5;
17     pub const SAT: usize = 6;
18     pub const SUN: usize = 7;
19 }
20 
21 // This data originated from CLDR 41.
22 static DATA: &[(&str, usize)] = &[
23     ("001", weekday::MON),
24     ("AD", weekday::MON),
25     ("AE", weekday::SAT),
26     ("AF", weekday::SAT),
27     ("AG", weekday::SUN),
28     ("AI", weekday::MON),
29     ("AL", weekday::MON),
30     ("AM", weekday::MON),
31     ("AN", weekday::MON),
32     ("AR", weekday::MON),
33     ("AS", weekday::SUN),
34     ("AT", weekday::MON),
35     ("AU", weekday::MON),
36     ("AX", weekday::MON),
37     ("AZ", weekday::MON),
38     ("BA", weekday::MON),
39     ("BD", weekday::SUN),
40     ("BE", weekday::MON),
41     ("BG", weekday::MON),
42     ("BH", weekday::SAT),
43     ("BM", weekday::MON),
44     ("BN", weekday::MON),
45     ("BR", weekday::SUN),
46     ("BS", weekday::SUN),
47     ("BT", weekday::SUN),
48     ("BW", weekday::SUN),
49     ("BY", weekday::MON),
50     ("BZ", weekday::SUN),
51     ("CA", weekday::SUN),
52     ("CH", weekday::MON),
53     ("CL", weekday::MON),
54     ("CM", weekday::MON),
55     ("CN", weekday::SUN),
56     ("CO", weekday::SUN),
57     ("CR", weekday::MON),
58     ("CY", weekday::MON),
59     ("CZ", weekday::MON),
60     ("DE", weekday::MON),
61     ("DJ", weekday::SAT),
62     ("DK", weekday::MON),
63     ("DM", weekday::SUN),
64     ("DO", weekday::SUN),
65     ("DZ", weekday::SAT),
66     ("EC", weekday::MON),
67     ("EE", weekday::MON),
68     ("EG", weekday::SAT),
69     ("ES", weekday::MON),
70     ("ET", weekday::SUN),
71     ("FI", weekday::MON),
72     ("FJ", weekday::MON),
73     ("FO", weekday::MON),
74     ("FR", weekday::MON),
75     ("GB", weekday::MON),
76     ("GB-alt-variant", weekday::SUN),
77     ("GE", weekday::MON),
78     ("GF", weekday::MON),
79     ("GP", weekday::MON),
80     ("GR", weekday::MON),
81     ("GT", weekday::SUN),
82     ("GU", weekday::SUN),
83     ("HK", weekday::SUN),
84     ("HN", weekday::SUN),
85     ("HR", weekday::MON),
86     ("HU", weekday::MON),
87     ("ID", weekday::SUN),
88     ("IE", weekday::MON),
89     ("IL", weekday::SUN),
90     ("IN", weekday::SUN),
91     ("IQ", weekday::SAT),
92     ("IR", weekday::SAT),
93     ("IS", weekday::MON),
94     ("IT", weekday::MON),
95     ("JM", weekday::SUN),
96     ("JO", weekday::SAT),
97     ("JP", weekday::SUN),
98     ("KE", weekday::SUN),
99     ("KG", weekday::MON),
100     ("KH", weekday::SUN),
101     ("KR", weekday::SUN),
102     ("KW", weekday::SAT),
103     ("KZ", weekday::MON),
104     ("LA", weekday::SUN),
105     ("LB", weekday::MON),
106     ("LI", weekday::MON),
107     ("LK", weekday::MON),
108     ("LT", weekday::MON),
109     ("LU", weekday::MON),
110     ("LV", weekday::MON),
111     ("LY", weekday::SAT),
112     ("MC", weekday::MON),
113     ("MD", weekday::MON),
114     ("ME", weekday::MON),
115     ("MH", weekday::SUN),
116     ("MK", weekday::MON),
117     ("MM", weekday::SUN),
118     ("MN", weekday::MON),
119     ("MO", weekday::SUN),
120     ("MQ", weekday::MON),
121     ("MT", weekday::SUN),
122     ("MV", weekday::FRI),
123     ("MX", weekday::SUN),
124     ("MY", weekday::MON),
125     ("MZ", weekday::SUN),
126     ("NI", weekday::SUN),
127     ("NL", weekday::MON),
128     ("NO", weekday::MON),
129     ("NP", weekday::SUN),
130     ("NZ", weekday::MON),
131     ("OM", weekday::SAT),
132     ("PA", weekday::SUN),
133     ("PE", weekday::SUN),
134     ("PH", weekday::SUN),
135     ("PK", weekday::SUN),
136     ("PL", weekday::MON),
137     ("PR", weekday::SUN),
138     ("PT", weekday::SUN),
139     ("PY", weekday::SUN),
140     ("QA", weekday::SAT),
141     ("RE", weekday::MON),
142     ("RO", weekday::MON),
143     ("RS", weekday::MON),
144     ("RU", weekday::MON),
145     ("SA", weekday::SUN),
146     ("SD", weekday::SAT),
147     ("SE", weekday::MON),
148     ("SG", weekday::SUN),
149     ("SI", weekday::MON),
150     ("SK", weekday::MON),
151     ("SM", weekday::MON),
152     ("SV", weekday::SUN),
153     ("SY", weekday::SAT),
154     ("TH", weekday::SUN),
155     ("TJ", weekday::MON),
156     ("TM", weekday::MON),
157     ("TR", weekday::MON),
158     ("TT", weekday::SUN),
159     ("TW", weekday::SUN),
160     ("UA", weekday::MON),
161     ("UM", weekday::SUN),
162     ("US", weekday::SUN),
163     ("UY", weekday::MON),
164     ("UZ", weekday::MON),
165     ("VA", weekday::MON),
166     ("VE", weekday::SUN),
167     ("VI", weekday::SUN),
168     ("VN", weekday::MON),
169     ("WS", weekday::SUN),
170     ("XK", weekday::MON),
171     ("YE", weekday::SUN),
172     ("ZA", weekday::SUN),
173     ("ZW", weekday::SUN),
174 ];
175 static TRIE: ZeroTrieSimpleAscii<[u8; 539]> = ZeroTrieSimpleAscii::from_sorted_str_tuples(DATA);
176 
177 static TRIE_PHF: ZeroTriePerfectHash<[u8; 567]> = ZeroTriePerfectHash::from_store([
178     225, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 0, 15, 0,
179     81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 79, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, 74, 48, 76,
180     78, 77, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
181     14, 41, 59, 74, 86, 88, 90, 92, 98, 100, 142, 181, 208, 226, 241, 253, 31, 43, 67, 85, 94, 97,
182     121, 136, 178, 65, 134, 196, 69, 79, 83, 85, 1, 2, 3, 129, 129, 129, 129, 201, 65, 68, 69, 71,
183     73, 75, 77, 86, 89, 1, 2, 3, 4, 5, 6, 7, 8, 135, 134, 129, 135, 129, 129, 129, 135, 134, 198,
184     72, 74, 77, 82, 84, 87, 1, 2, 3, 4, 5, 135, 129, 129, 129, 135, 135, 197, 65, 77, 83, 89, 90,
185     1, 2, 3, 4, 129, 135, 135, 129, 129, 196, 65, 69, 73, 78, 1, 2, 3, 129, 135, 135, 129, 83, 135,
186     75, 129, 69, 135, 194, 65, 87, 1, 135, 135, 77, 134, 206, 68, 69, 70, 71, 73, 76, 77, 78, 82,
187     83, 84, 85, 88, 90, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 129, 134, 134, 135, 129, 129,
188     129, 129, 129, 135, 129, 129, 129, 129, 205, 65, 68, 69, 71, 72, 77, 78, 82, 83, 84, 87, 89,
189     90, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 129, 135, 129, 129, 134, 129, 129, 135, 135, 135,
190     135, 129, 135, 201, 65, 72, 76, 77, 78, 79, 82, 89, 90, 1, 2, 3, 4, 5, 6, 7, 8, 135, 129, 129,
191     129, 135, 135, 129, 129, 129, 198, 69, 74, 75, 77, 79, 90, 1, 2, 3, 4, 5, 129, 134, 129, 135,
192     135, 134, 197, 67, 69, 71, 83, 84, 1, 2, 3, 4, 129, 129, 134, 129, 135, 196, 73, 74, 79, 82, 1,
193     2, 3, 129, 129, 129, 129, 199, 66, 69, 70, 80, 82, 84, 85, 14, 15, 16, 17, 18, 19, 129, 45, 97,
194     108, 116, 45, 118, 97, 114, 105, 97, 110, 116, 135, 129, 129, 129, 129, 135, 135, 196, 75, 78,
195     82, 85, 1, 2, 3, 135, 135, 129, 129, 200, 68, 69, 76, 78, 81, 82, 83, 84, 1, 2, 3, 4, 5, 6, 7,
196     135, 129, 135, 135, 134, 134, 129, 129, 198, 69, 71, 72, 82, 87, 90, 1, 2, 3, 4, 5, 135, 129,
197     135, 135, 134, 129, 195, 77, 79, 80, 1, 2, 135, 134, 135, 48, 49, 129, 200, 65, 66, 73, 75, 84,
198     85, 86, 89, 1, 2, 3, 4, 5, 6, 7, 135, 129, 129, 129, 129, 129, 129, 134, 197, 73, 76, 79, 80,
199     90, 1, 2, 3, 4, 135, 129, 129, 135, 129, 206, 67, 68, 69, 72, 75, 77, 78, 79, 81, 84, 86, 88,
200     89, 90, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 129, 129, 129, 135, 129, 135, 129, 135, 129,
201     135, 133, 135, 129, 135, 200, 65, 69, 72, 75, 76, 82, 84, 89, 1, 2, 3, 4, 5, 6, 7, 135, 135,
202     135, 135, 129, 135, 135, 135,
203 ]);
204 
black_box<T>(dummy: T) -> T205 fn black_box<T>(dummy: T) -> T {
206     unsafe {
207         let ret = std::ptr::read_volatile(&dummy);
208         std::mem::forget(dummy);
209         ret
210     }
211 }
212 
main()213 fn main() {
214     // Un-comment to re-generate the bytes (printed to the terminal)
215     // let trie_phf = DATA.iter().copied().collect::<ZeroTriePerfectHash<Vec<_>>>();
216     // assert_eq!(trie_phf.as_bytes(), TRIE_PHF.as_bytes());
217 
218     assert_eq!(black_box(TRIE_PHF).get(b"MV"), Some(weekday::FRI));
219 }
220