| // 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 | |
| ); |