]> git.lizzy.rs Git - rust.git/commitdiff
Simpler way to convert to digit
authorGiles Cope <gilescope@gmail.com>
Sun, 14 Feb 2021 11:34:22 +0000 (11:34 +0000)
committerGiles Cope <gilescope@gmail.com>
Sun, 14 Feb 2021 17:06:16 +0000 (17:06 +0000)
library/core/src/char/methods.rs

index e450240527aa5e28620e54f4e497bbde67522a59..d92df5532e589b027732c4b77b4462e9ed9a3c58 100644 (file)
@@ -1,5 +1,6 @@
 //! impl char {}
 
+use crate::intrinsics::likely;
 use crate::slice;
 use crate::str::from_utf8_unchecked_mut;
 use crate::unicode::printable::is_printable;
@@ -330,16 +331,14 @@ pub fn is_digit(self, radix: u32) -> bool {
     #[stable(feature = "rust1", since = "1.0.0")]
     #[inline]
     pub fn to_digit(self, radix: u32) -> Option<u32> {
+        assert!(radix <= 36, "to_digit: radix is too high (maximum 36)");
+        const ASCII_DIGIT_MASK: u32 = 0b11_0000;
         // the code is split up here to improve execution speed for cases where
         // the `radix` is constant and 10 or smaller
-        let val = if radix <= 10 {
-            match self {
-                '0'..='9' => self as u32 - '0' as u32,
-                _ => return None,
-            }
+        let val = if likely(radix <= 10) {
+            // If not a digit, a number greater than radix will be created.
+            self as u32 ^ ASCII_DIGIT_MASK
         } else {
-            assert!(radix <= 36, "to_digit: radix is too high (maximum 36)");
-
             match self {
                 '0'..='9' => self as u32 - '0' as u32,
                 'a'..='z' => self as u32 - 'a' as u32 + 10,