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