@@ -59,7 +59,7 @@ benches! {
59
59
}
60
60
}
61
61
62
- fn case02_lookup ( bytes: & mut [ u8 ] ) {
62
+ fn case02_lookup_table ( bytes: & mut [ u8 ] ) {
63
63
for byte in bytes {
64
64
* byte = ASCII_UPPERCASE_MAP [ * byte as usize ]
65
65
}
@@ -141,6 +141,55 @@ benches! {
141
141
}
142
142
}
143
143
144
+ fn case09_mask_mult_bool_branchy_lookup_table( bytes: & mut [ u8 ] ) {
145
+ fn is_ascii_lowercase( b: u8 ) -> bool {
146
+ if b >= 0x80 { return false }
147
+ match ASCII_CHARACTER_CLASS [ b as usize ] {
148
+ L | Lx => true ,
149
+ _ => false ,
150
+ }
151
+ }
152
+ for byte in bytes {
153
+ * byte &= !( 0x20 * ( is_ascii_lowercase( * byte) as u8 ) )
154
+ }
155
+ }
156
+
157
+ fn case10_mask_mult_bool_lookup_table( bytes: & mut [ u8 ] ) {
158
+ fn is_ascii_lowercase( b: u8 ) -> bool {
159
+ match ASCII_CHARACTER_CLASS [ b as usize ] {
160
+ L | Lx => true ,
161
+ _ => false
162
+ }
163
+ }
164
+ for byte in bytes {
165
+ * byte &= !( 0x20 * ( is_ascii_lowercase( * byte) as u8 ) )
166
+ }
167
+ }
168
+
169
+ fn case11_mask_mult_bool_match_range( bytes: & mut [ u8 ] ) {
170
+ fn is_ascii_lowercase( b: u8 ) -> bool {
171
+ match b {
172
+ b'a' ...b'z' => true ,
173
+ _ => false
174
+ }
175
+ }
176
+ for byte in bytes {
177
+ * byte &= !( 0x20 * ( is_ascii_lowercase( * byte) as u8 ) )
178
+ }
179
+ }
180
+
181
+ fn case12_mask_shifted_bool_match_range( bytes: & mut [ u8 ] ) {
182
+ fn is_ascii_lowercase( b: u8 ) -> bool {
183
+ match b {
184
+ b'a' ...b'z' => true ,
185
+ _ => false
186
+ }
187
+ }
188
+ for byte in bytes {
189
+ * byte &= !( ( is_ascii_lowercase( * byte) as u8 ) << 5 )
190
+ }
191
+ }
192
+
144
193
@iter
145
194
146
195
is_ascii,
@@ -219,3 +268,36 @@ const ASCII_UPPERCASE_MAP: [u8; 256] = [
219
268
0xf8 , 0xf9 , 0xfa , 0xfb , 0xfc , 0xfd , 0xfe , 0xff ,
220
269
] ;
221
270
271
+ enum AsciiCharacterClass {
272
+ C , // control
273
+ Cw , // control whitespace
274
+ W , // whitespace
275
+ D , // digit
276
+ L , // lowercase
277
+ Lx , // lowercase hex digit
278
+ U , // uppercase
279
+ Ux , // uppercase hex digit
280
+ P , // punctuation
281
+ N , // Non-ASCII
282
+ }
283
+ use self :: AsciiCharacterClass :: * ;
284
+
285
+ static ASCII_CHARACTER_CLASS : [ AsciiCharacterClass ; 256 ] = [
286
+ // _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _a _b _c _d _e _f
287
+ C , C , C , C , C , C , C , C , C , Cw , Cw , C , Cw , Cw , C , C , // 0_
288
+ C , C , C , C , C , C , C , C , C , C , C , C , C , C , C , C , // 1_
289
+ W , P , P , P , P , P , P , P , P , P , P , P , P , P , P , P , // 2_
290
+ D , D , D , D , D , D , D , D , D , D , P , P , P , P , P , P , // 3_
291
+ P , Ux , Ux , Ux , Ux , Ux , Ux , U , U , U , U , U , U , U , U , U , // 4_
292
+ U , U , U , U , U , U , U , U , U , U , U , P , P , P , P , P , // 5_
293
+ P , Lx , Lx , Lx , Lx , Lx , Lx , L , L , L , L , L , L , L , L , L , // 6_
294
+ L , L , L , L , L , L , L , L , L , L , L , P , P , P , P , C , // 7_
295
+ N , N , N , N , N , N , N , N , N , N , N , N , N , N , N , N ,
296
+ N , N , N , N , N , N , N , N , N , N , N , N , N , N , N , N ,
297
+ N , N , N , N , N , N , N , N , N , N , N , N , N , N , N , N ,
298
+ N , N , N , N , N , N , N , N , N , N , N , N , N , N , N , N ,
299
+ N , N , N , N , N , N , N , N , N , N , N , N , N , N , N , N ,
300
+ N , N , N , N , N , N , N , N , N , N , N , N , N , N , N , N ,
301
+ N , N , N , N , N , N , N , N , N , N , N , N , N , N , N , N ,
302
+ N , N , N , N , N , N , N , N , N , N , N , N , N , N , N , N ,
303
+ ] ;
0 commit comments