diff --git a/Cargo.lock b/Cargo.lock index f8f0f43..fee7abe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -211,6 +211,7 @@ name = "optimal-binary" version = "0.1.0" dependencies = [ "num-traits", + "serde", ] [[package]] diff --git a/optimal-binary/Cargo.toml b/optimal-binary/Cargo.toml index ed59195..aaf0b67 100644 --- a/optimal-binary/Cargo.toml +++ b/optimal-binary/Cargo.toml @@ -10,7 +10,11 @@ keywords = ["optimization", "binary"] categories = ["science", "mathematics"] license = "MIT" +[features] +serde = ["dep:serde"] + [dependencies] num-traits = "0.2.16" +serde = { version = "1.0.185", features = ["derive"], optional = true } [dev-dependencies] diff --git a/optimal-binary/src/lib.rs b/optimal-binary/src/lib.rs index e6390bf..5677ee9 100644 --- a/optimal-binary/src/lib.rs +++ b/optimal-binary/src/lib.rs @@ -1,6 +1,9 @@ use num_traits::{pow, One, Zero}; use std::ops::{Add, Div, Mul, RangeInclusive, Sub}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; + /// Reduce innermost axis /// to numbers within range. /// Leftmost is least significant. @@ -26,7 +29,13 @@ use std::ops::{Add, Div, Mul, RangeInclusive, Sub}; /// assert_eq!(ToRealLE::new(1.0..=4.0, 2).decode([false, true]), 3.); /// ``` #[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr( + feature = "serde", + serde(bound(deserialize = "T: One + Add + Deserialize<'de>")) +)] pub struct ToRealLE { + #[cfg_attr(feature = "serde", serde(skip))] to_int: ToIntLE, start: T, a: Option, @@ -87,7 +96,9 @@ impl ToRealLE { /// assert_eq!(to_int_le.decode([false, false, true]), 4_u8); /// ``` #[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "serde", derive(Serialize))] pub struct ToIntLE { + #[cfg_attr(feature = "serde", serde(skip))] two: T, } @@ -100,6 +111,19 @@ where } } +#[cfg(feature = "serde")] +impl<'de, T> Deserialize<'de> for ToIntLE +where + T: One + Add, +{ + fn deserialize(_deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + Ok(Self::new()) + } +} + impl ToIntLE { pub fn new() -> Self where