1use crate::{sf, Deref, DerefMut, NumError as E, NumResult as Result};
7#[cfg(doc)]
8use E::{NotImplemented, NotSupported};
9
10mod constants; pub use constants::*;
12
13mod impls;
14
15sf! {
16 impl<T: Num> NumRef<'_> for &T { type Own = T; }
17 impl<T: Num> NumRef<'_> for &mut T { type Own = T; }
18}
19
20#[rustfmt::skip]
37#[cfg_attr(feature = "nightly_doc", doc(notable_trait))]
38#[allow(unused_variables, reason = "default implementation is not implemented")]
39pub trait Num {
40 type Inner;
42
43 type Out;
45
46 type Rhs;
48
49 #[must_use]
51 fn num_into(self) -> Self::Inner;
52
53 fn num_from(value: Self::Inner) -> Result<Self>
55 where Self: Sized { E::ni() }
56 fn num_from_ref(value: &Self::Inner) -> Result<Self>
58 where Self: Sized { E::ni() }
59
60 fn num_set(&mut self, value: Self::Inner) -> Result<()> { E::ni() }
62 fn num_set_ref(&mut self, value: &Self::Inner) -> Result<()> { E::ni() }
64
65 fn num_is_zero(&self) -> Result<bool> { E::ni() }
69 fn num_get_zero() -> Result<Self> where Self: Sized { E::ni() }
71 fn num_set_zero(&mut self) -> Result<()> { E::ni() }
73
74 fn num_is_one(&self) -> Result<bool> { E::ni() }
76 fn num_get_one() -> Result<Self> where Self: Sized { E::ni() }
78 fn num_set_one(&mut self) -> Result<()> { E::ni() }
80
81 fn num_add(self, rhs: Self::Rhs) -> Result<Self::Out> where Self: Sized { E::ni() }
85 fn num_ref_add(&self, rhs: &Self::Rhs) -> Result<Self::Out> { E::ni() }
87 fn num_ref_add_assign(&mut self, rhs: &Self::Rhs) -> Result<()> { E::ni() }
89
90 fn num_sub(self, rhs: Self::Rhs) -> Result<Self::Out> where Self: Sized { E::ni() }
92 fn num_ref_sub(&self, rhs: &Self::Rhs) -> Result<Self::Out> { E::ni() }
94 fn num_ref_sub_assign(&mut self, rhs: &Self::Rhs) -> Result<()> { E::ni() }
96
97 fn num_mul(self, rhs: Self::Rhs) -> Result<Self::Out> where Self: Sized { E::ni() }
99 fn num_ref_mul(&self, rhs: &Self::Rhs) -> Result<Self::Out> { E::ni() }
101 fn num_ref_mul_assign(&mut self, rhs: &Self::Rhs) -> Result<()> { E::ni() }
103
104 fn num_div(self, rhs: Self::Rhs) -> Result<Self::Out> where Self: Sized { E::ni() }
106 fn num_ref_div(&self, rhs: &Self::Rhs) -> Result<Self::Out> { E::ni() }
108 fn num_ref_div_assign(&mut self, rhs: &Self::Rhs) -> Result<()> { E::ni() }
110
111 fn num_rem(self, rhs: Self::Rhs) -> Result<Self::Out> where Self: Sized { E::ni() }
113 fn num_ref_rem(&self, rhs: &Self::Rhs) -> Result<Self::Out> { E::ni() }
115 fn num_ref_rem_assign(&mut self, rhs: &Self::Rhs) -> Result<()> { E::ni() }
117
118 fn num_neg(self) -> Result<Self::Out> where Self: Sized { E::ni() }
120 fn num_ref_neg(&self) -> Result<Self::Out> { E::ni() }
122
123 fn num_abs(self) -> Result<Self::Out> where Self: Sized { E::ni() }
125 fn num_ref_abs(&self) -> Result<Self::Out> { E::ni() }
127}
128
129#[rustfmt::skip]
134#[cfg_attr(feature = "nightly_doc", doc(notable_trait))]
135pub trait NumRef<'a> where Self: Deref<Target = Self::Own> {
136 type Own: Num;
138
139 fn num_to_owned(&self) -> Result<Self::Own> where Self::Own: Clone { Ok((*self).clone()) }
141
142 fn num_set(&mut self, value: <Self::Own as Num>::Inner) -> Result<()>
144 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_set(value) }
145
146 fn num_set_ref(&mut self, value: &<Self::Own as Num>::Inner) -> Result<()>
148 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_set_ref(value) }
149
150 fn num_is_zero(&self) -> Result<bool> { self.deref().num_is_zero() }
154 fn num_get_zero() -> Result<Self::Own> { Self::Own::num_get_zero() }
156 fn num_set_zero(&mut self) -> Result<()>
158 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_set_zero() }
159
160 fn num_is_one(&self) -> Result<bool> { self.deref().num_is_one() }
162 fn num_get_one() -> Result<Self::Own> { Self::Own::num_get_one() }
164 fn num_set_one(&mut self) -> Result<()>
166 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_set_one() }
167
168 fn num_ref_add(&self, rhs: &<Self::Own as Num>::Rhs) -> Result<<Self::Own as Num>::Out> {
172 self.deref().num_ref_add(rhs) }
173 fn num_ref_add_assign(&mut self, rhs: &<Self::Own as Num>::Rhs) -> Result<()>
175 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_ref_add_assign(rhs) }
176
177 fn num_ref_sub(&self, rhs: &<Self::Own as Num>::Rhs) -> Result<<Self::Own as Num>::Out> {
179 self.deref().num_ref_sub(rhs) }
180 fn num_ref_sub_assign(&mut self, rhs: &<Self::Own as Num>::Rhs) -> Result<()>
182 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_ref_sub_assign(rhs) }
183
184 fn num_ref_mul(&self, rhs: &<Self::Own as Num>::Rhs) -> Result<<Self::Own as Num>::Out> {
186 self.deref().num_ref_mul(rhs) }
187 fn num_ref_mul_assign(&mut self, rhs: &<Self::Own as Num>::Rhs) -> Result<()>
189 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_ref_mul_assign(rhs) }
190
191 fn num_ref_div(&self, rhs: &<Self::Own as Num>::Rhs) -> Result<<Self::Own as Num>::Out> {
193 self.deref().num_ref_div(rhs) }
194 fn num_ref_div_assign(&mut self, rhs: &<Self::Own as Num>::Rhs) -> Result<()>
196 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_ref_div_assign(rhs) }
197
198 fn num_ref_rem(&self, rhs: &<Self::Own as Num>::Rhs) -> Result<<Self::Own as Num>::Out> {
200 self.deref().num_ref_rem(rhs) }
201 fn num_ref_rem_assign(&mut self, rhs: &<Self::Own as Num>::Rhs) -> Result<()>
203 where Self: DerefMut<Target = Self::Own> { self.deref_mut().num_ref_rem_assign(rhs) }
204
205 fn num_ref_neg(&self) -> Result<<Self::Own as Num>::Out> { self.deref().num_ref_neg() }
207
208 fn num_ref_abs(&self) -> Result<<Self::Own as Num>::Out> { self.deref().num_ref_abs() }
210}