From 91d741f014814c72d2e9675479fc9c33880d1af0 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Wed, 20 Apr 2022 16:17:36 +1000 Subject: [PATCH 1/4] upgrade to value-bag 1.0.0-alpha.9 and remove by-value 128bit int conversions --- Cargo.toml | 4 ++-- src/kv/value.rs | 58 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 63739fa15..de310cb17 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,11 +56,11 @@ kv_unstable_serde = ["kv_unstable_std", "value-bag/serde", "serde"] cfg-if = "1.0" serde = { version = "1.0", optional = true, default-features = false } sval = { version = "=1.0.0-alpha.5", optional = true, default-features = false } -value-bag = { version = "=1.0.0-alpha.8", optional = true, default-features = false } +value-bag = { version = "=1.0.0-alpha.9", optional = true, default-features = false } [dev-dependencies] rustversion = "1.0" serde = { version = "1.0", features = ["derive"] } serde_test = "1.0" sval = { version = "=1.0.0-alpha.5", features = ["derive"] } -value-bag = { version = "=1.0.0-alpha.8", features = ["test"] } +value-bag = { version = "=1.0.0-alpha.9", features = ["test"] } diff --git a/src/kv/value.rs b/src/kv/value.rs index cb5cb4381..089104ab0 100644 --- a/src/kv/value.rs +++ b/src/kv/value.rs @@ -441,12 +441,60 @@ impl ToValue for str { } } +impl ToValue for u128 { + fn to_value(&self) -> Value { + Value::from(self) + } +} + +impl ToValue for i128 { + fn to_value(&self) -> Value { + Value::from(self) + } +} + +impl ToValue for std::num::NonZeroU128 { + fn to_value(&self) -> Value { + Value::from(self) + } +} + +impl ToValue for std::num::NonZeroI128 { + fn to_value(&self) -> Value { + Value::from(self) + } +} + impl<'v> From<&'v str> for Value<'v> { fn from(value: &'v str) -> Self { Value::from_value_bag(value) } } +impl<'v> From<&'v u128> for Value<'v> { + fn from(value: &'v u128) -> Self { + Value::from_value_bag(value) + } +} + +impl<'v> From<&'v i128> for Value<'v> { + fn from(value: &'v i128) -> Self { + Value::from_value_bag(value) + } +} + +impl<'v> From<&'v std::num::NonZeroU128> for Value<'v> { + fn from(v: &'v std::num::NonZeroU128) -> Value<'v> { + Value::from_value_bag(unsafe { std::mem::transmute::<&std::num::NonZeroU128, &u128>(v) }) + } +} + +impl<'v> From<&'v std::num::NonZeroI128> for Value<'v> { + fn from(v: &'v std::num::NonZeroI128) -> Value<'v> { + Value::from_value_bag(unsafe { std::mem::transmute::<&std::num::NonZeroI128, &i128>(v) }) + } +} + impl ToValue for () { fn to_value(&self) -> Value { Value::from_value_bag(()) @@ -515,13 +563,13 @@ macro_rules! impl_value_to_primitive { } impl_to_value_primitive![ - usize, u8, u16, u32, u64, u128, isize, i8, i16, i32, i64, i128, f32, f64, char, bool, + usize, u8, u16, u32, u64, isize, i8, i16, i32, i64, f32, f64, char, bool, ]; #[rustfmt::skip] impl_to_value_nonzero_primitive![ - NonZeroUsize, NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU128, - NonZeroIsize, NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI128, + NonZeroUsize, NonZeroU8, NonZeroU16, NonZeroU32, NonZeroU64, + NonZeroIsize, NonZeroI8, NonZeroI16, NonZeroI32, NonZeroI64, ]; impl_value_to_primitive![ @@ -617,12 +665,12 @@ pub trait Visit<'v> { /// Visit a big unsigned integer. fn visit_u128(&mut self, value: u128) -> Result<(), Error> { - self.visit_any(value.into()) + self.visit_any((&value).into()) } /// Visit a big signed integer. fn visit_i128(&mut self, value: i128) -> Result<(), Error> { - self.visit_any(value.into()) + self.visit_any((&value).into()) } /// Visit a floating point. From bb111eb90de894ee5bde9f9c49a64e732463dfb2 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Wed, 20 Apr 2022 16:27:06 +1000 Subject: [PATCH 2/4] add a macro test with common types --- tests/macros.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/macros.rs b/tests/macros.rs index 22b7306fd..16453786e 100644 --- a/tests/macros.rs +++ b/tests/macros.rs @@ -216,6 +216,28 @@ fn kv_string_keys() { all_log_macros!(target: "my_target", "also dogs" = "FĂ­los", "key/that-can't/be/an/ident" = "hi"; "hello {world}", world = "world"); } +#[test] +#[cfg(feature = "kv_unstable")] +fn kv_common_value_types() { + all_log_macros!( + u8 = 42u8, + u16 = 42u16, + u32 = 42u32, + u64 = 42u64, + u128 = 42u128, + i8 = -42i8, + i16 = -42i16, + i32 = -42i32, + i64 = -42i64, + i128 = -42i128, + f32 = 4.2f32, + f64 = -4.2f64, + bool = true, + str = "string"; + "hello world" + ); +} + /// Some and None (from Option) are used in the macros. #[derive(Debug)] enum Type { From 6c0a24c82d372ef40e59cc8ba518fb2ffa19668d Mon Sep 17 00:00:00 2001 From: KodrAus Date: Wed, 20 Apr 2022 16:28:54 +1000 Subject: [PATCH 3/4] add safety comments to the by-ref transmute for non-zero nums --- src/kv/value.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/kv/value.rs b/src/kv/value.rs index 089104ab0..63997aef7 100644 --- a/src/kv/value.rs +++ b/src/kv/value.rs @@ -485,12 +485,14 @@ impl<'v> From<&'v i128> for Value<'v> { impl<'v> From<&'v std::num::NonZeroU128> for Value<'v> { fn from(v: &'v std::num::NonZeroU128) -> Value<'v> { + // SAFETY: `NonZeroU128` and `u128` have the same ABI Value::from_value_bag(unsafe { std::mem::transmute::<&std::num::NonZeroU128, &u128>(v) }) } } impl<'v> From<&'v std::num::NonZeroI128> for Value<'v> { fn from(v: &'v std::num::NonZeroI128) -> Value<'v> { + // SAFETY: `NonZeroI128` and `i128` have the same ABI Value::from_value_bag(unsafe { std::mem::transmute::<&std::num::NonZeroI128, &i128>(v) }) } } From 9efaf029e8479cb5448e4f3eb0fc95f89185f863 Mon Sep 17 00:00:00 2001 From: KodrAus Date: Wed, 20 Apr 2022 16:31:54 +1000 Subject: [PATCH 4/4] run fmt --- src/kv/value.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/kv/value.rs b/src/kv/value.rs index 63997aef7..607bc09a5 100644 --- a/src/kv/value.rs +++ b/src/kv/value.rs @@ -564,9 +564,7 @@ macro_rules! impl_value_to_primitive { } } -impl_to_value_primitive![ - usize, u8, u16, u32, u64, isize, i8, i16, i32, i64, f32, f64, char, bool, -]; +impl_to_value_primitive![usize, u8, u16, u32, u64, isize, i8, i16, i32, i64, f32, f64, char, bool,]; #[rustfmt::skip] impl_to_value_nonzero_primitive![