1pub(crate) trait ForceAdd: Sized {
2 fn force_add(self, rhs: Self) -> Self;
3}
4
5impl ForceAdd for u8 {
6 fn force_add(self, rhs: Self) -> Self {
7 self.checked_add(rhs).unwrap_or_else(die)
8 }
9}
10
11impl ForceAdd for i32 {
12 fn force_add(self, rhs: Self) -> Self {
13 self.checked_add(rhs).unwrap_or_else(die)
14 }
15}
16
17impl ForceAdd for u32 {
18 fn force_add(self, rhs: Self) -> Self {
19 self.checked_add(rhs).unwrap_or_else(die)
20 }
21}
22
23impl ForceAdd for u64 {
24 fn force_add(self, rhs: Self) -> Self {
25 self.checked_add(rhs).unwrap_or_else(die)
26 }
27}
28
29impl ForceAdd for usize {
30 fn force_add(self, rhs: Self) -> Self {
31 self.checked_add(rhs).unwrap_or_else(die)
32 }
33}
34
35pub(crate) trait ForceMul: Sized {
36 fn force_mul(self, rhs: Self) -> Self;
37}
38
39impl ForceMul for i32 {
40 fn force_mul(self, rhs: Self) -> Self {
41 self.checked_mul(rhs).unwrap_or_else(die)
42 }
43}
44
45impl ForceMul for i64 {
46 fn force_mul(self, rhs: Self) -> Self {
47 self.checked_mul(rhs).unwrap_or_else(die)
48 }
49}
50
51impl ForceMul for u64 {
52 fn force_mul(self, rhs: Self) -> Self {
53 self.checked_mul(rhs).unwrap_or_else(die)
54 }
55}
56
57pub(crate) trait ForceInto {
58 fn force_into<U>(self) -> U
59 where
60 Self: TryInto<U>;
61}
62
63impl<T> ForceInto for T {
64 fn force_into<U>(self) -> U
65 where
66 Self: TryInto<U>,
67 {
68 <Self as TryInto<U>>::try_into(self)
69 .ok()
70 .unwrap_or_else(die)
71 }
72}
73
74#[cold]
96pub(crate) fn die<T>() -> T {
97 struct PanicAgain;
98
99 impl Drop for PanicAgain {
100 fn drop(&mut self) {
101 panic!("arithmetic overflow");
102 }
103 }
104
105 fn do_die() -> ! {
106 let _panic_again = PanicAgain;
107 panic!("arithmetic overflow");
108 }
109
110 do_die();
111}