#[allow(clippy::wrong_self_convention)]
pub trait ShiftAmount: Copy {
fn as_u32(self) -> u32;
}
impl ShiftAmount for u8 {
#[inline]
fn as_u32(self) -> u32 {
u32::from(self)
}
}
impl ShiftAmount for &u8 {
#[inline]
fn as_u32(self) -> u32 {
u32::from(*self)
}
}
impl ShiftAmount for u16 {
#[inline]
fn as_u32(self) -> u32 {
u32::from(self)
}
}
impl ShiftAmount for &u16 {
#[inline]
fn as_u32(self) -> u32 {
u32::from(*self)
}
}
impl ShiftAmount for u32 {
#[inline]
fn as_u32(self) -> u32 {
self
}
}
impl ShiftAmount for &u32 {
#[inline]
fn as_u32(self) -> u32 {
*self
}
}
impl ShiftAmount for u64 {
#[inline]
#[allow(clippy::cast_possible_truncation)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &u64 {
#[inline]
#[allow(clippy::cast_possible_truncation)]
fn as_u32(self) -> u32 {
*self as u32
}
}
impl ShiftAmount for u128 {
#[inline]
#[allow(clippy::cast_possible_truncation)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &u128 {
#[inline]
#[allow(clippy::cast_possible_truncation)]
fn as_u32(self) -> u32 {
*self as u32
}
}
impl ShiftAmount for usize {
#[inline]
#[allow(clippy::cast_possible_truncation)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &usize {
#[inline]
#[allow(clippy::cast_possible_truncation)]
fn as_u32(self) -> u32 {
*self as u32
}
}
impl ShiftAmount for i8 {
#[inline]
#[allow(clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &i8 {
#[inline]
#[allow(clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
*self as u32
}
}
impl ShiftAmount for i16 {
#[inline]
#[allow(clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &i16 {
#[inline]
#[allow(clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
*self as u32
}
}
impl ShiftAmount for i32 {
#[inline]
#[allow(clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &i32 {
#[inline]
#[allow(clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
*self as u32
}
}
impl ShiftAmount for i64 {
#[inline]
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &i64 {
#[inline]
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
*self as u32
}
}
impl ShiftAmount for i128 {
#[inline]
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &i128 {
#[inline]
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
*self as u32
}
}
impl ShiftAmount for isize {
#[inline]
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
self as u32
}
}
impl ShiftAmount for &isize {
#[inline]
#[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)]
fn as_u32(self) -> u32 {
*self as u32
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn u8_converts_correctly() {
assert_eq!(0u8.as_u32(), 0);
assert_eq!(4u8.as_u32(), 4);
assert_eq!(u8::MAX.as_u32(), 255);
}
#[test]
fn u16_converts_correctly() {
assert_eq!(0u16.as_u32(), 0);
assert_eq!(4u16.as_u32(), 4);
assert_eq!(u16::MAX.as_u32(), 65535);
}
#[test]
fn u32_identity() {
assert_eq!(0u32.as_u32(), 0);
assert_eq!(4u32.as_u32(), 4);
assert_eq!(u32::MAX.as_u32(), u32::MAX);
}
#[test]
fn u64_truncates() {
assert_eq!(0u64.as_u32(), 0);
assert_eq!(4u64.as_u32(), 4);
assert_eq!((u64::from(u32::MAX) + 1).as_u32(), 0);
}
#[test]
fn u128_truncates() {
assert_eq!(0u128.as_u32(), 0);
assert_eq!(4u128.as_u32(), 4);
assert_eq!((u128::from(u32::MAX) + 1).as_u32(), 0);
}
#[test]
fn usize_converts() {
assert_eq!(0usize.as_u32(), 0);
assert_eq!(4usize.as_u32(), 4);
assert_eq!(127usize.as_u32(), 127);
}
#[test]
fn i8_converts() {
assert_eq!(0i8.as_u32(), 0);
assert_eq!(4i8.as_u32(), 4);
assert_eq!(i8::MAX.as_u32(), 127);
assert_eq!((-1i8).as_u32(), u32::MAX);
}
#[test]
fn i16_converts() {
assert_eq!(0i16.as_u32(), 0);
assert_eq!(4i16.as_u32(), 4);
}
#[test]
fn i32_converts() {
assert_eq!(0i32.as_u32(), 0);
assert_eq!(4i32.as_u32(), 4);
assert_eq!(i32::MAX.as_u32(), i32::MAX as u32);
}
#[test]
fn i64_converts() {
assert_eq!(0i64.as_u32(), 0);
assert_eq!(4i64.as_u32(), 4);
}
#[test]
fn i128_converts() {
assert_eq!(0i128.as_u32(), 0);
assert_eq!(4i128.as_u32(), 4);
}
#[test]
fn isize_converts() {
assert_eq!(0isize.as_u32(), 0);
assert_eq!(4isize.as_u32(), 4);
}
#[test]
fn reference_variants_match_owned() {
let u = 42u32;
assert_eq!(u.as_u32(), (&u).as_u32());
let i = 42i32;
assert_eq!(i.as_u32(), (&i).as_u32());
let big = 42u64;
assert_eq!(big.as_u32(), (&big).as_u32());
}
#[test]
#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
fn common_shift_amounts() {
for shift in 0u32..=127 {
assert_eq!(shift.as_u32(), shift);
assert_eq!((shift as u8).as_u32(), shift);
assert_eq!((shift as i32).as_u32(), shift);
}
}
#[test]
fn shift_amounts_beyond_127_work() {
assert_eq!(128u32.as_u32(), 128);
assert_eq!(256u32.as_u32(), 256);
}
}