numera/number/integer/prime/
convert.rs1use crate::{
7 error::{IntegerErrors, NumeraErrors, NumeraResult},
8 number::{integer::prime::all::*, traits::Number},
9};
10use devela::convert::az::CheckedAs;
11
12#[rustfmt::skip]
15mod between_primes {
16 use super::*;
17
18 impl From<Prime8> for Prime16 {
21 #[inline]
22 fn from(p: Prime8) -> Prime16 { Prime16(p.0.into()) }
23 }
24 impl From<Prime8> for Prime32 {
25 #[inline]
26 fn from(p: Prime8) -> Prime32 { Prime32(p.0.into()) }
27 }
28 impl From<Prime8> for Prime64 {
29 #[inline]
30 fn from(p: Prime8) -> Prime64 { Prime64(p.0.into()) }
31 }
32 impl From<Prime8> for Prime128 {
33 #[inline]
34 fn from(p: Prime8) -> Prime128 { Prime128(p.0.into()) }
35 }
36 impl From<Prime8> for Primes {
37 #[inline]
38 fn from(p: Prime8) -> Primes { Primes::_8(p) }
39 }
40
41 impl From<Prime16> for Prime32 {
42 #[inline]
43 fn from(p: Prime16) -> Prime32 { Prime32(p.0.into()) }
44 }
45 impl From<Prime16> for Prime64 {
46 #[inline]
47 fn from(p: Prime16) -> Prime64 { Prime64(p.0.into()) }
48 }
49 impl From<Prime16> for Prime128 {
50 #[inline]
51 fn from(p: Prime16) -> Prime128 { Prime128(p.0.into()) }
52 }
53 impl From<Prime16> for Primes {
54 #[inline]
55 fn from(p: Prime16) -> Primes { Primes::_16(p) }
56 }
57
58 impl From<Prime32> for Prime64 {
59 #[inline]
60 fn from(p: Prime32) -> Prime64 { Prime64(p.0.into()) }
61 }
62 impl From<Prime32> for Prime128 {
63 #[inline]
64 fn from(p: Prime32) -> Prime128 { Prime128(p.0.into()) }
65 }
66 impl From<Prime32> for Primes {
67 #[inline]
68 fn from(p: Prime32) -> Primes { Primes::_32(p) }
69 }
70
71 impl From<Prime64> for Prime128 {
72 #[inline]
73 fn from(p: Prime64) -> Prime128 { Prime128(p.0.into()) }
74 }
75 impl From<Prime64> for Primes {
76 #[inline]
77 fn from(p: Prime64) -> Primes { Primes::_64(p) }
78 }
79
80 impl From<Prime128> for Primes {
81 #[inline]
82 fn from(p: Prime128) -> Primes { Primes::_128(p) }
83 }
84
85 impl TryFrom<Prime16> for Prime8 {
88 type Error = NumeraErrors;
89 #[inline]
90 fn try_from(value: Prime16) -> NumeraResult<Prime8> {
91 Ok(Prime8(u8::try_from(value.0)?))
92 }
93 }
94 impl TryFrom<Prime32> for Prime8 {
95 type Error = NumeraErrors;
96 #[inline]
97 fn try_from(value: Prime32) -> NumeraResult<Prime8> {
98 Ok(Prime8(u8::try_from(value.0)?))
99 }
100 }
101 impl TryFrom<Prime64> for Prime8 {
102 type Error = NumeraErrors;
103 #[inline]
104 fn try_from(value: Prime64) -> NumeraResult<Prime8> {
105 Ok(Prime8(u8::try_from(value.0)?))
106 }
107 }
108 impl TryFrom<Prime128> for Prime8 {
109 type Error = NumeraErrors;
110 #[inline]
111 fn try_from(value: Prime128) -> NumeraResult<Prime8> {
112 Ok(Prime8(u8::try_from(value.0)?))
113 }
114 }
115
116 impl TryFrom<Prime32> for Prime16 {
117 type Error = NumeraErrors;
118 #[inline]
119 fn try_from(value: Prime32) -> NumeraResult<Prime16> {
120 Ok(Prime16(u16::try_from(value.0)?))
121 }
122 }
123 impl TryFrom<Prime64> for Prime16 {
124 type Error = NumeraErrors;
125 #[inline]
126 fn try_from(value: Prime64) -> NumeraResult<Prime16> {
127 Ok(Prime16(u16::try_from(value.0)?))
128 }
129 }
130 impl TryFrom<Prime128> for Prime16 {
131 type Error = NumeraErrors;
132 #[inline]
133 fn try_from(value: Prime128) -> NumeraResult<Prime16> {
134 Ok(Prime16(u16::try_from(value.0)?))
135 }
136 }
137
138 impl TryFrom<Prime64> for Prime32 {
139 type Error = NumeraErrors;
140 #[inline]
141 fn try_from(value: Prime64) -> NumeraResult<Prime32> {
142 Ok(Prime32(u32::try_from(value.0)?))
143 }
144 }
145 impl TryFrom<Prime128> for Prime32 {
146 type Error = NumeraErrors;
147 #[inline]
148 fn try_from(value: Prime128) -> NumeraResult<Prime32> {
149 Ok(Prime32(u32::try_from(value.0)?))
150 }
151 }
152
153 impl TryFrom<Prime128> for Prime64 {
154 type Error = NumeraErrors;
155 #[inline]
156 fn try_from(value: Prime128) -> NumeraResult<Prime64> {
157 Ok(Prime64(u64::try_from(value.0)?))
158 }
159 }
160
161 impl TryFrom<Primes> for Prime8 {
162 type Error = NumeraErrors;
163 #[inline]
164 fn try_from(value: Primes) -> NumeraResult<Prime8> {
165 match value {
166 Primes::_8(p) => Ok(p),
167 Primes::_16(p) => Ok(p.try_into()?),
168 Primes::_32(p) => Ok(p.try_into()?),
169 Primes::_64(p) => Ok(p.try_into()?),
170 Primes::_128(p) => Ok(p.try_into()?),
171 }
172 }
173 }
174}
175
176macro_rules! from_prime_to_primitive {
180 ($Prime:ident, $($primitive:ty),+) => {
181 $( from_prime_to_primitive![@ $Prime, $primitive]; )*
182 };
183 (@ $Prime:ident, $primitive:ty) => {
184 impl From<$Prime> for $primitive {
185 fn from(p: $Prime) -> $primitive {
186 p.0.into()
187 }
188 }
189 };
190}
191from_prime_to_primitive![Prime8, u8, u16, u32, u64, u128, usize, i16, i32, i64, i128, isize];
192from_prime_to_primitive![Prime16, u16, u32, u64, u128, usize, i32, i64, i128];
193from_prime_to_primitive![Prime32, u32, u64, u128, i64, i128];
194from_prime_to_primitive![Prime64, u64, u128, i128];
195from_prime_to_primitive![Prime128, u128];
196
197macro_rules! try_from_prime_to_primitive {
199 ($Prime:ident, $($primitive:ty),+) => {
200 $( try_from_prime_to_primitive![@ $Prime, $primitive]; )*
201 };
202 (@ $Prime:ident, $primitive:ty) => {
203 impl TryFrom<$Prime> for $primitive {
204 type Error = NumeraErrors;
205 #[inline]
206 fn try_from(p: $Prime) -> NumeraResult<$primitive> {
207 Ok(<$primitive>::try_from(p.0)?)
208 }
209 }
210 };
211}
212try_from_prime_to_primitive![Prime8, i8];
213try_from_prime_to_primitive![Prime16, u8, i8, i16, isize];
214try_from_prime_to_primitive![Prime32, u8, u16, usize, i8, i16, i32, isize];
215try_from_prime_to_primitive![Prime64, u8, u16, u32, usize, i8, i16, i32, i64, isize];
216try_from_prime_to_primitive![Prime128, u8, u16, u32, u64, usize, i8, i16, i32, i64, i128, isize];
217
218macro_rules! try_from_primitive_to_prime {
222 ($Prime:ident, $PrimeInnerRepr:ty; $($primitive:ty),+) => {
223 $( try_from_primitive_to_prime![@ $Prime, $PrimeInnerRepr; $primitive]; )*
224 };
225 (@ $Prime:ident, $PrimeInnerRepr:ty; $primitive:ty) => {
226 impl TryFrom<$primitive> for $Prime {
227 type Error = NumeraErrors;
228 #[inline]
229 fn try_from(p: $primitive) -> NumeraResult<$Prime> {
230 let arg = p.checked_as::<$PrimeInnerRepr>().ok_or(IntegerErrors::Overflow)?;
231 $Prime::from_inner_repr(arg)
232 }
233 }
234 };
235}
236try_from_primitive_to_prime![Prime8,
237 u8; u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize];
238try_from_primitive_to_prime![Prime16,
239 u16; u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize];
240try_from_primitive_to_prime![Prime32,
241 u32; u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize];
242try_from_primitive_to_prime![Prime64,
243 u64; u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize];
244try_from_primitive_to_prime![Prime128,
245 u128; u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize];