mirror of https://github.com/torvalds/linux.git
80 lines
1.6 KiB
Rust
80 lines
1.6 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Additional numerical features for the kernel.
|
|
|
|
use core::ops;
|
|
|
|
pub mod bounded;
|
|
pub use bounded::*;
|
|
|
|
/// Designates unsigned primitive types.
|
|
pub enum Unsigned {}
|
|
|
|
/// Designates signed primitive types.
|
|
pub enum Signed {}
|
|
|
|
/// Describes core properties of integer types.
|
|
pub trait Integer:
|
|
Sized
|
|
+ Copy
|
|
+ Clone
|
|
+ PartialEq
|
|
+ Eq
|
|
+ PartialOrd
|
|
+ Ord
|
|
+ ops::Add<Output = Self>
|
|
+ ops::AddAssign
|
|
+ ops::Sub<Output = Self>
|
|
+ ops::SubAssign
|
|
+ ops::Mul<Output = Self>
|
|
+ ops::MulAssign
|
|
+ ops::Div<Output = Self>
|
|
+ ops::DivAssign
|
|
+ ops::Rem<Output = Self>
|
|
+ ops::RemAssign
|
|
+ ops::BitAnd<Output = Self>
|
|
+ ops::BitAndAssign
|
|
+ ops::BitOr<Output = Self>
|
|
+ ops::BitOrAssign
|
|
+ ops::BitXor<Output = Self>
|
|
+ ops::BitXorAssign
|
|
+ ops::Shl<u32, Output = Self>
|
|
+ ops::ShlAssign<u32>
|
|
+ ops::Shr<u32, Output = Self>
|
|
+ ops::ShrAssign<u32>
|
|
+ ops::Not
|
|
{
|
|
/// Whether this type is [`Signed`] or [`Unsigned`].
|
|
type Signedness;
|
|
|
|
/// Number of bits used for value representation.
|
|
const BITS: u32;
|
|
}
|
|
|
|
macro_rules! impl_integer {
|
|
($($type:ty: $signedness:ty), *) => {
|
|
$(
|
|
impl Integer for $type {
|
|
type Signedness = $signedness;
|
|
|
|
const BITS: u32 = <$type>::BITS;
|
|
}
|
|
)*
|
|
};
|
|
}
|
|
|
|
impl_integer!(
|
|
u8: Unsigned,
|
|
u16: Unsigned,
|
|
u32: Unsigned,
|
|
u64: Unsigned,
|
|
u128: Unsigned,
|
|
usize: Unsigned,
|
|
i8: Signed,
|
|
i16: Signed,
|
|
i32: Signed,
|
|
i64: Signed,
|
|
i128: Signed,
|
|
isize: Signed
|
|
);
|