From 3f210e75f72dd9acdd7e2e2217490e6f10982a1f Mon Sep 17 00:00:00 2001 From: Vinzent Steinberg Date: Thu, 13 May 2021 14:41:46 -0300 Subject: [PATCH 1/6] Implement `Clone` and `Debug` for `Alphanumeric` --- src/distributions/other.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/distributions/other.rs b/src/distributions/other.rs index 9e58afd46e0..d1f060f483d 100644 --- a/src/distributions/other.rs +++ b/src/distributions/other.rs @@ -57,7 +57,7 @@ use std::mem::{self, MaybeUninit}; /// /// - [Wikipedia article on Password Strength](https://en.wikipedia.org/wiki/Password_strength) /// - [Diceware for generating memorable passwords](https://en.wikipedia.org/wiki/Diceware) -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Alphanumeric; From 2c32fe0b0451207fd5ff337e6dc30ec4c0376c50 Mon Sep 17 00:00:00 2001 From: Vinzent Steinberg Date: Thu, 13 May 2021 14:45:30 -0300 Subject: [PATCH 2/6] Implement `Clone` and `Debug` for `{Normal,}InverseGaussian` --- rand_distr/src/inverse_gaussian.rs | 2 +- rand_distr/src/normal_inverse_gaussian.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rand_distr/src/inverse_gaussian.rs b/rand_distr/src/inverse_gaussian.rs index 7af645a23c4..195becdf28a 100644 --- a/rand_distr/src/inverse_gaussian.rs +++ b/rand_distr/src/inverse_gaussian.rs @@ -12,7 +12,7 @@ pub enum Error { } /// The [inverse Gaussian distribution](https://en.wikipedia.org/wiki/Inverse_Gaussian_distribution) -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] pub struct InverseGaussian where F: Float, diff --git a/rand_distr/src/normal_inverse_gaussian.rs b/rand_distr/src/normal_inverse_gaussian.rs index 252a319d877..5ccc3b64cf6 100644 --- a/rand_distr/src/normal_inverse_gaussian.rs +++ b/rand_distr/src/normal_inverse_gaussian.rs @@ -12,7 +12,7 @@ pub enum Error { } /// The [normal-inverse Gaussian distribution](https://en.wikipedia.org/wiki/Normal-inverse_Gaussian_distribution) -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] pub struct NormalInverseGaussian where F: Float, From 18bea4ca94de1e07dfc24ee4181eb1ab4949eb45 Mon Sep 17 00:00:00 2001 From: Vinzent Steinberg Date: Thu, 13 May 2021 14:52:23 -0300 Subject: [PATCH 3/6] Add missing impls to `*InverseGaussian` errors --- rand_distr/src/inverse_gaussian.rs | 2 +- rand_distr/src/normal_inverse_gaussian.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rand_distr/src/inverse_gaussian.rs b/rand_distr/src/inverse_gaussian.rs index 195becdf28a..5b8678b982e 100644 --- a/rand_distr/src/inverse_gaussian.rs +++ b/rand_distr/src/inverse_gaussian.rs @@ -3,7 +3,7 @@ use num_traits::Float; use rand::Rng; /// Error type returned from `InverseGaussian::new` -#[derive(Debug, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Error { /// `mean <= 0` or `nan`. MeanNegativeOrNull, diff --git a/rand_distr/src/normal_inverse_gaussian.rs b/rand_distr/src/normal_inverse_gaussian.rs index 5ccc3b64cf6..630c2021fbc 100644 --- a/rand_distr/src/normal_inverse_gaussian.rs +++ b/rand_distr/src/normal_inverse_gaussian.rs @@ -3,7 +3,7 @@ use num_traits::Float; use rand::Rng; /// Error type returned from `NormalInverseGaussian::new` -#[derive(Debug, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Error { /// `alpha <= 0` or `nan`. AlphaNegativeOrNull, From 17dbc4c8b7808a2d50c7b205534ba7b6dfb07016 Mon Sep 17 00:00:00 2001 From: Vinzent Steinberg Date: Thu, 13 May 2021 16:21:31 -0300 Subject: [PATCH 4/6] Improve error formatting for `WeightedError` --- src/distributions/weighted_index.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/distributions/weighted_index.rs b/src/distributions/weighted_index.rs index 07ba53ec027..32da37f6cd3 100644 --- a/src/distributions/weighted_index.rs +++ b/src/distributions/weighted_index.rs @@ -439,15 +439,15 @@ pub enum WeightedError { } #[cfg(feature = "std")] -impl ::std::error::Error for WeightedError {} +impl std::error::Error for WeightedError {} impl fmt::Display for WeightedError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - WeightedError::NoItem => write!(f, "No weights provided."), - WeightedError::InvalidWeight => write!(f, "A weight is invalid."), - WeightedError::AllWeightsZero => write!(f, "All weights are zero."), - WeightedError::TooMany => write!(f, "Too many weights (hit u32::MAX)"), - } + f.write_str(match *self { + WeightedError::NoItem => "No weights provided in distribution", + WeightedError::InvalidWeight => "A weight is invalid in distribution", + WeightedError::AllWeightsZero => "All weights are zero in distribution", + WeightedError::TooMany => "Too many weights (hit u32::MAX) in distribution", + }) } } From f952177fcbeb46aa8edd7502cce30f9902631cbb Mon Sep 17 00:00:00 2001 From: Vinzent Steinberg Date: Thu, 13 May 2021 16:22:37 -0300 Subject: [PATCH 5/6] Implement `Error` and `Display` for all errors --- rand_distr/src/hypergeometric.rs | 4 ++++ rand_distr/src/inverse_gaussian.rs | 14 ++++++++++++++ rand_distr/src/normal_inverse_gaussian.rs | 14 ++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/rand_distr/src/hypergeometric.rs b/rand_distr/src/hypergeometric.rs index 512dd34c19b..507d7bb07f5 100644 --- a/rand_distr/src/hypergeometric.rs +++ b/rand_distr/src/hypergeometric.rs @@ -73,6 +73,10 @@ impl fmt::Display for Error { } } +#[cfg(feature = "std")] +#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] +impl std::error::Error for Error {} + // evaluate fact(numerator.0)*fact(numerator.1) / fact(denominator.0)*fact(denominator.1) fn fraction_of_products_of_factorials(numerator: (u64, u64), denominator: (u64, u64)) -> f64 { let min_top = u64::min(numerator.0, numerator.1); diff --git a/rand_distr/src/inverse_gaussian.rs b/rand_distr/src/inverse_gaussian.rs index 5b8678b982e..becb02b64f8 100644 --- a/rand_distr/src/inverse_gaussian.rs +++ b/rand_distr/src/inverse_gaussian.rs @@ -1,6 +1,7 @@ use crate::{Distribution, Standard, StandardNormal}; use num_traits::Float; use rand::Rng; +use core::fmt; /// Error type returned from `InverseGaussian::new` #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -11,6 +12,19 @@ pub enum Error { ShapeNegativeOrNull, } +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self { + Error::MeanNegativeOrNull => "mean <= 0 or is NaN in inverse Gaussian distribution", + Error::ShapeNegativeOrNull => "shape <= 0 or is NaN in inverse Gaussian distribution", + }) + } +} + +#[cfg(feature = "std")] +#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] +impl std::error::Error for Error {} + /// The [inverse Gaussian distribution](https://en.wikipedia.org/wiki/Inverse_Gaussian_distribution) #[derive(Debug, Clone, Copy)] pub struct InverseGaussian diff --git a/rand_distr/src/normal_inverse_gaussian.rs b/rand_distr/src/normal_inverse_gaussian.rs index 630c2021fbc..d8e44587d05 100644 --- a/rand_distr/src/normal_inverse_gaussian.rs +++ b/rand_distr/src/normal_inverse_gaussian.rs @@ -1,6 +1,7 @@ use crate::{Distribution, InverseGaussian, Standard, StandardNormal}; use num_traits::Float; use rand::Rng; +use core::fmt; /// Error type returned from `NormalInverseGaussian::new` #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -11,6 +12,19 @@ pub enum Error { AbsoluteBetaNotLessThanAlpha, } +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self { + Error::AlphaNegativeOrNull => "alpha <= 0 or is NaN in normal inverse Gaussian distribution", + Error::AbsoluteBetaNotLessThanAlpha => "|beta| >= alpha or is NaN in normal inverse Gaussian distribution", + }) + } +} + +#[cfg(feature = "std")] +#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] +impl std::error::Error for Error {} + /// The [normal-inverse Gaussian distribution](https://en.wikipedia.org/wiki/Normal-inverse_Gaussian_distribution) #[derive(Debug, Clone, Copy)] pub struct NormalInverseGaussian From f14cdeac169bb98373020816164b35b9dc4ccfdf Mon Sep 17 00:00:00 2001 From: Vinzent Steinberg Date: Thu, 13 May 2021 18:38:24 -0300 Subject: [PATCH 6/6] Update changelogs --- CHANGELOG.md | 1 + rand_distr/CHANGELOG.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e2838c3229..4945f5e8390 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ You may also find the [Upgrade Guide](https://rust-random.github.io/book/update. ## [Unreleased] ### Additions - Use const-generics to support arrays of all sizes (#1104) +- Implement `Clone` and `Copy` for `Alphanumeric` (#1126) ### Other - Reorder asserts in `Uniform` float distributions for easier debugging of non-finite arguments diff --git a/rand_distr/CHANGELOG.md b/rand_distr/CHANGELOG.md index 05cd23f59f8..346be3c26bb 100644 --- a/rand_distr/CHANGELOG.md +++ b/rand_distr/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Correctly document `no_std` support (#1100) - Add `std_math` feature to prefer `std` over `libm` for floating point math (#1100) - Add mean and std_dev accessors to Normal (#1114) +- Make sure all distributions and their error types implement `Error`, `Display`, `Clone`, + `Copy`, `PartialEq` and `Eq` as appropriate (#1126) ## [0.4.0] - 2020-12-18 - Bump `rand` to v0.8.0