feat(core): Add implementations for unbounded_shl/unbounded_shr · patricklam/verify-rust-std@700af56 (original) (raw)

`@@ -1312,6 +1312,33 @@ macro_rules! int_impl {

`

1312

1312

`}

`

1313

1313

`}

`

1314

1314

``

``

1315

`` +

/// Unbounded shift left. Computes self << rhs, without bounding the value of rhs

``

``

1316

`+

///

`

``

1317

`` +

/// If rhs is larger or equal to the number of bits in self,

``

``

1318

`` +

/// the entire value is shifted out, and 0 is returned.

``

``

1319

`+

///

`

``

1320

`+

/// # Examples

`

``

1321

`+

///

`

``

1322

`+

/// Basic usage:

`

``

1323


/// ```

``

1324

`+

#[doc = concat!("assert_eq!(0x1", stringify!($SelfT), ".unbounded_shl(4), 0x10);")]

`

``

1325

`+

#[doc = concat!("assert_eq!(0x1", stringify!($SelfT), ".unbounded_shl(129), 0);")]

`

``

1326


/// ```

``

1327

`+

#[unstable(feature = "unbounded_shifts", issue = "129375")]

`

``

1328

`+

#[rustc_allow_const_fn_unstable(unchecked_shifts)]

`

``

1329

`+

#[must_use = "this returns the result of the operation, \

`

``

1330

`+

without modifying the original"]

`

``

1331

`+

#[inline]

`

``

1332

`+

pub const fn unbounded_shl(self, v: u32) -> $SelfT{

`

``

1333

`+

if v < Self::BITS{

`

``

1334

`+

// SAFETY:

`

``

1335

`+

// v is just checked to be in-range above

`

``

1336

`+

unsafe{self.unchecked_shl(v)}

`

``

1337

`+

}else{

`

``

1338

`+

0

`

``

1339

`+

}

`

``

1340

`+

}

`

``

1341

+

1315

1342

`` /// Checked shift right. Computes self >> rhs, returning None if rhs is

``

1316

1343

`` /// larger than or equal to the number of bits in self.

``

1317

1344

`///

`

`@@ -1410,6 +1437,39 @@ macro_rules! int_impl {

`

1410

1437

`}

`

1411

1438

`}

`

1412

1439

``

``

1440

`` +

/// Unbounded shift right. Computes self >> rhs, without bounding the value of rhs

``

``

1441

`+

///

`

``

1442

`` +

/// If rhs is larger or equal to the number of bits in self,

``

``

1443

`` +

/// the entire value is shifted out, which yields 0 for a positive number,

``

``

1444

`` +

/// and -1 for a negative number.

``

``

1445

`+

///

`

``

1446

`+

/// # Examples

`

``

1447

`+

///

`

``

1448

`+

/// Basic usage:

`

``

1449


/// ```

``

1450

`+

#[doc = concat!("assert_eq!(0x10", stringify!($SelfT), ".unbounded_shl(4), 0x1);")]

`

``

1451

`+

#[doc = concat!("assert_eq!(0x10", stringify!($SelfT), ".unbounded_shr(129), 0);")]

`

``

1452

`+

#[doc = concat!("assert_eq!(", stringify!($SelfT), "::MIN.unbounded_shr(129), -1);")]

`

``

1453


/// ```

``

1454

`+

#[unstable(feature = "unbounded_shifts", issue = "129375")]

`

``

1455

`+

#[rustc_allow_const_fn_unstable(unchecked_shifts)]

`

``

1456

`+

#[must_use = "this returns the result of the operation, \

`

``

1457

`+

without modifying the original"]

`

``

1458

`+

#[inline]

`

``

1459

`+

pub const fn unbounded_shr(self, v: u32) -> $SelfT{

`

``

1460

`+

if v < Self::BITS{

`

``

1461

`+

// SAFETY:

`

``

1462

`+

// v is just checked to be in-range above

`

``

1463

`+

unsafe{self.unchecked_shr(v)}

`

``

1464

`+

}else{

`

``

1465

`` +

// A shift by Self::BITS-1 suffices for signed integers, because the sign bit is copied for each of the shifted bits.

``

``

1466

+

``

1467

`+

// SAFETY:

`

``

1468

`` +

// Self::BITS-1 is guaranteed to be less than Self::BITS

``

``

1469

`+

unsafe{self.unchecked_shr(Self::BITS - 1)}

`

``

1470

`+

}

`

``

1471

`+

}

`

``

1472

+

1413

1473

`` /// Checked absolute value. Computes self.abs(), returning None if

``

1414

1474

`` /// self == MIN.

``

1415

1475

`///

`