Fix serde support

* Use correct Cargo flags.
* Fix tests.
* Fix histogram serialization.
This commit is contained in:
Vinzent Steinberg 2019-01-22 14:29:29 +01:00
parent 15ff7e9ab4
commit 547149bfd2
13 changed files with 54 additions and 21 deletions

View File

@ -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

View File

@ -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(" }}")
}
}

View File

@ -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;

View File

@ -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,

View File

@ -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]);
*/
}

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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();

View File

@ -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();