1
2use crate::{Integer, Bit};
3use std::error::Error;
4use std::ops::Div;
5use super::divider;
6
7impl Div for Integer {
8 type Output = Result<Self, Box<dyn Error>>;
9 fn div(self, b: Self) -> Result<Self, Box<dyn Error>> {
10 &self / &b
11 }
12}
13
14impl Div<&u8> for &Integer {
15 type Output = Result<Integer, Box<dyn Error>>;
16 fn div(self, b: &u8) -> Result<Integer, Box<dyn Error>> {
17 let b_int: Integer = b.into();
18 self / &b_int
19 }
20}
21
22impl Div<&u16> for &Integer {
23 type Output = Result<Integer, Box<dyn Error>>;
24 fn div(self, b: &u16) -> Result<Integer, Box<dyn Error>> {
25 let b_int: Integer = b.into();
26 self / &b_int
27 }
28}
29
30impl Div<&u32> for &Integer {
31 type Output = Result<Integer, Box<dyn Error>>;
32 fn div(self, b: &u32) -> Result<Integer, Box<dyn Error>> {
33 let b_int: Integer = b.into();
34 self / &b_int
35 }
36}
37
38impl Div<&u64> for &Integer {
39 type Output = Result<Integer, Box<dyn Error>>;
40 fn div(self, b: &u64) -> Result<Integer, Box<dyn Error>> {
41 let b_int: Integer = b.into();
42 self / &b_int
43 }
44}
45
46impl Div<&u128> for &Integer {
47 type Output = Result<Integer, Box<dyn Error>>;
48 fn div(self, b: &u128) -> Result<Integer, Box<dyn Error>> {
49 let b_int: Integer = b.into();
50 self / &b_int
51 }
52}
53
54impl Div<&usize> for &Integer {
55 type Output = Result<Integer, Box<dyn Error>>;
56 fn div(self, b: &usize) -> Result<Integer, Box<dyn Error>> {
57 let b_int: Integer = b.into();
58 self / &b_int
59 }
60}
61
62impl Div for &Integer {
63
64 type Output = Result<Integer, Box<dyn Error>>;
65
66 fn div(self, b: Self) -> Result<Integer, Box<dyn Error>> {
67
68 if b == &Integer::zero() {
69
70 Err("a/0 is undefined!")?
71
72 } else if self == &Integer::zero() {
73
74 Ok(Integer::zero())
75
76 } else {
77
78 let a_pos =
79 if self.0[0] == Bit::Zero {
80 self.clone()
81 } else {
82 self.inversion()
83 };
84
85 let b_pos =
86 if b.0[0] == Bit::Zero {
87 b.clone()
88 } else {
89 b.inversion()
90 };
91
92 let (quotient, _) = divider::run(&a_pos, &b_pos);
93
94 match (self.0[0], b.0[0]) {
95 (Bit::Zero, Bit::Zero) => Ok(quotient),
96 (Bit::One, Bit::One) => Ok(quotient),
97 (Bit::Zero, Bit::One) => Ok(quotient.inversion()),
98 (Bit::One, Bit::Zero) => Ok(quotient.inversion())
99 }
100
101 }
102
103 }
104
105}