xref: /linux/rust/kernel/num.rs (revision 47f27155f17498fccb1f222f79089642337498a9)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 //! Additional numerical features for the kernel.
4 
5 use core::ops;
6 
7 pub mod bounded;
8 pub mod casts;
9 
10 pub use bounded::*;
11 
12 /// Designates unsigned primitive types.
13 pub enum Unsigned {}
14 
15 /// Designates signed primitive types.
16 pub enum Signed {}
17 
18 /// Describes core properties of integer types.
19 pub trait Integer:
20     Sized
21     + Copy
22     + Clone
23     + PartialEq
24     + Eq
25     + PartialOrd
26     + Ord
27     + ops::Add<Output = Self>
28     + ops::AddAssign
29     + ops::Sub<Output = Self>
30     + ops::SubAssign
31     + ops::Mul<Output = Self>
32     + ops::MulAssign
33     + ops::Div<Output = Self>
34     + ops::DivAssign
35     + ops::Rem<Output = Self>
36     + ops::RemAssign
37     + ops::BitAnd<Output = Self>
38     + ops::BitAndAssign
39     + ops::BitOr<Output = Self>
40     + ops::BitOrAssign
41     + ops::BitXor<Output = Self>
42     + ops::BitXorAssign
43     + ops::Shl<u32, Output = Self>
44     + ops::ShlAssign<u32>
45     + ops::Shr<u32, Output = Self>
46     + ops::ShrAssign<u32>
47     + ops::Not
48 {
49     /// Whether this type is [`Signed`] or [`Unsigned`].
50     type Signedness;
51 
52     /// Number of bits used for value representation.
53     const BITS: u32;
54 }
55 
56 macro_rules! impl_integer {
57     ($($type:ty: $signedness:ty), *) => {
58         $(
59         impl Integer for $type {
60             type Signedness = $signedness;
61 
62             const BITS: u32 = <$type>::BITS;
63         }
64         )*
65     };
66 }
67 
68 impl_integer!(
69     u8: Unsigned,
70     u16: Unsigned,
71     u32: Unsigned,
72     u64: Unsigned,
73     u128: Unsigned,
74     usize: Unsigned,
75     i8: Signed,
76     i16: Signed,
77     i32: Signed,
78     i64: Signed,
79     i128: Signed,
80     isize: Signed
81 );
82