// 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 + ops::AddAssign + ops::Sub + ops::SubAssign + ops::Mul + ops::MulAssign + ops::Div + ops::DivAssign + ops::Rem + ops::RemAssign + ops::BitAnd + ops::BitAndAssign + ops::BitOr + ops::BitOrAssign + ops::BitXor + ops::BitXorAssign + ops::Shl + ops::ShlAssign + ops::Shr + ops::ShrAssign + 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 );