1macro_rules! overflowing_impl {
10 ($trait_name:ident, $method:ident, $t:ty) => {
11 c0nst::c0nst! {
12 c0nst impl $trait_name for $t {
13 type Output = $t;
14 #[inline]
15 fn $method(self, v: Self) -> (Self, bool) {
16 <$t>::$method(self, v)
17 }
18 }
19 }
20 };
21}
22
23c0nst::c0nst! {
24pub c0nst trait OverflowingAdd: Sized {
26 type Output;
28 fn overflowing_add(self, v: Self) -> (Self::Output, bool);
31}
32}
33
34overflowing_impl!(OverflowingAdd, overflowing_add, u8);
35overflowing_impl!(OverflowingAdd, overflowing_add, u16);
36overflowing_impl!(OverflowingAdd, overflowing_add, u32);
37overflowing_impl!(OverflowingAdd, overflowing_add, u64);
38overflowing_impl!(OverflowingAdd, overflowing_add, usize);
39overflowing_impl!(OverflowingAdd, overflowing_add, u128);
40
41overflowing_impl!(OverflowingAdd, overflowing_add, i8);
42overflowing_impl!(OverflowingAdd, overflowing_add, i16);
43overflowing_impl!(OverflowingAdd, overflowing_add, i32);
44overflowing_impl!(OverflowingAdd, overflowing_add, i64);
45overflowing_impl!(OverflowingAdd, overflowing_add, isize);
46overflowing_impl!(OverflowingAdd, overflowing_add, i128);
47
48c0nst::c0nst! {
49pub c0nst trait OverflowingSub: Sized {
51 type Output;
53 fn overflowing_sub(self, v: Self) -> (Self::Output, bool);
56}
57}
58
59overflowing_impl!(OverflowingSub, overflowing_sub, u8);
60overflowing_impl!(OverflowingSub, overflowing_sub, u16);
61overflowing_impl!(OverflowingSub, overflowing_sub, u32);
62overflowing_impl!(OverflowingSub, overflowing_sub, u64);
63overflowing_impl!(OverflowingSub, overflowing_sub, usize);
64overflowing_impl!(OverflowingSub, overflowing_sub, u128);
65
66overflowing_impl!(OverflowingSub, overflowing_sub, i8);
67overflowing_impl!(OverflowingSub, overflowing_sub, i16);
68overflowing_impl!(OverflowingSub, overflowing_sub, i32);
69overflowing_impl!(OverflowingSub, overflowing_sub, i64);
70overflowing_impl!(OverflowingSub, overflowing_sub, isize);
71overflowing_impl!(OverflowingSub, overflowing_sub, i128);
72
73c0nst::c0nst! {
74pub c0nst trait OverflowingMul: Sized {
76 type Output;
78 fn overflowing_mul(self, v: Self) -> (Self::Output, bool);
81}
82}
83
84overflowing_impl!(OverflowingMul, overflowing_mul, u8);
85overflowing_impl!(OverflowingMul, overflowing_mul, u16);
86overflowing_impl!(OverflowingMul, overflowing_mul, u32);
87overflowing_impl!(OverflowingMul, overflowing_mul, u64);
88overflowing_impl!(OverflowingMul, overflowing_mul, usize);
89overflowing_impl!(OverflowingMul, overflowing_mul, u128);
90
91overflowing_impl!(OverflowingMul, overflowing_mul, i8);
92overflowing_impl!(OverflowingMul, overflowing_mul, i16);
93overflowing_impl!(OverflowingMul, overflowing_mul, i32);
94overflowing_impl!(OverflowingMul, overflowing_mul, i64);
95overflowing_impl!(OverflowingMul, overflowing_mul, isize);
96overflowing_impl!(OverflowingMul, overflowing_mul, i128);
97
98c0nst::c0nst! {
99pub c0nst trait OverflowingDiv: Sized {
101 type Output;
103 fn overflowing_div(self, v: Self) -> (Self::Output, bool);
111}
112}
113
114overflowing_impl!(OverflowingDiv, overflowing_div, u8);
115overflowing_impl!(OverflowingDiv, overflowing_div, u16);
116overflowing_impl!(OverflowingDiv, overflowing_div, u32);
117overflowing_impl!(OverflowingDiv, overflowing_div, u64);
118overflowing_impl!(OverflowingDiv, overflowing_div, usize);
119overflowing_impl!(OverflowingDiv, overflowing_div, u128);
120
121overflowing_impl!(OverflowingDiv, overflowing_div, i8);
122overflowing_impl!(OverflowingDiv, overflowing_div, i16);
123overflowing_impl!(OverflowingDiv, overflowing_div, i32);
124overflowing_impl!(OverflowingDiv, overflowing_div, i64);
125overflowing_impl!(OverflowingDiv, overflowing_div, isize);
126overflowing_impl!(OverflowingDiv, overflowing_div, i128);
127
128c0nst::c0nst! {
129pub c0nst trait OverflowingRem: Sized {
131 type Output;
133 fn overflowing_rem(self, v: Self) -> (Self::Output, bool);
141}
142}
143
144overflowing_impl!(OverflowingRem, overflowing_rem, u8);
145overflowing_impl!(OverflowingRem, overflowing_rem, u16);
146overflowing_impl!(OverflowingRem, overflowing_rem, u32);
147overflowing_impl!(OverflowingRem, overflowing_rem, u64);
148overflowing_impl!(OverflowingRem, overflowing_rem, usize);
149overflowing_impl!(OverflowingRem, overflowing_rem, u128);
150
151overflowing_impl!(OverflowingRem, overflowing_rem, i8);
152overflowing_impl!(OverflowingRem, overflowing_rem, i16);
153overflowing_impl!(OverflowingRem, overflowing_rem, i32);
154overflowing_impl!(OverflowingRem, overflowing_rem, i64);
155overflowing_impl!(OverflowingRem, overflowing_rem, isize);
156overflowing_impl!(OverflowingRem, overflowing_rem, i128);
157
158macro_rules! overflowing_neg_impl {
159 ($($t:ty)*) => {$(
160 c0nst::c0nst! {
161 c0nst impl OverflowingNeg for $t {
162 type Output = $t;
163 #[inline]
164 fn overflowing_neg(self) -> ($t, bool) { <$t>::overflowing_neg(self) }
165 }
166 }
167 )*};
168}
169
170macro_rules! overflowing_unary_impl {
171 ($trait_name:ident, $method:ident, $t:ty) => {
172 c0nst::c0nst! {
173 c0nst impl $trait_name for $t {
174 type Output = $t;
175 #[inline]
176 fn $method(self) -> ($t, bool) {
177 <$t>::$method(self)
178 }
179 }
180 }
181 };
182}
183
184c0nst::c0nst! {
185pub c0nst trait OverflowingNeg: Sized {
187 type Output;
191 fn overflowing_neg(self) -> (Self::Output, bool);
192}
193}
194
195overflowing_neg_impl!(u8 u16 u32 u64 usize u128 i8 i16 i32 i64 isize i128);
196
197c0nst::c0nst! {
198pub c0nst trait OverflowingAbs: Sized {
200 type Output;
202 fn overflowing_abs(self) -> (Self::Output, bool);
206}
207}
208
209overflowing_unary_impl!(OverflowingAbs, overflowing_abs, i8);
210overflowing_unary_impl!(OverflowingAbs, overflowing_abs, i16);
211overflowing_unary_impl!(OverflowingAbs, overflowing_abs, i32);
212overflowing_unary_impl!(OverflowingAbs, overflowing_abs, i64);
213overflowing_unary_impl!(OverflowingAbs, overflowing_abs, isize);
214overflowing_unary_impl!(OverflowingAbs, overflowing_abs, i128);
215
216macro_rules! overflowing_u32_rhs_impl {
217 ($trait_name:ident, $method:ident, $t:ty) => {
218 c0nst::c0nst! {
219 c0nst impl $trait_name for $t {
220 type Output = $t;
221 #[inline]
222 fn $method(self, rhs: u32) -> ($t, bool) {
223 <$t>::$method(self, rhs)
224 }
225 }
226 }
227 };
228}
229
230c0nst::c0nst! {
231pub c0nst trait OverflowingShl: Sized {
233 type Output;
235 fn overflowing_shl(self, rhs: u32) -> (Self::Output, bool);
246}
247}
248
249overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, u8);
250overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, u16);
251overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, u32);
252overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, u64);
253overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, usize);
254overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, u128);
255
256overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, i8);
257overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, i16);
258overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, i32);
259overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, i64);
260overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, isize);
261overflowing_u32_rhs_impl!(OverflowingShl, overflowing_shl, i128);
262
263c0nst::c0nst! {
264pub c0nst trait OverflowingShr: Sized {
266 type Output;
268 fn overflowing_shr(self, rhs: u32) -> (Self::Output, bool);
279}
280}
281
282overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, u8);
283overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, u16);
284overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, u32);
285overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, u64);
286overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, usize);
287overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, u128);
288
289overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, i8);
290overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, i16);
291overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, i32);
292overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, i64);
293overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, isize);
294overflowing_u32_rhs_impl!(OverflowingShr, overflowing_shr, i128);
295
296c0nst::c0nst! {
297pub c0nst trait OverflowingPow: Sized {
299 type Output;
301 fn overflowing_pow(self, exp: u32) -> (Self::Output, bool);
305}
306}
307
308overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, u8);
309overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, u16);
310overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, u32);
311overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, u64);
312overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, usize);
313overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, u128);
314
315overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, i8);
316overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, i16);
317overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, i32);
318overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, i64);
319overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, isize);
320overflowing_u32_rhs_impl!(OverflowingPow, overflowing_pow, i128);
321
322#[test]
323fn test_overflowing_extended_traits() {
324 assert_eq!(
325 OverflowingDiv::overflowing_div(i8::MIN, -1),
326 (i8::MIN, true)
327 );
328 assert_eq!(OverflowingDiv::overflowing_div(100u8, 7), (14, false));
329 assert_eq!(OverflowingRem::overflowing_rem(i8::MIN, -1), (0, true));
330 assert_eq!(OverflowingNeg::overflowing_neg(1u8), (255, true));
331 assert_eq!(OverflowingNeg::overflowing_neg(0u8), (0, false));
332 assert_eq!(OverflowingNeg::overflowing_neg(i8::MIN), (i8::MIN, true));
333 assert_eq!(OverflowingAbs::overflowing_abs(i8::MIN), (i8::MIN, true));
334 assert_eq!(OverflowingAbs::overflowing_abs(-7i8), (7, false));
335 assert_eq!(OverflowingShl::overflowing_shl(1u8, 8), (1, true));
336 assert_eq!(OverflowingShr::overflowing_shr(0x80u8, 9), (0x40, true));
337 assert_eq!(OverflowingPow::overflowing_pow(3u8, 6), (217, true));
338 assert_eq!(OverflowingPow::overflowing_pow(3i32, 4), (81, false));
339}
340
341#[test]
342fn test_overflowing_traits() {
343 fn overflowing_add<T: OverflowingAdd<Output = T>>(a: T, b: T) -> (T, bool) {
344 a.overflowing_add(b)
345 }
346 fn overflowing_sub<T: OverflowingSub<Output = T>>(a: T, b: T) -> (T, bool) {
347 a.overflowing_sub(b)
348 }
349 fn overflowing_mul<T: OverflowingMul<Output = T>>(a: T, b: T) -> (T, bool) {
350 a.overflowing_mul(b)
351 }
352 assert_eq!(overflowing_add(5i16, 2), (7, false));
353 assert_eq!(overflowing_add(i16::MAX, 1), (i16::MIN, true));
354 assert_eq!(overflowing_sub(5i16, 2), (3, false));
355 assert_eq!(overflowing_sub(i16::MIN, 1), (i16::MAX, true));
356 assert_eq!(overflowing_mul(5i16, 2), (10, false));
357 assert_eq!(overflowing_mul(1_000_000_000i32, 10), (1410065408, true));
358}