mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Add the `Bounded` integer wrapper type, which restricts the number of bits allowed to represent of value. This is useful to e.g. enforce guarantees when working with bitfields that have an arbitrary number of bits. Alongside this type, provide many `From` and `TryFrom` implementations are to reduce friction when using with regular integer types. Proxy implementations of common integer operations are also provided. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/20251108-bounded_ints-v4-2-c9342ac7ebd1@nvidia.com [ Added intra-doc link. Fixed a few other nits. - Miguel ] Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
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
|
|
);
|