@@ -3794,7 +3794,39 @@ impl u8 {
3794
3794
#[ stable( feature = "ascii_methods_on_intrinsics" , since = "1.23.0" ) ]
3795
3795
#[ inline]
3796
3796
pub fn to_ascii_uppercase ( & self ) -> u8 {
3797
- ASCII_UPPERCASE_MAP [ * self as usize ]
3797
+ // See benchmarks in src/libcore/benches/ascii_case.rs
3798
+
3799
+ // Lower-case ASCII 'a' is the first byte that has its highest bit set
3800
+ // after wrap-adding 0x1F:
3801
+ //
3802
+ // b'a' + 0x1F == 0x80 == 0b1000_0000
3803
+ // b'z' + 0x1F == 0x98 == 0b10011000
3804
+ //
3805
+ // Lower-case ASCII 'z' is the last byte that has its highest bit unset
3806
+ // after wrap-adding 0x05:
3807
+ //
3808
+ // b'a' + 0x05 == 0x66 == 0b0110_0110
3809
+ // b'z' + 0x05 == 0x7F == 0b0111_1111
3810
+ //
3811
+ // … except for 0xFB to 0xFF, but those are in the range of bytes
3812
+ // that have the highest bit unset again after adding 0x1F.
3813
+ //
3814
+ // So `(byte + 0x1f) & !(byte + 5)` has its highest bit set
3815
+ // iff `byte` is a lower-case ASCII letter.
3816
+ //
3817
+ // Lower-case ASCII letters all have the 0x20 bit set.
3818
+ // (Two positions right of 0x80, the highest bit.)
3819
+ // Unsetting that bit produces the same letter, in upper-case.
3820
+ //
3821
+ // Therefore:
3822
+ * self &
3823
+ !(
3824
+ (
3825
+ self . wrapping_add ( 0x1f ) &
3826
+ !self . wrapping_add ( 0x05 ) &
3827
+ 0x80
3828
+ ) >> 2
3829
+ )
3798
3830
}
3799
3831
3800
3832
/// Makes a copy of the value in its ASCII lower case equivalent.
@@ -3816,7 +3848,15 @@ impl u8 {
3816
3848
#[ stable( feature = "ascii_methods_on_intrinsics" , since = "1.23.0" ) ]
3817
3849
#[ inline]
3818
3850
pub fn to_ascii_lowercase ( & self ) -> u8 {
3819
- ASCII_LOWERCASE_MAP [ * self as usize ]
3851
+ // See comments in to_ascii_uppercase above.
3852
+ * self |
3853
+ (
3854
+ (
3855
+ self . wrapping_add ( 0x3f ) &
3856
+ !self . wrapping_add ( 0x25 ) &
3857
+ 0x80
3858
+ ) >> 2
3859
+ )
3820
3860
}
3821
3861
3822
3862
/// Checks that two values are an ASCII case-insensitive match.
@@ -4940,84 +4980,6 @@ impl_from! { u32, f64, #[stable(feature = "lossless_float_conv", since = "1.6.0"
4940
4980
// Float -> Float
4941
4981
impl_from ! { f32 , f64 , #[ stable( feature = "lossless_float_conv" , since = "1.6.0" ) ] }
4942
4982
4943
- static ASCII_LOWERCASE_MAP : [ u8 ; 256 ] = [
4944
- 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
4945
- 0x08 , 0x09 , 0x0a , 0x0b , 0x0c , 0x0d , 0x0e , 0x0f ,
4946
- 0x10 , 0x11 , 0x12 , 0x13 , 0x14 , 0x15 , 0x16 , 0x17 ,
4947
- 0x18 , 0x19 , 0x1a , 0x1b , 0x1c , 0x1d , 0x1e , 0x1f ,
4948
- b' ' , b'!' , b'"' , b'#' , b'$' , b'%' , b'&' , b'\'' ,
4949
- b'(' , b')' , b'*' , b'+' , b',' , b'-' , b'.' , b'/' ,
4950
- b'0' , b'1' , b'2' , b'3' , b'4' , b'5' , b'6' , b'7' ,
4951
- b'8' , b'9' , b':' , b';' , b'<' , b'=' , b'>' , b'?' ,
4952
- b'@' ,
4953
-
4954
- b'a' , b'b' , b'c' , b'd' , b'e' , b'f' , b'g' ,
4955
- b'h' , b'i' , b'j' , b'k' , b'l' , b'm' , b'n' , b'o' ,
4956
- b'p' , b'q' , b'r' , b's' , b't' , b'u' , b'v' , b'w' ,
4957
- b'x' , b'y' , b'z' ,
4958
-
4959
- b'[' , b'\\' , b']' , b'^' , b'_' ,
4960
- b'`' , b'a' , b'b' , b'c' , b'd' , b'e' , b'f' , b'g' ,
4961
- b'h' , b'i' , b'j' , b'k' , b'l' , b'm' , b'n' , b'o' ,
4962
- b'p' , b'q' , b'r' , b's' , b't' , b'u' , b'v' , b'w' ,
4963
- b'x' , b'y' , b'z' , b'{' , b'|' , b'}' , b'~' , 0x7f ,
4964
- 0x80 , 0x81 , 0x82 , 0x83 , 0x84 , 0x85 , 0x86 , 0x87 ,
4965
- 0x88 , 0x89 , 0x8a , 0x8b , 0x8c , 0x8d , 0x8e , 0x8f ,
4966
- 0x90 , 0x91 , 0x92 , 0x93 , 0x94 , 0x95 , 0x96 , 0x97 ,
4967
- 0x98 , 0x99 , 0x9a , 0x9b , 0x9c , 0x9d , 0x9e , 0x9f ,
4968
- 0xa0 , 0xa1 , 0xa2 , 0xa3 , 0xa4 , 0xa5 , 0xa6 , 0xa7 ,
4969
- 0xa8 , 0xa9 , 0xaa , 0xab , 0xac , 0xad , 0xae , 0xaf ,
4970
- 0xb0 , 0xb1 , 0xb2 , 0xb3 , 0xb4 , 0xb5 , 0xb6 , 0xb7 ,
4971
- 0xb8 , 0xb9 , 0xba , 0xbb , 0xbc , 0xbd , 0xbe , 0xbf ,
4972
- 0xc0 , 0xc1 , 0xc2 , 0xc3 , 0xc4 , 0xc5 , 0xc6 , 0xc7 ,
4973
- 0xc8 , 0xc9 , 0xca , 0xcb , 0xcc , 0xcd , 0xce , 0xcf ,
4974
- 0xd0 , 0xd1 , 0xd2 , 0xd3 , 0xd4 , 0xd5 , 0xd6 , 0xd7 ,
4975
- 0xd8 , 0xd9 , 0xda , 0xdb , 0xdc , 0xdd , 0xde , 0xdf ,
4976
- 0xe0 , 0xe1 , 0xe2 , 0xe3 , 0xe4 , 0xe5 , 0xe6 , 0xe7 ,
4977
- 0xe8 , 0xe9 , 0xea , 0xeb , 0xec , 0xed , 0xee , 0xef ,
4978
- 0xf0 , 0xf1 , 0xf2 , 0xf3 , 0xf4 , 0xf5 , 0xf6 , 0xf7 ,
4979
- 0xf8 , 0xf9 , 0xfa , 0xfb , 0xfc , 0xfd , 0xfe , 0xff ,
4980
- ] ;
4981
-
4982
- static ASCII_UPPERCASE_MAP : [ u8 ; 256 ] = [
4983
- 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
4984
- 0x08 , 0x09 , 0x0a , 0x0b , 0x0c , 0x0d , 0x0e , 0x0f ,
4985
- 0x10 , 0x11 , 0x12 , 0x13 , 0x14 , 0x15 , 0x16 , 0x17 ,
4986
- 0x18 , 0x19 , 0x1a , 0x1b , 0x1c , 0x1d , 0x1e , 0x1f ,
4987
- b' ' , b'!' , b'"' , b'#' , b'$' , b'%' , b'&' , b'\'' ,
4988
- b'(' , b')' , b'*' , b'+' , b',' , b'-' , b'.' , b'/' ,
4989
- b'0' , b'1' , b'2' , b'3' , b'4' , b'5' , b'6' , b'7' ,
4990
- b'8' , b'9' , b':' , b';' , b'<' , b'=' , b'>' , b'?' ,
4991
- b'@' , b'A' , b'B' , b'C' , b'D' , b'E' , b'F' , b'G' ,
4992
- b'H' , b'I' , b'J' , b'K' , b'L' , b'M' , b'N' , b'O' ,
4993
- b'P' , b'Q' , b'R' , b'S' , b'T' , b'U' , b'V' , b'W' ,
4994
- b'X' , b'Y' , b'Z' , b'[' , b'\\' , b']' , b'^' , b'_' ,
4995
- b'`' ,
4996
-
4997
- b'A' , b'B' , b'C' , b'D' , b'E' , b'F' , b'G' ,
4998
- b'H' , b'I' , b'J' , b'K' , b'L' , b'M' , b'N' , b'O' ,
4999
- b'P' , b'Q' , b'R' , b'S' , b'T' , b'U' , b'V' , b'W' ,
5000
- b'X' , b'Y' , b'Z' ,
5001
-
5002
- b'{' , b'|' , b'}' , b'~' , 0x7f ,
5003
- 0x80 , 0x81 , 0x82 , 0x83 , 0x84 , 0x85 , 0x86 , 0x87 ,
5004
- 0x88 , 0x89 , 0x8a , 0x8b , 0x8c , 0x8d , 0x8e , 0x8f ,
5005
- 0x90 , 0x91 , 0x92 , 0x93 , 0x94 , 0x95 , 0x96 , 0x97 ,
5006
- 0x98 , 0x99 , 0x9a , 0x9b , 0x9c , 0x9d , 0x9e , 0x9f ,
5007
- 0xa0 , 0xa1 , 0xa2 , 0xa3 , 0xa4 , 0xa5 , 0xa6 , 0xa7 ,
5008
- 0xa8 , 0xa9 , 0xaa , 0xab , 0xac , 0xad , 0xae , 0xaf ,
5009
- 0xb0 , 0xb1 , 0xb2 , 0xb3 , 0xb4 , 0xb5 , 0xb6 , 0xb7 ,
5010
- 0xb8 , 0xb9 , 0xba , 0xbb , 0xbc , 0xbd , 0xbe , 0xbf ,
5011
- 0xc0 , 0xc1 , 0xc2 , 0xc3 , 0xc4 , 0xc5 , 0xc6 , 0xc7 ,
5012
- 0xc8 , 0xc9 , 0xca , 0xcb , 0xcc , 0xcd , 0xce , 0xcf ,
5013
- 0xd0 , 0xd1 , 0xd2 , 0xd3 , 0xd4 , 0xd5 , 0xd6 , 0xd7 ,
5014
- 0xd8 , 0xd9 , 0xda , 0xdb , 0xdc , 0xdd , 0xde , 0xdf ,
5015
- 0xe0 , 0xe1 , 0xe2 , 0xe3 , 0xe4 , 0xe5 , 0xe6 , 0xe7 ,
5016
- 0xe8 , 0xe9 , 0xea , 0xeb , 0xec , 0xed , 0xee , 0xef ,
5017
- 0xf0 , 0xf1 , 0xf2 , 0xf3 , 0xf4 , 0xf5 , 0xf6 , 0xf7 ,
5018
- 0xf8 , 0xf9 , 0xfa , 0xfb , 0xfc , 0xfd , 0xfe , 0xff ,
5019
- ] ;
5020
-
5021
4983
enum AsciiCharacterClass {
5022
4984
C , // control
5023
4985
Cw , // control whitespace
0 commit comments