diff --git a/Cargo.toml b/Cargo.toml index f5d29b7..807a6f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ repository = "https://github.com/vks/average" version = "0.9.3" [features] -serde1 = ["serde", "serde_derive"] +serde1 = ["serde", "serde_derive", "serde-big-array"] [[bench]] harness = false @@ -31,6 +31,7 @@ num-integer = "0.1" float-ord = "0.2" serde = { version = "1", optional = true } serde_derive = { version = "1", optional = true } +serde-big-array = { version = "0.1.4", optional = true } [dependencies.conv] default-features = false diff --git a/src/histogram.rs b/src/histogram.rs index e4c60ec..1d14e50 100644 --- a/src/histogram.rs +++ b/src/histogram.rs @@ -12,6 +12,8 @@ /// ``` /// # extern crate core; /// # #[macro_use] extern crate average; +/// # #[cfg(feature = "serde1")] #[macro_use] extern crate serde_derive; +/// # #[cfg(feature = "serde1")] #[macro_use] extern crate serde_big_array; /// # fn main() { /// use average::Histogram; /// @@ -28,27 +30,33 @@ macro_rules! define_histogram { ($name:ident, $LEN:expr) => ( mod $name { use $crate::Histogram as Trait; + #[cfg(feature = "serde1")] big_array! { + BigArray; LEN, (LEN + 1), + } /// The number of bins of the histogram. const LEN: usize = $LEN; /// A histogram with a number of bins known at compile time. #[derive(Clone)] + #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Histogram { /// The ranges defining the bins of the histogram. + #[cfg_attr(feature = "serde1", serde(with = "BigArray"))] range: [f64; LEN + 1], /// The bins of the histogram. + #[cfg_attr(feature = "serde1", serde(with = "BigArray"))] bin: [u64; LEN], } impl ::core::fmt::Debug for Histogram { fn fmt(&self, formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { - write!(formatter, "Histogram {{ range: ")?; + formatter.write_str("Histogram {{ range: ")?; self.range[..].fmt(formatter)?; - write!(formatter, ", bins: ")?; + formatter.write_str(", bins: ")?; self.bin[..].fmt(formatter)?; - write!(formatter, " }}") + formatter.write_str(" }}") } } diff --git a/src/lib.rs b/src/lib.rs index 76b0fa1..420ac05 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -96,6 +96,8 @@ extern crate float_ord; extern crate serde; #[cfg(feature = "serde1")] #[macro_use] extern crate serde_derive; +#[cfg(feature = "serde1")] +#[macro_use] extern crate serde_big_array; extern crate num_traits; extern crate num_integer; diff --git a/src/weighted_mean.rs b/src/weighted_mean.rs index 914b123..ac9ca52 100644 --- a/src/weighted_mean.rs +++ b/src/weighted_mean.rs @@ -148,7 +148,7 @@ impl Merge for WeightedMean { /// println!("The weighted mean is {} ± {}.", a.weighted_mean(), a.error()); /// ``` #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct WeightedMeanWithError { /// Sum of the squares of the weights. weight_sum_sq: f64, diff --git a/tests/histogram.rs b/tests/histogram.rs index c789bfd..0754949 100644 --- a/tests/histogram.rs +++ b/tests/histogram.rs @@ -2,6 +2,12 @@ extern crate core; extern crate rand; +#[cfg(feature = "serde1")] +#[macro_use] extern crate serde_derive; +#[cfg(feature = "serde1")] +extern crate serde_json; +#[cfg(feature = "serde1")] +#[macro_use] extern crate serde_big_array; use core::iter::Iterator; use rand::distributions::Distribution; @@ -228,3 +234,19 @@ fn merge() { println!("{:?}", h1.bins()); assert_eq!(h.bins(), h1.bins()); } + +#[cfg(feature = "serde1")] +#[test] +fn simple_serde() { + /* + let mut a = Histogram10::from_ranges( + [0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.8, 0.9, 1.0, 2.0].iter().cloned()).unwrap(); + for &i in &[0.05, 0.7, 1.0, 1.5] { + h.add(i).unwrap(); + } + let b = serde_json::to_string(&a).unwrap(); + assert_eq!(&b, "{\"avg\":{\"avg\":3.0,\"n\":5},\"sum_2\":10.0}"); + let c: Histogram10 = serde_json::from_str(&b).unwrap(); + assert_eq!(h.bins(), &[1, 0, 0, 0, 0, 0, 1, 0, 0, 2]); + */ +} diff --git a/tests/kurtosis.rs b/tests/kurtosis.rs index 8b6c707..dfb2b12 100644 --- a/tests/kurtosis.rs +++ b/tests/kurtosis.rs @@ -3,7 +3,7 @@ #[macro_use] extern crate average; extern crate core; -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] extern crate serde_json; use core::iter::Iterator; @@ -43,7 +43,7 @@ fn simple() { assert_almost_eq!(a.kurtosis(), -1.365, 1e-15); } -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] #[test] fn simple_serde() { let a: Kurtosis = (1..6).map(f64::from).collect(); diff --git a/tests/max.rs b/tests/max.rs index 7f14811..46e6827 100644 --- a/tests/max.rs +++ b/tests/max.rs @@ -3,7 +3,7 @@ extern crate average; extern crate core; -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] extern crate serde_json; use core::iter::Iterator; @@ -21,7 +21,7 @@ fn trivial() { assert_eq!(m.max(), 3.) } -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] #[test] fn trivial_serde() { let mut m = Max::new(); diff --git a/tests/mean.rs b/tests/mean.rs index 156d2b6..b0f8c88 100644 --- a/tests/mean.rs +++ b/tests/mean.rs @@ -37,7 +37,7 @@ fn simple() { assert_almost_eq!(a.error(), f64::sqrt(0.5), 1e-16); } -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] #[test] fn simple_serde() { let a: MeanWithError = (1..6).map(f64::from).collect(); diff --git a/tests/min.rs b/tests/min.rs index b50173d..5c0fadc 100644 --- a/tests/min.rs +++ b/tests/min.rs @@ -3,7 +3,7 @@ extern crate average; extern crate core; -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] extern crate serde_json; use core::iter::Iterator; @@ -21,7 +21,7 @@ fn trivial() { assert_eq!(m.min(), -1.) } -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] #[test] fn trivial_serde() { let mut m = Min::new(); diff --git a/tests/moments.rs b/tests/moments.rs index 67949aa..9bb6728 100644 --- a/tests/moments.rs +++ b/tests/moments.rs @@ -3,7 +3,7 @@ #[macro_use] extern crate average; extern crate core; -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] extern crate serde_json; use core::iter::Iterator; @@ -53,12 +53,12 @@ fn simple() { assert_almost_eq!(a.standardized_moment(4), -1.365 + 3.0, 1e-14); } -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] #[test] fn simple_serde() { let a: Moments4 = (1..6).map(f64::from).collect(); let b = serde_json::to_string(&a).unwrap(); - assert_eq!(&b, "{\"n\":5,\"avg\":3.0,\"m\":[10.0,1.7763568394002506e-15,34.00000000000001]}"); + assert_eq!(&b, "{\"n\":5,\"avg\":3.0,\"m\":[10.0,1.7763568394002505e-15,34.00000000000001]}"); let mut c: Moments4 = serde_json::from_str(&b).unwrap(); assert_eq!(c.len(), 5); assert_eq!(c.mean(), 3.0); diff --git a/tests/quantile.rs b/tests/quantile.rs index 3afb152..d2d8936 100644 --- a/tests/quantile.rs +++ b/tests/quantile.rs @@ -1,7 +1,7 @@ #![cfg_attr(feature = "cargo-clippy", allow(float_cmp, map_clone))] extern crate average; -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] extern crate serde_json; extern crate quantiles; @@ -27,7 +27,7 @@ fn few_observations() { assert_eq!(q.quantile(), 2.5); } -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] #[test] fn few_observations_serde() { let mut q = Quantile::new(0.5); diff --git a/tests/skewness.rs b/tests/skewness.rs index 9dbddfd..4cd23a6 100644 --- a/tests/skewness.rs +++ b/tests/skewness.rs @@ -3,7 +3,7 @@ #[macro_use] extern crate average; extern crate core; -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] extern crate serde_json; use core::iter::Iterator; @@ -42,7 +42,7 @@ fn simple() { assert_almost_eq!(a.skewness(), 0.2795084971874741, 1e-15); } -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] #[test] fn simple_serde() { let a: Skewness = (1..6).map(f64::from).collect(); diff --git a/tests/weighted_mean.rs b/tests/weighted_mean.rs index 3f4816a..b39b148 100644 --- a/tests/weighted_mean.rs +++ b/tests/weighted_mean.rs @@ -3,7 +3,7 @@ #[macro_use] extern crate average; extern crate core; -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] extern crate serde_json; use core::iter::Iterator; @@ -45,7 +45,7 @@ fn simple() { assert_almost_eq!(a.error(), f64::sqrt(0.5), 1e-16); } -#[cfg(feature = "serde")] +#[cfg(feature = "serde1")] #[test] fn simple_serde() { let a: WeightedMeanWithError = (1..6).map(|x| (f64::from(x), 1.0)).collect();