11//! Traits for using numbers as generic data types.
2- //!
3- //! Machine-dependent integer types aren't unsupported.
42
53use std:: fmt:: Debug ;
64use std:: iter:: { Product , Sum } ;
@@ -80,13 +78,23 @@ pub trait Integer:
8078}
8179
8280/// Trait implemented by the primitive unsigned integer types.
83- pub trait UnsignedInteger : Integer + From < u8 > { }
81+ pub trait UnsignedInteger : Integer + From < u8 > {
82+ type Signed : SignedInteger ;
83+
84+ #[ must_use]
85+ fn wrapping_add_signed ( self , rhs : Self :: Signed ) -> Self ;
86+ }
8487
8588/// Trait implemented by the primitive signed integer types.
86- pub trait SignedInteger : Integer + Signed { }
89+ pub trait SignedInteger : Integer + Signed {
90+ type Unsigned : UnsignedInteger ;
91+
92+ #[ must_use]
93+ fn unsigned_abs ( self ) -> Self :: Unsigned ;
94+ }
8795
8896macro_rules! number_impl {
89- ( uint => $( $t: ty) ,+) => {
97+ ( uint => $( $t: ty: $signed : ty ) ,+) => {
9098 $( impl Number for $t {
9199 const ZERO : Self = 0 ;
92100 const ONE : Self = 1 ;
@@ -106,9 +114,16 @@ macro_rules! number_impl {
106114
107115 number_impl! { @common integer => $( $t) ,+}
108116
109- $( impl UnsignedInteger for $t { } ) +
117+ $( impl UnsignedInteger for $t {
118+ type Signed = $signed;
119+
120+ #[ inline]
121+ fn wrapping_add_signed( self , rhs: Self :: Signed ) -> Self {
122+ self . wrapping_add_signed( rhs)
123+ }
124+ } ) +
110125 } ;
111- ( int => $( $t: ty) ,+) => {
126+ ( int => $( $t: ty: $unsigned : ty ) ,+) => {
112127 $( impl Number for $t {
113128 const ZERO : Self = 0 ;
114129 const ONE : Self = 1 ;
@@ -129,7 +144,14 @@ macro_rules! number_impl {
129144 number_impl! { @common integer => $( $t) ,+}
130145 number_impl! { @common signed => $( $t) ,+}
131146
132- $( impl SignedInteger for $t { } ) +
147+ $( impl SignedInteger for $t {
148+ type Unsigned = $unsigned;
149+
150+ #[ inline]
151+ fn unsigned_abs( self ) -> Self :: Unsigned {
152+ self . unsigned_abs( )
153+ }
154+ } ) +
133155 } ;
134156 ( float => $( $t: ty) ,+) => {
135157 $( impl Number for $t {
@@ -181,8 +203,8 @@ macro_rules! number_impl {
181203 } ) +
182204 } ;
183205}
184- number_impl ! { uint => u8 , u16 , u32 , u64 , u128 }
185- number_impl ! { int => i8 , i16 , i32 , i64 , i128 }
206+ number_impl ! { uint => u8 : i8 , u16 : i16 , u32 : i32 , u64 : i64 , u128 : i128 , usize : isize }
207+ number_impl ! { int => i8 : u8 , i16 : u16 , i32 : u32 , i64 : u64 , i128 : u128 , isize : usize }
186208number_impl ! { float => f32 , f64 }
187209
188210/// Checks if the provided unsigned integer `n` is a prime number.
0 commit comments