mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-28 05:34:13 -05:00
rust: add num module and Integer trait
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>
This commit is contained in:
committed by
Miguel Ojeda
parent
e5d330e13f
commit
90f3df4fdf
@@ -109,6 +109,7 @@
|
||||
pub mod mm;
|
||||
#[cfg(CONFIG_NET)]
|
||||
pub mod net;
|
||||
pub mod num;
|
||||
pub mod of;
|
||||
#[cfg(CONFIG_PM_OPP)]
|
||||
pub mod opp;
|
||||
|
||||
76
rust/kernel/num.rs
Normal file
76
rust/kernel/num.rs
Normal file
@@ -0,0 +1,76 @@
|
||||
// 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
|
||||
);
|
||||
Reference in New Issue
Block a user