diff --git a/Cargo.toml b/Cargo.toml index 6f5f514..82056ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,11 +23,6 @@ module_name_repetitions = "allow" [features] serde = ["dep:serde"] -[[bench]] -name = "main" -path = "benches/main.rs" -harness = false - [dependencies] num-traits = "0.2.19" paste = "1.0.15" @@ -55,3 +50,8 @@ inherits = "release" lto = "fat" codegen-units = 1 incremental = false + +[[bench]] +name = "main" +path = "benches/main.rs" +harness = false diff --git a/benches/add.rs b/benches/add.rs index b58c8fd..c6fbbe5 100644 --- a/benches/add.rs +++ b/benches/add.rs @@ -1,6 +1,7 @@ -use const_decimal::{Decimal, Integer, Primitive}; +use const_decimal::{Decimal, Integer}; use criterion::measurement::WallTime; use criterion::{black_box, BatchSize, BenchmarkGroup}; +use num_traits::PrimInt; use prop::strategy::ValueTree; use prop::test_runner::TestRunner; use proptest::prelude::*; @@ -15,7 +16,7 @@ where fn bench_primitive_add(group: &mut BenchmarkGroup<'_, WallTime>) where - I: Primitive + Arbitrary, + I: PrimInt + Arbitrary, { // Use proptest to generate arbitrary input values. let mut runner = TestRunner::deterministic(); diff --git a/benches/div.rs b/benches/div.rs index ca332e3..a06244b 100644 --- a/benches/div.rs +++ b/benches/div.rs @@ -1,9 +1,10 @@ use std::fmt::Debug; use std::ops::Div; -use const_decimal::{Decimal, Integer, Primitive}; +use const_decimal::{Decimal, Integer}; use criterion::measurement::WallTime; use criterion::{black_box, BatchSize, BenchmarkGroup}; +use num_traits::{ConstOne, ConstZero, PrimInt}; use prop::strategy::ValueTree; use prop::test_runner::TestRunner; use proptest::prelude::*; @@ -26,7 +27,7 @@ fn primitive_div( strategy: impl Strategy + Clone, strategy_label: &str, ) where - I: Primitive + Div, + I: PrimInt + ConstZero + ConstOne, { // Use proptest to generate arbitrary input values. let mut runner = TestRunner::deterministic(); diff --git a/benches/main.rs b/benches/main.rs index 71b2106..f593f35 100644 --- a/benches/main.rs +++ b/benches/main.rs @@ -30,6 +30,7 @@ fn main() { bench_integers::<9, u64>( &mut criterion.benchmark_group("u64_9"), 0..(u32::MAX as u64), + // TODO: This upper bound is lower than necessary. ((u32::MAX as u64) - 10u64.pow(9) + 1)..(u64::MAX / 10u64.pow(9)), (u64::MAX / 10u64.pow(9) + 1)..u64::MAX, ); @@ -44,6 +45,7 @@ fn main() { bench_integers::<18, u128>( &mut criterion.benchmark_group("u128_18"), 0..(u64::MAX as u128), + // TODO: This upper bound is lower than necessary. ((u64::MAX as u128) - 10u128.pow(18) + 1)..(u128::MAX / 10u128.pow(18)), (u128::MAX / 10u128.pow(18) + 1)..u128::MAX, ); diff --git a/benches/mul.rs b/benches/mul.rs index 2544501..73b6c77 100644 --- a/benches/mul.rs +++ b/benches/mul.rs @@ -1,8 +1,9 @@ use std::fmt::Debug; -use const_decimal::{Decimal, Integer, Primitive}; +use const_decimal::{Decimal, Integer}; use criterion::measurement::WallTime; use criterion::{black_box, BatchSize, BenchmarkGroup}; +use num_traits::PrimInt; use prop::strategy::ValueTree; use prop::test_runner::TestRunner; use proptest::prelude::*; @@ -25,7 +26,7 @@ fn primitive_mul( strategy: impl Strategy + Clone, strategy_label: &str, ) where - I: Primitive, + I: PrimInt, { // Use proptest to generate arbitrary input values. let mut runner = TestRunner::deterministic(); diff --git a/benches/sub.rs b/benches/sub.rs index 3edb9f3..99e763d 100644 --- a/benches/sub.rs +++ b/benches/sub.rs @@ -1,6 +1,7 @@ -use const_decimal::{Decimal, Integer, Primitive}; +use const_decimal::{Decimal, Integer}; use criterion::measurement::WallTime; use criterion::{black_box, BatchSize, BenchmarkGroup}; +use num_traits::PrimInt; use prop::strategy::ValueTree; use prop::test_runner::TestRunner; use proptest::prelude::*; @@ -15,7 +16,7 @@ where fn bench_primitive_sub(group: &mut BenchmarkGroup<'_, WallTime>) where - I: Primitive + Arbitrary, + I: PrimInt + Arbitrary, { // Use proptest to generate arbitrary input values. let mut runner = TestRunner::deterministic(); diff --git a/src/display.rs b/src/display.rs index 0ec8aa9..3386ae0 100644 --- a/src/display.rs +++ b/src/display.rs @@ -59,7 +59,9 @@ where let shortfall = D as usize - fractional_s_len; // TODO: Remove the `checked_mul` in favor of ensuring `D` cannot overflow. - fractional.checked_mul(&I::pow(I::TEN, shortfall)).unwrap() + fractional + .checked_mul(&I::pow(I::TEN, shortfall.try_into().unwrap())) + .unwrap() } Ordering::Greater => return Err(ParseDecimalError::PrecisionLoss(fractional_s.len())), }; diff --git a/src/integer.rs b/src/integer.rs index 24a0c6e..466acb1 100644 --- a/src/integer.rs +++ b/src/integer.rs @@ -3,70 +3,43 @@ use std::num::ParseIntError; use std::ops::{Not, Shr}; use std::str::FromStr; -use num_traits::{ - Bounded, CheckedAdd, CheckedDiv, CheckedMul, CheckedNeg, CheckedRem, CheckedSub, ConstOne, - ConstZero, One, Pow, WrappingAdd, -}; +use num_traits::{CheckedNeg, CheckedRem, ConstOne, ConstZero, One, PrimInt, WrappingAdd}; use crate::cheats::Cheats; use crate::full_mul_div::FullMulDiv; -pub trait Primitive: - // `num-traits` - ConstZero +pub trait Integer: + PrimInt + + ConstZero + ConstOne + One - + Bounded - // `std` - + CheckedAdd + WrappingAdd - + CheckedSub - + CheckedMul - + CheckedDiv + CheckedRem + Not - + Pow + Shr - + Clone - + Copy - + PartialEq - + Eq - + PartialOrd - + Ord + Display + FromStr + + Cheats + + FullMulDiv { } -impl Primitive for T where - T: ConstZero +impl Integer for I where + I: PrimInt + + ConstZero + ConstOne + One - + Bounded - + CheckedAdd + WrappingAdd - + CheckedSub - + CheckedMul - + CheckedDiv + CheckedRem + Not - + Pow + Shr - + Clone - + Copy - + PartialEq - + Eq - + PartialOrd - + Ord + Display + FromStr + + Cheats + + FullMulDiv { } -pub trait Integer: Cheats + FullMulDiv + Primitive {} - -impl Integer for I where I: Cheats + FullMulDiv + Primitive {} - pub trait SignedInteger: Integer + CheckedNeg {} impl SignedInteger for I where I: Integer + CheckedNeg {}