From f63e817e32a903e0a2a5fc780e2d2a8b0b749290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?joseLu=C3=ADs?= Date: Tue, 23 Jan 2024 17:53:30 +0100 Subject: [PATCH] refactor `Int` impls for niche types to DRY --- src/num/_private.rs | 35 +++++++++++++++++++ src/num/int/wrapper/impl_base.rs | 42 ++++------------------- src/num/int/wrapper/impl_combinatorics.rs | 42 ++++------------------- src/num/int/wrapper/impl_core.rs | 42 ++++------------------- src/num/int/wrapper/impl_div.rs | 42 ++++------------------- src/num/int/wrapper/impl_factors.rs | 10 +++--- src/num/int/wrapper/impl_prime.rs | 10 +++--- 7 files changed, 73 insertions(+), 150 deletions(-) diff --git a/src/num/_private.rs b/src/num/_private.rs index 701054c6..df8b56e7 100644 --- a/src/num/_private.rs +++ b/src/num/_private.rs @@ -189,5 +189,40 @@ macro_rules! impl_niche { Int($self.0.get()).$fn($($arg),*) } }}; + + /* ... */ + + // Implements locally defined Int methods for all niche types. + (impl_int) => { + impl_int![niche + NonZero:i8<>:"-18":"", NonZero:i16<>:"-19":"-1", + NonZero:i32<>:"-20":"-2", NonZero:i64<>:"-21":"-3", + NonZero:i128<>:"-22":"-4", NonZero:isize<>:"-23":"-5", + NonZero:u8<>:"-12":"-6", NonZero:u16<>:"-13":"-7", + NonZero:u32<>:"-14":"-8", NonZero:u64<>:"-15":"-9", + NonZero:u128<>:"-16":"-10", NonZero:usize<>:"-17":"-11", + // + NonSpecific:i8:"-30":"", NonSpecific:i16:"-31":"-1", + NonSpecific:i32:"-32":"-2", NonSpecific:i64:"-33":"-3", + NonSpecific:i128:"-34":"-4", NonSpecific:isize:"-35":"-5", + NonSpecific:u8:"-24":"-6", NonSpecific:u16:"-25":"-7", + NonSpecific:u32:"-26":"-8", NonSpecific:u64:"-27":"-9", + NonSpecific:u128:"-28":"-10", NonSpecific:usize:"-29":"-11", + // + NonRange:i8:"-42":"", NonRange:i16:"-43":"-1", + NonRange:i32:"-44":"-2", NonRange:i64:"-45":"-3", + NonRange:i128:"-46":"-4", NonRange:isize:"-47":"-5", + NonRange:u8:"-36":"-6", NonRange:u16:"-37":"-7", + NonRange:u32:"-38":"-8", NonRange:u64:"-39":"-9", + NonRange:u128:"-40":"-10", NonRange:usize:"-41":"11", + // + Range:i8:"-54":"", Range:i16:"-55":"-1", + Range:i32:"-56":"-2", Range:i64:"-57":"-3", + Range:i128:"-58":"-4", Range:isize:"-59":"-5", + Range:u8:"-48":"-6", Range:u16:"-49":"-7", + Range:u32:"-50":"-8", Range:u64:"-51":"-9", + Range:u128:"-52":"-10", Range:usize:"-53":"-11", + ]; + }; } pub(crate) use impl_niche; diff --git a/src/num/int/wrapper/impl_base.rs b/src/num/int/wrapper/impl_base.rs index 34578a6c..b6ec5da0 100644 --- a/src/num/int/wrapper/impl_base.rs +++ b/src/num/int/wrapper/impl_base.rs @@ -20,9 +20,9 @@ use crate::{ // $t: the integer primitive input/output type, and the niche inner type // $d: the doclink suffix for the method name -macro_rules! impl_base { - (prim_signed $( $t:ty : $d:literal ),+) => { $( impl_base![@prim_signed $t:$d]; )+ }; - (prim_unsigned $( $t:ty : $d:literal ),+) => { $( impl_base![@prim_unsigned $t:$d]; )+ }; +macro_rules! impl_int { + (prim_signed $( $t:ty : $d:literal ),+) => { $( impl_int![@prim_signed $t:$d]; )+ }; + (prim_unsigned $( $t:ty : $d:literal ),+) => { $( impl_int![@prim_unsigned $t:$d]; )+ }; // implements ops on signed primitives (@prim_signed $t:ty : $d:literal) => { paste! { @@ -260,7 +260,7 @@ macro_rules! impl_base { // $d: the doclink suffix for the method name // $dt: the doclink suffix for the associated method name implemented for the inner primitive (niche $( $n:ident : $t:ident <$($g:ident),*> : $d:literal : $dt: literal),+ $(,)? ) => { - $( impl_base![@niche $n:$t <$($g),*> : $d:$dt ]; )+ + $( impl_int![@niche $n:$t <$($g),*> : $d:$dt ]; )+ }; (@niche $n:ident : $t:ident <$($g:ident),*> : $d:literal : $dt: literal) => { paste! { #[doc = "# Integer base related methods for `" [<$n$t:camel>] "`\n\n"] @@ -282,35 +282,7 @@ macro_rules! impl_base { } }}; } -impl_base![prim_signed i8:"", i16:"-1", i32:"-2", i64:"-3", i128:"-4", isize:"-5"]; -impl_base![prim_unsigned u8:"-6", u16:"-7", u32:"-8", u64:"-9", u128:"-10", usize:"-11"]; +impl_int![prim_signed i8:"", i16:"-1", i32:"-2", i64:"-3", i128:"-4", isize:"-5"]; +impl_int![prim_unsigned u8:"-6", u16:"-7", u32:"-8", u64:"-9", u128:"-10", usize:"-11"]; #[cfg(feature = "num_int_niche")] -impl_base![niche - NonZero:i8<>:"-18":"", NonZero:i16<>:"-19":"-1", - NonZero:i32<>:"-20":"-2", NonZero:i64<>:"-21":"-3", - NonZero:i128<>:"-22":"-4", NonZero:isize<>:"-23":"-5", - NonZero:u8<>:"-12":"-6", NonZero:u16<>:"-13":"-7", - NonZero:u32<>:"-14":"-8", NonZero:u64<>:"-15":"-9", - NonZero:u128<>:"-16":"-10", NonZero:usize<>:"-17":"-11", - // - NonSpecific:i8:"-30":"", NonSpecific:i16:"-31":"-1", - NonSpecific:i32:"-32":"-2", NonSpecific:i64:"-33":"-3", - NonSpecific:i128:"-34":"-4", NonSpecific:isize:"-35":"-5", - NonSpecific:u8:"-24":"-6", NonSpecific:u16:"-25":"-7", - NonSpecific:u32:"-26":"-8", NonSpecific:u64:"-27":"-9", - NonSpecific:u128:"-28":"-10", NonSpecific:usize:"-29":"-11", - // - NonRange:i8:"-42":"", NonRange:i16:"-43":"-1", - NonRange:i32:"-44":"-2", NonRange:i64:"-45":"-3", - NonRange:i128:"-46":"-4", NonRange:isize:"-47":"-5", - NonRange:u8:"-36":"-6", NonRange:u16:"-37":"-7", - NonRange:u32:"-38":"-8", NonRange:u64:"-39":"-9", - NonRange:u128:"-40":"-10", NonRange:usize:"-41":"11", - // - Range:i8:"-54":"", Range:i16:"-55":"-1", - Range:i32:"-56":"-2", Range:i64:"-57":"-3", - Range:i128:"-58":"-4", Range:isize:"-59":"-5", - Range:u8:"-48":"-6", Range:u16:"-49":"-7", - Range:u32:"-50":"-8", Range:u64:"-51":"-9", - Range:u128:"-52":"-10", Range:usize:"-53":"-11", -]; +impl_niche![impl_int]; diff --git a/src/num/int/wrapper/impl_combinatorics.rs b/src/num/int/wrapper/impl_combinatorics.rs index 056642e7..a9ccb1bb 100644 --- a/src/num/int/wrapper/impl_combinatorics.rs +++ b/src/num/int/wrapper/impl_combinatorics.rs @@ -20,9 +20,9 @@ use NumErrors::{MismatchedSizes, NonNegativeRequired, Overflow}; // $t: the input/output type // $d: the doclink suffix for the method name -macro_rules! impl_combinatorics { - (signed $( $t:ty : $d:literal ),+) => { $( impl_combinatorics![@signed $t:$d]; )+ }; - (unsigned $( $t:ty : $d:literal ),+) => { $( impl_combinatorics![@unsigned $t:$d]; )+ }; +macro_rules! impl_int { + (signed $( $t:ty : $d:literal ),+) => { $( impl_int![@signed $t:$d]; )+ }; + (unsigned $( $t:ty : $d:literal ),+) => { $( impl_int![@unsigned $t:$d]; )+ }; // implements signed ops (@signed $t:ty : $d:literal) => { paste! { @@ -561,7 +561,7 @@ macro_rules! impl_combinatorics { // $d: the doclink suffix for the method name // $dt: the doclink suffix for the associated method name implemented for the inner primitive (niche $( $n:ident : $t:ident <$($g:ident),*> : $d:literal : $dt: literal),+ $(,)? ) => { - $( impl_combinatorics![@niche $n:$t <$($g),*> : $d:$dt ]; )+ + $( impl_int![@niche $n:$t <$($g),*> : $d:$dt ]; )+ }; (@niche $n:ident : $t:ident <$($g:ident),*> : $d:literal : $dt: literal) => { paste! { #[doc = "# Integer combinatorics related methods for `" $t "`\n\n"] @@ -583,35 +583,7 @@ macro_rules! impl_combinatorics { } }}; } -impl_combinatorics![signed i8:"", i16:"-1", i32:"-2", i64:"-3", i128:"-4", isize:"-5"]; -impl_combinatorics![unsigned u8:"-6", u16:"-7", u32:"-8", u64:"-9", u128:"-10", usize:"-11"]; +impl_int![signed i8:"", i16:"-1", i32:"-2", i64:"-3", i128:"-4", isize:"-5"]; +impl_int![unsigned u8:"-6", u16:"-7", u32:"-8", u64:"-9", u128:"-10", usize:"-11"]; #[cfg(feature = "num_int_niche")] -impl_combinatorics![niche - NonZero:i8<>:"-18":"", NonZero:i16<>:"-19":"-1", - NonZero:i32<>:"-20":"-2", NonZero:i64<>:"-21":"-3", - NonZero:i128<>:"-22":"-4", NonZero:isize<>:"-23":"-5", - NonZero:u8<>:"-12":"-6", NonZero:u16<>:"-13":"-7", - NonZero:u32<>:"-14":"-8", NonZero:u64<>:"-15":"-9", - NonZero:u128<>:"-16":"-10", NonZero:usize<>:"-17":"-11", - // - NonSpecific:i8:"-30":"", NonSpecific:i16:"-31":"-1", - NonSpecific:i32:"-32":"-2", NonSpecific:i64:"-33":"-3", - NonSpecific:i128:"-34":"-4", NonSpecific:isize:"-35":"-5", - NonSpecific:u8:"-24":"-6", NonSpecific:u16:"-25":"-7", - NonSpecific:u32:"-26":"-8", NonSpecific:u64:"-27":"-9", - NonSpecific:u128:"-28":"-10", NonSpecific:usize:"-29":"-11", - // - NonRange:i8:"-42":"", NonRange:i16:"-43":"-1", - NonRange:i32:"-44":"-2", NonRange:i64:"-45":"-3", - NonRange:i128:"-46":"-4", NonRange:isize:"-47":"-5", - NonRange:u8:"-36":"-6", NonRange:u16:"-37":"-7", - NonRange:u32:"-38":"-8", NonRange:u64:"-39":"-9", - NonRange:u128:"-40":"-10", NonRange:usize:"-41":"11", - // - Range:i8:"-54":"", Range:i16:"-55":"-1", - Range:i32:"-56":"-2", Range:i64:"-57":"-3", - Range:i128:"-58":"-4", Range:isize:"-59":"-5", - Range:u8:"-48":"-6", Range:u16:"-49":"-7", - Range:u32:"-50":"-8", Range:u64:"-51":"-9", - Range:u128:"-52":"-10", Range:usize:"-53":"-11", -]; +impl_niche![impl_int]; diff --git a/src/num/int/wrapper/impl_core.rs b/src/num/int/wrapper/impl_core.rs index 2b30a945..f0cb9708 100644 --- a/src/num/int/wrapper/impl_core.rs +++ b/src/num/int/wrapper/impl_core.rs @@ -27,9 +27,9 @@ use { // $t: the input/output type // $up: the upcasted type to do the operations on (for lcm) // $d: the doclink suffix for the method name -macro_rules! impl_core { - (signed $( $t:ty : $up:ty : $d:literal ),+) => { $( impl_core![@signed $t:$up:$d]; )+ }; - (unsigned $( $t:ty : $up:ty : $d:literal ),+) => { $( impl_core![@unsigned $t:$up:$d]; )+ }; +macro_rules! impl_int { + (signed $( $t:ty : $up:ty : $d:literal ),+) => { $( impl_int![@signed $t:$up:$d]; )+ }; + (unsigned $( $t:ty : $up:ty : $d:literal ),+) => { $( impl_int![@unsigned $t:$up:$d]; )+ }; // implements signed ops (@signed $t:ty : $up:ty : $d:literal) => { paste! { @@ -440,7 +440,7 @@ macro_rules! impl_core { // $d: the doclink suffix for the method name // $dt: the doclink suffix for the associated method name implemented for the inner primitive (niche $( $n:ident : $t:ident <$($g:ident),*> : $d:literal : $dt: literal),+ $(,)? ) => { - $( impl_core![@niche $n:$t <$($g),*> : $d:$dt ]; )+ + $( impl_int![@niche $n:$t <$($g),*> : $d:$dt ]; )+ }; (@niche $n:ident : $t:ident <$($g:ident),*> : $d:literal : $dt: literal) => { paste! { #[doc = "# Integer core methods for `" $t "`\n\n"] @@ -470,37 +470,9 @@ macro_rules! impl_core { } }}; } -impl_core![signed +impl_int![signed i8:i16:"", i16:i32:"-1", i32:i64:"-2", i64:i128:"-3", i128:i128:"-4", isize:isize_up:"-5"]; -impl_core![unsigned +impl_int![unsigned u8:u16:"-6", u16:u32:"-7", u32:u64:"-8", u64:u128:"-9", u128:u128:"-10", usize:usize_up:"-11"]; #[cfg(feature = "num_int_niche")] -impl_core![niche - NonZero:i8<>:"-18":"", NonZero:i16<>:"-19":"-1", - NonZero:i32<>:"-20":"-2", NonZero:i64<>:"-21":"-3", - NonZero:i128<>:"-22":"-4", NonZero:isize<>:"-23":"-5", - NonZero:u8<>:"-12":"-6", NonZero:u16<>:"-13":"-7", - NonZero:u32<>:"-14":"-8", NonZero:u64<>:"-15":"-9", - NonZero:u128<>:"-16":"-10", NonZero:usize<>:"-17":"-11", - // - NonSpecific:i8:"-30":"", NonSpecific:i16:"-31":"-1", - NonSpecific:i32:"-32":"-2", NonSpecific:i64:"-33":"-3", - NonSpecific:i128:"-34":"-4", NonSpecific:isize:"-35":"-5", - NonSpecific:u8:"-24":"-6", NonSpecific:u16:"-25":"-7", - NonSpecific:u32:"-26":"-8", NonSpecific:u64:"-27":"-9", - NonSpecific:u128:"-28":"-10", NonSpecific:usize:"-29":"-11", - // - NonRange:i8:"-42":"", NonRange:i16:"-43":"-1", - NonRange:i32:"-44":"-2", NonRange:i64:"-45":"-3", - NonRange:i128:"-46":"-4", NonRange:isize:"-47":"-5", - NonRange:u8:"-36":"-6", NonRange:u16:"-37":"-7", - NonRange:u32:"-38":"-8", NonRange:u64:"-39":"-9", - NonRange:u128:"-40":"-10", NonRange:usize:"-41":"11", - // - Range:i8:"-54":"", Range:i16:"-55":"-1", - Range:i32:"-56":"-2", Range:i64:"-57":"-3", - Range:i128:"-58":"-4", Range:isize:"-59":"-5", - Range:u8:"-48":"-6", Range:u16:"-49":"-7", - Range:u32:"-50":"-8", Range:u64:"-51":"-9", - Range:u128:"-52":"-10", Range:usize:"-53":"-11", -]; +impl_niche![impl_int]; diff --git a/src/num/int/wrapper/impl_div.rs b/src/num/int/wrapper/impl_div.rs index 44d66e78..884a8066 100644 --- a/src/num/int/wrapper/impl_div.rs +++ b/src/num/int/wrapper/impl_div.rs @@ -21,9 +21,9 @@ use crate::{ // $t: the input/output type // $d: the doclink suffix for the method name -macro_rules! impl_div { - (signed $( $t:ty : $d:literal ),+) => { $( impl_div![@signed $t:$d]; )+ }; - (unsigned $( $t:ty : $d:literal ),+) => { $( impl_div![@unsigned $t:$d]; )+ }; +macro_rules! impl_int { + (signed $( $t:ty : $d:literal ),+) => { $( impl_int![@signed $t:$d]; )+ }; + (unsigned $( $t:ty : $d:literal ),+) => { $( impl_int![@unsigned $t:$d]; )+ }; // implements signed ops (@signed $t:ty : $d:literal) => { paste! { @@ -375,7 +375,7 @@ macro_rules! impl_div { // $d: the doclink suffix for the method name // $dt: the doclink suffix for the associated method name implemented for the inner primitive (niche $( $n:ident : $t:ident <$($g:ident),*> : $d:literal : $dt: literal),+ $(,)? ) => { - $( impl_div![@niche $n:$t <$($g),*> : $d:$dt ]; )+ + $( impl_int![@niche $n:$t <$($g),*> : $d:$dt ]; )+ }; (@niche $n:ident : $t:ident <$($g:ident),*> : $d:literal : $dt: literal) => { paste! { #[doc = "# Integer division related methods for `" $t "`\n\n"] @@ -399,35 +399,7 @@ macro_rules! impl_div { } }}; } -impl_div![signed i8:"", i16:"-1", i32:"-2", i64:"-3", i128:"-4", isize:"-5"]; -impl_div![unsigned u8:"-6", u16:"-7", u32:"-8", u64:"-9", u128:"-10", usize:"-11"]; +impl_int![signed i8:"", i16:"-1", i32:"-2", i64:"-3", i128:"-4", isize:"-5"]; +impl_int![unsigned u8:"-6", u16:"-7", u32:"-8", u64:"-9", u128:"-10", usize:"-11"]; #[cfg(feature = "num_int_niche")] -impl_div![niche - NonZero:i8<>:"-18":"", NonZero:i16<>:"-19":"-1", - NonZero:i32<>:"-20":"-2", NonZero:i64<>:"-21":"-3", - NonZero:i128<>:"-22":"-4", NonZero:isize<>:"-23":"-5", - NonZero:u8<>:"-12":"-6", NonZero:u16<>:"-13":"-7", - NonZero:u32<>:"-14":"-8", NonZero:u64<>:"-15":"-9", - NonZero:u128<>:"-16":"-10", NonZero:usize<>:"-17":"-11", - // - NonSpecific:i8:"-30":"", NonSpecific:i16:"-31":"-1", - NonSpecific:i32:"-32":"-2", NonSpecific:i64:"-33":"-3", - NonSpecific:i128:"-34":"-4", NonSpecific:isize:"-35":"-5", - NonSpecific:u8:"-24":"-6", NonSpecific:u16:"-25":"-7", - NonSpecific:u32:"-26":"-8", NonSpecific:u64:"-27":"-9", - NonSpecific:u128:"-28":"-10", NonSpecific:usize:"-29":"-11", - // - NonRange:i8:"-42":"", NonRange:i16:"-43":"-1", - NonRange:i32:"-44":"-2", NonRange:i64:"-45":"-3", - NonRange:i128:"-46":"-4", NonRange:isize:"-47":"-5", - NonRange:u8:"-36":"-6", NonRange:u16:"-37":"-7", - NonRange:u32:"-38":"-8", NonRange:u64:"-39":"-9", - NonRange:u128:"-40":"-10", NonRange:usize:"-41":"11", - // - Range:i8:"-54":"", Range:i16:"-55":"-1", - Range:i32:"-56":"-2", Range:i64:"-57":"-3", - Range:i128:"-58":"-4", Range:isize:"-59":"-5", - Range:u8:"-48":"-6", Range:u16:"-49":"-7", - Range:u32:"-50":"-8", Range:u64:"-51":"-9", - Range:u128:"-52":"-10", Range:usize:"-53":"-11", -]; +impl_niche![impl_int]; diff --git a/src/num/int/wrapper/impl_factors.rs b/src/num/int/wrapper/impl_factors.rs index d190292d..1d264a61 100644 --- a/src/num/int/wrapper/impl_factors.rs +++ b/src/num/int/wrapper/impl_factors.rs @@ -29,9 +29,9 @@ use { // $t: the input/output type // $d: the doclink suffix for the method name -macro_rules! impl_factors { - (signed $( $t:ty : $d:literal ),+) => { $( impl_factors![@signed $t:$d]; )+ }; - (unsigned $( $t:ty : $d:literal ),+) => { $( impl_factors![@unsigned $t:$d]; )+ }; +macro_rules! impl_int { + (signed $( $t:ty : $d:literal ),+) => { $( impl_int![@signed $t:$d]; )+ }; + (unsigned $( $t:ty : $d:literal ),+) => { $( impl_int![@unsigned $t:$d]; )+ }; // implements signed ops (@signed $t:ty : $d:literal) => { paste! { @@ -710,5 +710,5 @@ macro_rules! impl_factors { } }}; } -impl_factors![signed i8:"", i16:"-1", i32:"-2", i64:"-3", i128:"-4", isize:"-5"]; -impl_factors![unsigned u8:"-6", u16:"-7", u32:"-8", u64:"-9", u128:"-10", usize:"-11"]; +impl_int![signed i8:"", i16:"-1", i32:"-2", i64:"-3", i128:"-4", isize:"-5"]; +impl_int![unsigned u8:"-6", u16:"-7", u32:"-8", u64:"-9", u128:"-10", usize:"-11"]; diff --git a/src/num/int/wrapper/impl_prime.rs b/src/num/int/wrapper/impl_prime.rs index d45bd810..5c8f8e0f 100644 --- a/src/num/int/wrapper/impl_prime.rs +++ b/src/num/int/wrapper/impl_prime.rs @@ -18,9 +18,9 @@ use NumErrors::Overflow; // $t: the input/output type // $up: the upcasted type to do the operations on (for prime_pi) // $d: the doclink suffix for the method name -macro_rules! impl_base { - (signed $( $t:ty : $up:ty : $d:literal ),+) => { $( impl_base![@signed $t:$up:$d]; )+ }; - (unsigned $( $t:ty : $up:ty : $d:literal ),+) => { $( impl_base![@unsigned $t:$up:$d]; )+ }; +macro_rules! impl_int { + (signed $( $t:ty : $up:ty : $d:literal ),+) => { $( impl_int![@signed $t:$up:$d]; )+ }; + (unsigned $( $t:ty : $up:ty : $d:literal ),+) => { $( impl_int![@unsigned $t:$up:$d]; )+ }; // implements signed ops (@signed $t:ty : $up: ty : $d:literal) => { paste! { @@ -282,7 +282,7 @@ macro_rules! impl_base { } }}; } -impl_base![signed +impl_int![signed i8:i16:"", i16:i32:"-1", i32:i64:"-2", i64:i128:"-3", i128:i128:"-4", isize:isize_up:"-5"]; -impl_base![unsigned +impl_int![unsigned u8:u16:"-6", u16:u32:"-7", u32:u64:"-8", u64:u128:"-9", u128:u128:"-10", usize:usize_up:"-11"];