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