mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 07:54:36 -05:00
Introduce the `num` module, which will provide numerical extensions and utilities for the kernel. For now, introduce the `Integer` trait, which is implemented for all primitive integer types to provides their core properties to generic code. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/20251108-bounded_ints-v4-1-c9342ac7ebd1@nvidia.com Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
77 lines
1.5 KiB
Rust
77 lines
1.5 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Additional numerical features for the kernel.
|
|
|
|
use core::ops;
|
|
|
|
/// 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
|
|
);
|