@@ -1322,20 +1322,6 @@ pub enum FpCategory {
1322
1322
Normal ,
1323
1323
}
1324
1324
1325
- macro_rules! from_str_radix_int_impl {
1326
- ( $( $t: ty) * ) => { $(
1327
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
1328
- impl FromStr for $t {
1329
- type Err = ParseIntError ;
1330
- #[ inline]
1331
- fn from_str( src: & str ) -> Result <Self , ParseIntError > {
1332
- <$t>:: from_str_radix( src, 10 )
1333
- }
1334
- }
1335
- ) * }
1336
- }
1337
- from_str_radix_int_impl ! { isize i8 i16 i32 i64 i128 usize u8 u16 u32 u64 u128 }
1338
-
1339
1325
/// Determines if a string of text of that length of that radix could be guaranteed to be
1340
1326
/// stored in the given type T.
1341
1327
/// Note that if the radix is known to the compiler, it is just the check of digits.len that
@@ -1351,18 +1337,58 @@ pub const fn can_not_overflow<T>(radix: u32, is_signed_ty: bool, digits: &[u8])
1351
1337
#[ cfg_attr( feature = "panic_immediate_abort" , inline) ]
1352
1338
#[ cold]
1353
1339
#[ track_caller]
1354
- const fn from_str_radix_panic ( radix : u32 ) -> ! {
1340
+ const fn from_ascii_radix_panic ( radix : u32 ) -> ! {
1355
1341
const_panic ! (
1356
- "from_str_radix_int: must lie in the range `[2, 36]`" ,
1357
- "from_str_radix_int: must lie in the range `[2, 36]` - found {radix}" ,
1342
+ "from_ascii_radix: radix must lie in the range `[2, 36]`" ,
1343
+ "from_ascii_radix: radix must lie in the range `[2, 36]` - found {radix}" ,
1358
1344
radix: u32 = radix,
1359
1345
)
1360
1346
}
1361
1347
1362
- macro_rules! from_str_radix {
1348
+ macro_rules! from_str_int_impl {
1363
1349
( $signedness: ident $( $int_ty: ty) +) => { $(
1350
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
1351
+ impl FromStr for $int_ty {
1352
+ type Err = ParseIntError ;
1353
+
1354
+ /// Parses an integer from a string slice with decimal digits.
1355
+ ///
1356
+ /// The characters are expected to be an optional
1357
+ #[ doc = sign_dependent_expr!{
1358
+ $signedness ?
1359
+ if signed {
1360
+ " `+` or `-` "
1361
+ }
1362
+ if unsigned {
1363
+ " `+` "
1364
+ }
1365
+ } ]
1366
+ /// sign followed by only digits. Leading and trailing non-digit characters (including
1367
+ /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1368
+ /// also represent an error.
1369
+ ///
1370
+ /// # Examples
1371
+ ///
1372
+ /// Basic usage:
1373
+ /// ```
1374
+ /// use std::str::FromStr;
1375
+ ///
1376
+ #[ doc = concat!( "assert_eq!(" , stringify!( $int_ty) , "::from_str(\" +10\" ), Ok(10));" ) ]
1377
+ /// ```
1378
+ /// Trailing space returns error:
1379
+ /// ```
1380
+ /// # use std::str::FromStr;
1381
+ /// #
1382
+ #[ doc = concat!( "assert!(" , stringify!( $int_ty) , "::from_str(\" 1 \" ).is_err());" ) ]
1383
+ /// ```
1384
+ #[ inline]
1385
+ fn from_str( src: & str ) -> Result <$int_ty, ParseIntError > {
1386
+ <$int_ty>:: from_str_radix( src, 10 )
1387
+ }
1388
+ }
1389
+
1364
1390
impl $int_ty {
1365
- /// Converts a string slice in a given base to an integer .
1391
+ /// Parses an integer from a string slice with digits in a given base.
1366
1392
///
1367
1393
/// The string is expected to be an optional
1368
1394
#[ doc = sign_dependent_expr!{
@@ -1375,7 +1401,7 @@ macro_rules! from_str_radix {
1375
1401
}
1376
1402
} ]
1377
1403
/// sign followed by only digits. Leading and trailing non-digit characters (including
1378
- /// whitespace) represent an error. Underscores (which are accepted in rust literals)
1404
+ /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1379
1405
/// also represent an error.
1380
1406
///
1381
1407
/// Digits are a subset of these characters, depending on `radix`:
@@ -1401,11 +1427,92 @@ macro_rules! from_str_radix {
1401
1427
#[ rustc_const_stable( feature = "const_int_from_str" , since = "1.82.0" ) ]
1402
1428
#[ inline]
1403
1429
pub const fn from_str_radix( src: & str , radix: u32 ) -> Result <$int_ty, ParseIntError > {
1430
+ <$int_ty>:: from_ascii_radix( src. as_bytes( ) , radix)
1431
+ }
1432
+
1433
+ /// Parses an integer from an ASCII-byte slice with decimal digits.
1434
+ ///
1435
+ /// The characters are expected to be an optional
1436
+ #[ doc = sign_dependent_expr!{
1437
+ $signedness ?
1438
+ if signed {
1439
+ " `+` or `-` "
1440
+ }
1441
+ if unsigned {
1442
+ " `+` "
1443
+ }
1444
+ } ]
1445
+ /// sign followed by only digits. Leading and trailing non-digit characters (including
1446
+ /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1447
+ /// also represent an error.
1448
+ ///
1449
+ /// # Examples
1450
+ ///
1451
+ /// Basic usage:
1452
+ /// ```
1453
+ /// #![feature(int_from_ascii)]
1454
+ ///
1455
+ #[ doc = concat!( "assert_eq!(" , stringify!( $int_ty) , "::from_ascii(b\" +10\" ), Ok(10));" ) ]
1456
+ /// ```
1457
+ /// Trailing space returns error:
1458
+ /// ```
1459
+ /// # #![feature(int_from_ascii)]
1460
+ /// #
1461
+ #[ doc = concat!( "assert!(" , stringify!( $int_ty) , "::from_ascii(b\" 1 \" ).is_err());" ) ]
1462
+ /// ```
1463
+ #[ unstable( feature = "int_from_ascii" , issue = "134821" ) ]
1464
+ #[ inline]
1465
+ pub const fn from_ascii( src: & [ u8 ] ) -> Result <$int_ty, ParseIntError > {
1466
+ <$int_ty>:: from_ascii_radix( src, 10 )
1467
+ }
1468
+
1469
+ /// Parses an integer from an ASCII-byte slice with digits in a given base.
1470
+ ///
1471
+ /// The characters are expected to be an optional
1472
+ #[ doc = sign_dependent_expr!{
1473
+ $signedness ?
1474
+ if signed {
1475
+ " `+` or `-` "
1476
+ }
1477
+ if unsigned {
1478
+ " `+` "
1479
+ }
1480
+ } ]
1481
+ /// sign followed by only digits. Leading and trailing non-digit characters (including
1482
+ /// whitespace) represent an error. Underscores (which are accepted in Rust literals)
1483
+ /// also represent an error.
1484
+ ///
1485
+ /// Digits are a subset of these characters, depending on `radix`:
1486
+ /// * `0-9`
1487
+ /// * `a-z`
1488
+ /// * `A-Z`
1489
+ ///
1490
+ /// # Panics
1491
+ ///
1492
+ /// This function panics if `radix` is not in the range from 2 to 36.
1493
+ ///
1494
+ /// # Examples
1495
+ ///
1496
+ /// Basic usage:
1497
+ /// ```
1498
+ /// #![feature(int_from_ascii)]
1499
+ ///
1500
+ #[ doc = concat!( "assert_eq!(" , stringify!( $int_ty) , "::from_ascii_radix(b\" A\" , 16), Ok(10));" ) ]
1501
+ /// ```
1502
+ /// Trailing space returns error:
1503
+ /// ```
1504
+ /// # #![feature(int_from_ascii)]
1505
+ /// #
1506
+ #[ doc = concat!( "assert!(" , stringify!( $int_ty) , "::from_ascii_radix(b\" 1 \" , 10).is_err());" ) ]
1507
+ /// ```
1508
+ #[ unstable( feature = "int_from_ascii" , issue = "134821" ) ]
1509
+ #[ inline]
1510
+ pub const fn from_ascii_radix( src: & [ u8 ] , radix: u32 ) -> Result <$int_ty, ParseIntError > {
1404
1511
use self :: IntErrorKind :: * ;
1405
1512
use self :: ParseIntError as PIE ;
1406
1513
1407
1514
if 2 > radix || radix > 36 {
1408
- from_str_radix_panic ( radix) ;
1515
+ from_ascii_radix_panic ( radix) ;
1409
1516
}
1410
1517
1411
1518
if src. is_empty( ) {
@@ -1415,12 +1522,6 @@ macro_rules! from_str_radix {
1415
1522
#[ allow( unused_comparisons) ]
1416
1523
let is_signed_ty = 0 > <$int_ty>:: MIN ;
1417
1524
1418
- // all valid digits are ascii, so we will just iterate over the utf8 bytes
1419
- // and cast them to chars. .to_digit() will safely return None for anything
1420
- // other than a valid ascii digit for the given radix, including the first-byte
1421
- // of multi-byte sequences
1422
- let src = src. as_bytes( ) ;
1423
-
1424
1525
let ( is_positive, mut digits) = match src {
1425
1526
[ b'+' | b'-' ] => {
1426
1527
return Err ( PIE { kind: InvalidDigit } ) ;
@@ -1496,67 +1597,8 @@ macro_rules! from_str_radix {
1496
1597
Ok ( result)
1497
1598
}
1498
1599
}
1499
- ) +}
1500
- }
1501
-
1502
- from_str_radix ! { unsigned u8 u16 u32 u64 u128 }
1503
- from_str_radix ! { signed i8 i16 i32 i64 i128 }
1504
-
1505
- // Re-use the relevant implementation of from_str_radix for isize and usize to avoid outputting two
1506
- // identical functions.
1507
- macro_rules! from_str_radix_size_impl {
1508
- ( $( $signedness: ident $t: ident $size: ty) ,* ) => { $(
1509
- impl $size {
1510
- /// Converts a string slice in a given base to an integer.
1511
- ///
1512
- /// The string is expected to be an optional
1513
- #[ doc = sign_dependent_expr!{
1514
- $signedness ?
1515
- if signed {
1516
- " `+` or `-` "
1517
- }
1518
- if unsigned {
1519
- " `+` "
1520
- }
1521
- } ]
1522
- /// sign followed by only digits. Leading and trailing non-digit characters (including
1523
- /// whitespace) represent an error. Underscores (which are accepted in rust literals)
1524
- /// also represent an error.
1525
- ///
1526
- /// Digits are a subset of these characters, depending on `radix`:
1527
- /// * `0-9`
1528
- /// * `a-z`
1529
- /// * `A-Z`
1530
- ///
1531
- /// # Panics
1532
- ///
1533
- /// This function panics if `radix` is not in the range from 2 to 36.
1534
- ///
1535
- /// # Examples
1536
- ///
1537
- /// Basic usage:
1538
- /// ```
1539
- #[ doc = concat!( "assert_eq!(" , stringify!( $size) , "::from_str_radix(\" A\" , 16), Ok(10));" ) ]
1540
- /// ```
1541
- /// Trailing space returns error:
1542
- /// ```
1543
- #[ doc = concat!( "assert!(" , stringify!( $size) , "::from_str_radix(\" 1 \" , 10).is_err());" ) ]
1544
- /// ```
1545
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
1546
- #[ rustc_const_stable( feature = "const_int_from_str" , since = "1.82.0" ) ]
1547
- #[ inline]
1548
- pub const fn from_str_radix( src: & str , radix: u32 ) -> Result <$size, ParseIntError > {
1549
- match <$t>:: from_str_radix( src, radix) {
1550
- Ok ( x) => Ok ( x as $size) ,
1551
- Err ( e) => Err ( e) ,
1552
- }
1553
- }
1554
- } ) * }
1600
+ ) * }
1555
1601
}
1556
1602
1557
- #[ cfg( target_pointer_width = "16" ) ]
1558
- from_str_radix_size_impl ! { signed i16 isize , unsigned u16 usize }
1559
- #[ cfg( target_pointer_width = "32" ) ]
1560
- from_str_radix_size_impl ! { signed i32 isize , unsigned u32 usize }
1561
- #[ cfg( target_pointer_width = "64" ) ]
1562
- from_str_radix_size_impl ! { signed i64 isize , unsigned u64 usize }
1603
+ from_str_int_impl ! { signed isize i8 i16 i32 i64 i128 }
1604
+ from_str_int_impl ! { unsigned usize u8 u16 u32 u64 u128 }
0 commit comments