@@ -95,7 +95,7 @@ pub trait Num: PartialEq + Zero + One + NumOps {
95
95
fn from_str_radix ( str : & str , radix : u32 ) -> Result < Self , Self :: FromStrRadixErr > ;
96
96
}
97
97
98
- /// The trait for types implementing basic numeric operations
98
+ /// Generic trait for types implementing basic numeric operations
99
99
///
100
100
/// This is automatically implemented for types which implement the operators.
101
101
pub trait NumOps < Rhs = Self , Output = Self > :
@@ -123,14 +123,16 @@ impl<T, Rhs, Output> NumOps<Rhs, Output> for T where
123
123
pub trait NumRef : Num + for < ' r > NumOps < & ' r Self > { }
124
124
impl < T > NumRef for T where T : Num + for < ' r > NumOps < & ' r T > { }
125
125
126
- /// The trait for references which implement numeric operations, taking the
126
+ /// The trait for `Num` references which implement numeric operations, taking the
127
127
/// second operand either by value or by reference.
128
128
///
129
- /// This is automatically implemented for types which implement the operators.
129
+ /// This is automatically implemented for all types which implement the operators. It covers
130
+ /// every type implementing the operations though, regardless of it being a reference or
131
+ /// related to `Num`.
130
132
pub trait RefNum < Base > : NumOps < Base , Base > + for < ' r > NumOps < & ' r Base , Base > { }
131
133
impl < T , Base > RefNum < Base > for T where T : NumOps < Base , Base > + for < ' r > NumOps < & ' r Base , Base > { }
132
134
133
- /// The trait for types implementing numeric assignment operators (like `+=`).
135
+ /// Generic trait for types implementing numeric assignment operators (like `+=`).
134
136
///
135
137
/// This is automatically implemented for types which implement the operators.
136
138
pub trait NumAssignOps < Rhs = Self > :
@@ -175,11 +177,7 @@ int_trait_impl!(Num for u128 i128);
175
177
176
178
impl < T : Num > Num for Wrapping < T >
177
179
where
178
- Wrapping < T > : Add < Output = Wrapping < T > >
179
- + Sub < Output = Wrapping < T > >
180
- + Mul < Output = Wrapping < T > >
181
- + Div < Output = Wrapping < T > >
182
- + Rem < Output = Wrapping < T > > ,
180
+ Wrapping < T > : NumOps ,
183
181
{
184
182
type FromStrRadixErr = T :: FromStrRadixErr ;
185
183
fn from_str_radix ( str : & str , radix : u32 ) -> Result < Self , Self :: FromStrRadixErr > {
@@ -626,5 +624,16 @@ fn check_numassign_ops() {
626
624
assert_eq ! ( compute( 1 , 2 ) , 1 )
627
625
}
628
626
629
- // TODO test `NumAssignRef`, but even the standard numeric types don't
630
- // implement this yet. (see rust pr41336)
627
+ #[ cfg( has_int_assignop_ref) ]
628
+ #[ test]
629
+ fn check_numassignref_ops ( ) {
630
+ fn compute < T : NumAssignRef + Copy > ( mut x : T , y : & T ) -> T {
631
+ x *= y;
632
+ x /= y;
633
+ x %= y;
634
+ x += y;
635
+ x -= y;
636
+ x
637
+ }
638
+ assert_eq ! ( compute( 1 , & 2 ) , 1 )
639
+ }
0 commit comments