Coverage Report

Created: 2025-07-11 07:25

/rust/registry/src/index.crates.io-6f17d22bba15001f/num-traits-0.2.19/src/ops/checked.rs
Line
Count
Source (jump to first uncovered line)
1
use core::ops::{Add, Div, Mul, Rem, Shl, Shr, Sub};
2
3
/// Performs addition that returns `None` instead of wrapping around on
4
/// overflow.
5
pub trait CheckedAdd: Sized + Add<Self, Output = Self> {
6
    /// Adds two numbers, checking for overflow. If overflow happens, `None` is
7
    /// returned.
8
    fn checked_add(&self, v: &Self) -> Option<Self>;
9
}
10
11
macro_rules! checked_impl {
12
    ($trait_name:ident, $method:ident, $t:ty) => {
13
        impl $trait_name for $t {
14
            #[inline]
15
0
            fn $method(&self, v: &$t) -> Option<$t> {
16
0
                <$t>::$method(*self, *v)
17
0
            }
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <i8 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <i16 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <i32 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <i64 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <isize as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <i128 as num_traits::ops::checked::CheckedAdd>::checked_add
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <i8 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <i16 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <i32 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <i64 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <isize as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <i128 as num_traits::ops::checked::CheckedSub>::checked_sub
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <i8 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <i16 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <i32 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <i64 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <isize as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <i128 as num_traits::ops::checked::CheckedMul>::checked_mul
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <i8 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <i16 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <i32 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <i64 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <isize as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <i128 as num_traits::ops::checked::CheckedDiv>::checked_div
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <i8 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <i16 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <i32 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <i64 as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <isize as num_traits::ops::checked::CheckedRem>::checked_rem
Unexecuted instantiation: <i128 as num_traits::ops::checked::CheckedRem>::checked_rem
18
        }
19
    };
20
}
21
22
checked_impl!(CheckedAdd, checked_add, u8);
23
checked_impl!(CheckedAdd, checked_add, u16);
24
checked_impl!(CheckedAdd, checked_add, u32);
25
checked_impl!(CheckedAdd, checked_add, u64);
26
checked_impl!(CheckedAdd, checked_add, usize);
27
checked_impl!(CheckedAdd, checked_add, u128);
28
29
checked_impl!(CheckedAdd, checked_add, i8);
30
checked_impl!(CheckedAdd, checked_add, i16);
31
checked_impl!(CheckedAdd, checked_add, i32);
32
checked_impl!(CheckedAdd, checked_add, i64);
33
checked_impl!(CheckedAdd, checked_add, isize);
34
checked_impl!(CheckedAdd, checked_add, i128);
35
36
/// Performs subtraction that returns `None` instead of wrapping around on underflow.
37
pub trait CheckedSub: Sized + Sub<Self, Output = Self> {
38
    /// Subtracts two numbers, checking for underflow. If underflow happens,
39
    /// `None` is returned.
40
    fn checked_sub(&self, v: &Self) -> Option<Self>;
41
}
42
43
checked_impl!(CheckedSub, checked_sub, u8);
44
checked_impl!(CheckedSub, checked_sub, u16);
45
checked_impl!(CheckedSub, checked_sub, u32);
46
checked_impl!(CheckedSub, checked_sub, u64);
47
checked_impl!(CheckedSub, checked_sub, usize);
48
checked_impl!(CheckedSub, checked_sub, u128);
49
50
checked_impl!(CheckedSub, checked_sub, i8);
51
checked_impl!(CheckedSub, checked_sub, i16);
52
checked_impl!(CheckedSub, checked_sub, i32);
53
checked_impl!(CheckedSub, checked_sub, i64);
54
checked_impl!(CheckedSub, checked_sub, isize);
55
checked_impl!(CheckedSub, checked_sub, i128);
56
57
/// Performs multiplication that returns `None` instead of wrapping around on underflow or
58
/// overflow.
59
pub trait CheckedMul: Sized + Mul<Self, Output = Self> {
60
    /// Multiplies two numbers, checking for underflow or overflow. If underflow
61
    /// or overflow happens, `None` is returned.
62
    fn checked_mul(&self, v: &Self) -> Option<Self>;
63
}
64
65
checked_impl!(CheckedMul, checked_mul, u8);
66
checked_impl!(CheckedMul, checked_mul, u16);
67
checked_impl!(CheckedMul, checked_mul, u32);
68
checked_impl!(CheckedMul, checked_mul, u64);
69
checked_impl!(CheckedMul, checked_mul, usize);
70
checked_impl!(CheckedMul, checked_mul, u128);
71
72
checked_impl!(CheckedMul, checked_mul, i8);
73
checked_impl!(CheckedMul, checked_mul, i16);
74
checked_impl!(CheckedMul, checked_mul, i32);
75
checked_impl!(CheckedMul, checked_mul, i64);
76
checked_impl!(CheckedMul, checked_mul, isize);
77
checked_impl!(CheckedMul, checked_mul, i128);
78
79
/// Performs division that returns `None` instead of panicking on division by zero and instead of
80
/// wrapping around on underflow and overflow.
81
pub trait CheckedDiv: Sized + Div<Self, Output = Self> {
82
    /// Divides two numbers, checking for underflow, overflow and division by
83
    /// zero. If any of that happens, `None` is returned.
84
    fn checked_div(&self, v: &Self) -> Option<Self>;
85
}
86
87
checked_impl!(CheckedDiv, checked_div, u8);
88
checked_impl!(CheckedDiv, checked_div, u16);
89
checked_impl!(CheckedDiv, checked_div, u32);
90
checked_impl!(CheckedDiv, checked_div, u64);
91
checked_impl!(CheckedDiv, checked_div, usize);
92
checked_impl!(CheckedDiv, checked_div, u128);
93
94
checked_impl!(CheckedDiv, checked_div, i8);
95
checked_impl!(CheckedDiv, checked_div, i16);
96
checked_impl!(CheckedDiv, checked_div, i32);
97
checked_impl!(CheckedDiv, checked_div, i64);
98
checked_impl!(CheckedDiv, checked_div, isize);
99
checked_impl!(CheckedDiv, checked_div, i128);
100
101
/// Performs an integral remainder that returns `None` instead of panicking on division by zero and
102
/// instead of wrapping around on underflow and overflow.
103
pub trait CheckedRem: Sized + Rem<Self, Output = Self> {
104
    /// Finds the remainder of dividing two numbers, checking for underflow, overflow and division
105
    /// by zero. If any of that happens, `None` is returned.
106
    ///
107
    /// # Examples
108
    ///
109
    /// ```
110
    /// use num_traits::CheckedRem;
111
    /// use std::i32::MIN;
112
    ///
113
    /// assert_eq!(CheckedRem::checked_rem(&10, &7), Some(3));
114
    /// assert_eq!(CheckedRem::checked_rem(&10, &-7), Some(3));
115
    /// assert_eq!(CheckedRem::checked_rem(&-10, &7), Some(-3));
116
    /// assert_eq!(CheckedRem::checked_rem(&-10, &-7), Some(-3));
117
    ///
118
    /// assert_eq!(CheckedRem::checked_rem(&10, &0), None);
119
    ///
120
    /// assert_eq!(CheckedRem::checked_rem(&MIN, &1), Some(0));
121
    /// assert_eq!(CheckedRem::checked_rem(&MIN, &-1), None);
122
    /// ```
123
    fn checked_rem(&self, v: &Self) -> Option<Self>;
124
}
125
126
checked_impl!(CheckedRem, checked_rem, u8);
127
checked_impl!(CheckedRem, checked_rem, u16);
128
checked_impl!(CheckedRem, checked_rem, u32);
129
checked_impl!(CheckedRem, checked_rem, u64);
130
checked_impl!(CheckedRem, checked_rem, usize);
131
checked_impl!(CheckedRem, checked_rem, u128);
132
133
checked_impl!(CheckedRem, checked_rem, i8);
134
checked_impl!(CheckedRem, checked_rem, i16);
135
checked_impl!(CheckedRem, checked_rem, i32);
136
checked_impl!(CheckedRem, checked_rem, i64);
137
checked_impl!(CheckedRem, checked_rem, isize);
138
checked_impl!(CheckedRem, checked_rem, i128);
139
140
macro_rules! checked_impl_unary {
141
    ($trait_name:ident, $method:ident, $t:ty) => {
142
        impl $trait_name for $t {
143
            #[inline]
144
0
            fn $method(&self) -> Option<$t> {
145
0
                <$t>::$method(*self)
146
0
            }
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <i8 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <i16 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <i32 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <i64 as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <isize as num_traits::ops::checked::CheckedNeg>::checked_neg
Unexecuted instantiation: <i128 as num_traits::ops::checked::CheckedNeg>::checked_neg
147
        }
148
    };
149
}
150
151
/// Performs negation that returns `None` if the result can't be represented.
152
pub trait CheckedNeg: Sized {
153
    /// Negates a number, returning `None` for results that can't be represented, like signed `MIN`
154
    /// values that can't be positive, or non-zero unsigned values that can't be negative.
155
    ///
156
    /// # Examples
157
    ///
158
    /// ```
159
    /// use num_traits::CheckedNeg;
160
    /// use std::i32::MIN;
161
    ///
162
    /// assert_eq!(CheckedNeg::checked_neg(&1_i32), Some(-1));
163
    /// assert_eq!(CheckedNeg::checked_neg(&-1_i32), Some(1));
164
    /// assert_eq!(CheckedNeg::checked_neg(&MIN), None);
165
    ///
166
    /// assert_eq!(CheckedNeg::checked_neg(&0_u32), Some(0));
167
    /// assert_eq!(CheckedNeg::checked_neg(&1_u32), None);
168
    /// ```
169
    fn checked_neg(&self) -> Option<Self>;
170
}
171
172
checked_impl_unary!(CheckedNeg, checked_neg, u8);
173
checked_impl_unary!(CheckedNeg, checked_neg, u16);
174
checked_impl_unary!(CheckedNeg, checked_neg, u32);
175
checked_impl_unary!(CheckedNeg, checked_neg, u64);
176
checked_impl_unary!(CheckedNeg, checked_neg, usize);
177
checked_impl_unary!(CheckedNeg, checked_neg, u128);
178
179
checked_impl_unary!(CheckedNeg, checked_neg, i8);
180
checked_impl_unary!(CheckedNeg, checked_neg, i16);
181
checked_impl_unary!(CheckedNeg, checked_neg, i32);
182
checked_impl_unary!(CheckedNeg, checked_neg, i64);
183
checked_impl_unary!(CheckedNeg, checked_neg, isize);
184
checked_impl_unary!(CheckedNeg, checked_neg, i128);
185
186
/// Performs a left shift that returns `None` on shifts larger than
187
/// or equal to the type width.
188
pub trait CheckedShl: Sized + Shl<u32, Output = Self> {
189
    /// Checked shift left. Computes `self << rhs`, returning `None`
190
    /// if `rhs` is larger than or equal to the number of bits in `self`.
191
    ///
192
    /// ```
193
    /// use num_traits::CheckedShl;
194
    ///
195
    /// let x: u16 = 0x0001;
196
    ///
197
    /// assert_eq!(CheckedShl::checked_shl(&x, 0),  Some(0x0001));
198
    /// assert_eq!(CheckedShl::checked_shl(&x, 1),  Some(0x0002));
199
    /// assert_eq!(CheckedShl::checked_shl(&x, 15), Some(0x8000));
200
    /// assert_eq!(CheckedShl::checked_shl(&x, 16), None);
201
    /// ```
202
    fn checked_shl(&self, rhs: u32) -> Option<Self>;
203
}
204
205
macro_rules! checked_shift_impl {
206
    ($trait_name:ident, $method:ident, $t:ty) => {
207
        impl $trait_name for $t {
208
            #[inline]
209
0
            fn $method(&self, rhs: u32) -> Option<$t> {
210
0
                <$t>::$method(*self, rhs)
211
0
            }
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <i8 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <i16 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <i32 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <i64 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <isize as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <i128 as num_traits::ops::checked::CheckedShl>::checked_shl
Unexecuted instantiation: <u8 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <u16 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <u32 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <u64 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <usize as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <u128 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <i8 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <i16 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <i32 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <i64 as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <isize as num_traits::ops::checked::CheckedShr>::checked_shr
Unexecuted instantiation: <i128 as num_traits::ops::checked::CheckedShr>::checked_shr
212
        }
213
    };
214
}
215
216
checked_shift_impl!(CheckedShl, checked_shl, u8);
217
checked_shift_impl!(CheckedShl, checked_shl, u16);
218
checked_shift_impl!(CheckedShl, checked_shl, u32);
219
checked_shift_impl!(CheckedShl, checked_shl, u64);
220
checked_shift_impl!(CheckedShl, checked_shl, usize);
221
checked_shift_impl!(CheckedShl, checked_shl, u128);
222
223
checked_shift_impl!(CheckedShl, checked_shl, i8);
224
checked_shift_impl!(CheckedShl, checked_shl, i16);
225
checked_shift_impl!(CheckedShl, checked_shl, i32);
226
checked_shift_impl!(CheckedShl, checked_shl, i64);
227
checked_shift_impl!(CheckedShl, checked_shl, isize);
228
checked_shift_impl!(CheckedShl, checked_shl, i128);
229
230
/// Performs a right shift that returns `None` on shifts larger than
231
/// or equal to the type width.
232
pub trait CheckedShr: Sized + Shr<u32, Output = Self> {
233
    /// Checked shift right. Computes `self >> rhs`, returning `None`
234
    /// if `rhs` is larger than or equal to the number of bits in `self`.
235
    ///
236
    /// ```
237
    /// use num_traits::CheckedShr;
238
    ///
239
    /// let x: u16 = 0x8000;
240
    ///
241
    /// assert_eq!(CheckedShr::checked_shr(&x, 0),  Some(0x8000));
242
    /// assert_eq!(CheckedShr::checked_shr(&x, 1),  Some(0x4000));
243
    /// assert_eq!(CheckedShr::checked_shr(&x, 15), Some(0x0001));
244
    /// assert_eq!(CheckedShr::checked_shr(&x, 16), None);
245
    /// ```
246
    fn checked_shr(&self, rhs: u32) -> Option<Self>;
247
}
248
249
checked_shift_impl!(CheckedShr, checked_shr, u8);
250
checked_shift_impl!(CheckedShr, checked_shr, u16);
251
checked_shift_impl!(CheckedShr, checked_shr, u32);
252
checked_shift_impl!(CheckedShr, checked_shr, u64);
253
checked_shift_impl!(CheckedShr, checked_shr, usize);
254
checked_shift_impl!(CheckedShr, checked_shr, u128);
255
256
checked_shift_impl!(CheckedShr, checked_shr, i8);
257
checked_shift_impl!(CheckedShr, checked_shr, i16);
258
checked_shift_impl!(CheckedShr, checked_shr, i32);
259
checked_shift_impl!(CheckedShr, checked_shr, i64);
260
checked_shift_impl!(CheckedShr, checked_shr, isize);
261
checked_shift_impl!(CheckedShr, checked_shr, i128);