From 77df5e4b9813cea4a000a5e670b0eeb5d673fd11 Mon Sep 17 00:00:00 2001 From: Nicolas Sarlin Date: Tue, 1 Oct 2024 11:43:18 +0200 Subject: [PATCH] chore(versionable): remove unneeded bounds in examples --- .../tfhe-versionable/examples/manual_impl.rs | 79 +++++++++++++++---- utils/tfhe-versionable/examples/recursive.rs | 8 +- utils/tfhe-versionable/examples/simple.rs | 4 +- utils/tfhe-versionable/examples/upgrades.rs | 12 +-- 4 files changed, 77 insertions(+), 26 deletions(-) diff --git a/utils/tfhe-versionable/examples/manual_impl.rs b/utils/tfhe-versionable/examples/manual_impl.rs index 39bce5f43c..d6f3fbf9e3 100644 --- a/utils/tfhe-versionable/examples/manual_impl.rs +++ b/utils/tfhe-versionable/examples/manual_impl.rs @@ -2,11 +2,10 @@ use std::convert::Infallible; -use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use tfhe_versionable::{Unversionize, UnversionizeError, Upgrade, Versionize, VersionizeOwned}; -struct MyStruct { +struct MyStruct { attr: T, builtin: u32, } @@ -28,18 +27,18 @@ impl Upgrade> for MyStructV0 { } #[derive(Serialize)] -struct MyStructVersion<'vers, T: 'vers + Default + Versionize> { +struct MyStructVersion<'vers, T: 'vers + Versionize> { attr: T::Versioned<'vers>, builtin: u32, } #[derive(Serialize, Deserialize)] -struct MyStructVersionOwned { +struct MyStructVersionOwned { attr: T::VersionedOwned, builtin: u32, } -impl Versionize for MyStruct { +impl Versionize for MyStruct { type Versioned<'vers> = MyStructVersionsDispatch<'vers, T> where Self: 'vers; @@ -53,7 +52,7 @@ impl Versionize for MySt } } -impl VersionizeOwned for MyStruct { +impl Deserialize<'de>> VersionizeOwned for MyStruct { type VersionedOwned = MyStructVersionsDispatchOwned; fn versionize_owned(self) -> Self::VersionedOwned { @@ -65,7 +64,7 @@ impl VersionizeOwne } } -impl Unversionize +impl Deserialize<'de> + Default> Unversionize for MyStruct { fn unversionize(versioned: Self::VersionedOwned) -> Result { @@ -81,28 +80,80 @@ impl } } +// Since MyStructV0 is only composed of built-in types, it does not need recursive versioning and +// can be used as its own "version type". #[derive(Serialize)] #[allow(dead_code)] -enum MyStructVersionsDispatch<'vers, T: 'vers + Default + Versionize> { +enum MyStructVersionsDispatch<'vers, T: 'vers + Versionize> { V0(MyStructV0), V1(MyStructVersion<'vers, T>), } #[derive(Serialize, Deserialize)] -enum MyStructVersionsDispatchOwned { +enum MyStructVersionsDispatchOwned { V0(MyStructV0), V1(MyStructVersionOwned), } +mod v0 { + use serde::{Deserialize, Serialize}; + use tfhe_versionable::{Unversionize, UnversionizeError, Versionize, VersionizeOwned}; + + #[derive(Serialize, Deserialize)] + pub(super) struct MyStruct { + pub(super) builtin: u32, + } + + impl Versionize for MyStruct { + type Versioned<'vers> = MyStructVersionsDispatch; + + fn versionize(&self) -> Self::Versioned<'_> { + let ver = MyStruct { + builtin: self.builtin, + }; + MyStructVersionsDispatch::V0(ver) + } + } + + impl VersionizeOwned for MyStruct { + type VersionedOwned = MyStructVersionsDispatchOwned; + + fn versionize_owned(self) -> Self::VersionedOwned { + MyStructVersionsDispatchOwned::V0(self) + } + } + + impl Unversionize for MyStruct { + fn unversionize(versioned: Self::VersionedOwned) -> Result { + match versioned { + MyStructVersionsDispatchOwned::V0(v0) => Ok(v0), + } + } + } + + #[derive(Serialize)] + #[allow(dead_code)] + pub(super) enum MyStructVersionsDispatch { + V0(MyStruct), + } + + #[derive(Serialize, Deserialize)] + pub(super) enum MyStructVersionsDispatchOwned { + V0(MyStruct), + } +} + fn main() { - let ms = MyStruct { - attr: 37u64, - builtin: 1234, - }; + let value = 1234; + let ms = v0::MyStruct { builtin: value }; let serialized = bincode::serialize(&ms.versionize()).unwrap(); - let _unserialized = MyStruct::::unversionize(bincode::deserialize(&serialized).unwrap()); + let unserialized = + MyStruct::::unversionize(bincode::deserialize(&serialized).unwrap()).unwrap(); + + assert_eq!(unserialized.builtin, value); + assert_eq!(unserialized.attr, u64::default()); } #[test] diff --git a/utils/tfhe-versionable/examples/recursive.rs b/utils/tfhe-versionable/examples/recursive.rs index 69229e4793..7f9ef35db1 100644 --- a/utils/tfhe-versionable/examples/recursive.rs +++ b/utils/tfhe-versionable/examples/recursive.rs @@ -7,7 +7,7 @@ use tfhe_versionable::{Unversionize, Upgrade, Version, Versionize, VersionsDispa // The inner struct is independently versioned #[derive(Versionize)] #[versionize(MyStructInnerVersions)] -struct MyStructInner { +struct MyStructInner { attr: T, builtin: u32, } @@ -30,7 +30,7 @@ impl Upgrade> for MyStructInnerV0 { #[derive(VersionsDispatch)] #[allow(unused)] -enum MyStructInnerVersions { +enum MyStructInnerVersions { V0(MyStructInnerV0), V1(MyStructInner), } @@ -38,13 +38,13 @@ enum MyStructInnerVersions { // An upgrade of the inner struct does not require an upgrade of the outer struct #[derive(Versionize)] #[versionize(MyStructVersions)] -struct MyStruct { +struct MyStruct { inner: MyStructInner, } #[derive(VersionsDispatch)] #[allow(unused)] -enum MyStructVersions { +enum MyStructVersions { V0(MyStruct), } diff --git a/utils/tfhe-versionable/examples/simple.rs b/utils/tfhe-versionable/examples/simple.rs index ff440dbbf0..ce5871c9cd 100644 --- a/utils/tfhe-versionable/examples/simple.rs +++ b/utils/tfhe-versionable/examples/simple.rs @@ -8,7 +8,7 @@ use tfhe_versionable::{Unversionize, Upgrade, Version, Versionize, VersionsDispa #[derive(Versionize)] #[versionize(MyStructVersions)] // Link to the enum type that will holds all the versions of this // type -struct MyStruct { +struct MyStruct { attr: T, builtin: u32, } @@ -38,7 +38,7 @@ impl Upgrade> for MyStructV0 { // This enum is not directly used but serves as a template to generate a new enum that will be // serialized. This allows recursive versioning. #[allow(unused)] -enum MyStructVersions { +enum MyStructVersions { V0(MyStructV0), V1(MyStruct), } diff --git a/utils/tfhe-versionable/examples/upgrades.rs b/utils/tfhe-versionable/examples/upgrades.rs index 4c5eb40430..ec4cacfb65 100644 --- a/utils/tfhe-versionable/examples/upgrades.rs +++ b/utils/tfhe-versionable/examples/upgrades.rs @@ -34,7 +34,7 @@ mod v1 { #[derive(Serialize, Deserialize, Versionize)] #[versionize(MyStructVersions)] - pub struct MyStruct(pub u32, pub T); + pub struct MyStruct(pub u32, pub T); mod backward_compat { use std::convert::Infallible; @@ -56,7 +56,7 @@ mod v1 { #[derive(VersionsDispatch)] #[allow(unused)] - pub enum MyStructVersions { + pub enum MyStructVersions { V0(MyStructV0), V1(MyStruct), } @@ -71,7 +71,7 @@ mod v2 { #[derive(Serialize, Deserialize, Versionize)] #[versionize(MyEnumVersions)] - pub enum MyEnum { + pub enum MyEnum { Variant0, Variant1 { count: u64 }, Variant2(T), @@ -79,7 +79,7 @@ mod v2 { #[derive(Serialize, Deserialize, Versionize)] #[versionize(MyStructVersions)] - pub struct MyStruct { + pub struct MyStruct { pub count: u32, pub attr: T, } @@ -118,7 +118,7 @@ mod v2 { #[derive(VersionsDispatch)] #[allow(unused)] - pub enum MyStructVersions { + pub enum MyStructVersions { V0(MyStructV0), V1(MyStructV1), V2(MyStruct), @@ -126,7 +126,7 @@ mod v2 { #[derive(VersionsDispatch)] #[allow(unused)] - pub enum MyEnumVersions { + pub enum MyEnumVersions { V0(MyEnum), } }