chore(versionable): remove unneeded bounds in examples

This commit is contained in:
Nicolas Sarlin
2024-10-01 11:43:18 +02:00
committed by Nicolas Sarlin
parent cd36ac5092
commit 7d044b00a3
4 changed files with 77 additions and 26 deletions

View File

@@ -2,11 +2,10 @@
use std::convert::Infallible; use std::convert::Infallible;
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tfhe_versionable::{Unversionize, UnversionizeError, Upgrade, Versionize, VersionizeOwned}; use tfhe_versionable::{Unversionize, UnversionizeError, Upgrade, Versionize, VersionizeOwned};
struct MyStruct<T: Default> { struct MyStruct<T> {
attr: T, attr: T,
builtin: u32, builtin: u32,
} }
@@ -28,18 +27,18 @@ impl<T: Default> Upgrade<MyStruct<T>> for MyStructV0 {
} }
#[derive(Serialize)] #[derive(Serialize)]
struct MyStructVersion<'vers, T: 'vers + Default + Versionize> { struct MyStructVersion<'vers, T: 'vers + Versionize> {
attr: T::Versioned<'vers>, attr: T::Versioned<'vers>,
builtin: u32, builtin: u32,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct MyStructVersionOwned<T: Default + VersionizeOwned> { struct MyStructVersionOwned<T: VersionizeOwned> {
attr: T::VersionedOwned, attr: T::VersionedOwned,
builtin: u32, builtin: u32,
} }
impl<T: Default + Versionize + Serialize + DeserializeOwned> Versionize for MyStruct<T> { impl<T: Versionize + Serialize> Versionize for MyStruct<T> {
type Versioned<'vers> type Versioned<'vers>
= MyStructVersionsDispatch<'vers, T> = MyStructVersionsDispatch<'vers, T>
where where
@@ -54,7 +53,7 @@ impl<T: Default + Versionize + Serialize + DeserializeOwned> Versionize for MySt
} }
} }
impl<T: Default + VersionizeOwned + Serialize + DeserializeOwned> VersionizeOwned for MyStruct<T> { impl<T: VersionizeOwned + Serialize + for<'de> Deserialize<'de>> VersionizeOwned for MyStruct<T> {
type VersionedOwned = MyStructVersionsDispatchOwned<T>; type VersionedOwned = MyStructVersionsDispatchOwned<T>;
fn versionize_owned(self) -> Self::VersionedOwned { fn versionize_owned(self) -> Self::VersionedOwned {
@@ -66,7 +65,7 @@ impl<T: Default + VersionizeOwned + Serialize + DeserializeOwned> VersionizeOwne
} }
} }
impl<T: Default + VersionizeOwned + Unversionize + Serialize + DeserializeOwned> Unversionize impl<T: Unversionize + Serialize + for<'de> Deserialize<'de> + Default> Unversionize
for MyStruct<T> for MyStruct<T>
{ {
fn unversionize(versioned: Self::VersionedOwned) -> Result<Self, UnversionizeError> { fn unversionize(versioned: Self::VersionedOwned) -> Result<Self, UnversionizeError> {
@@ -82,28 +81,80 @@ impl<T: Default + VersionizeOwned + Unversionize + Serialize + DeserializeOwned>
} }
} }
// 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)] #[derive(Serialize)]
#[allow(dead_code)] #[allow(dead_code)]
enum MyStructVersionsDispatch<'vers, T: 'vers + Default + Versionize> { enum MyStructVersionsDispatch<'vers, T: 'vers + Versionize> {
V0(MyStructV0), V0(MyStructV0),
V1(MyStructVersion<'vers, T>), V1(MyStructVersion<'vers, T>),
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum MyStructVersionsDispatchOwned<T: Default + VersionizeOwned> { enum MyStructVersionsDispatchOwned<T: VersionizeOwned> {
V0(MyStructV0), V0(MyStructV0),
V1(MyStructVersionOwned<T>), V1(MyStructVersionOwned<T>),
} }
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<Self, UnversionizeError> {
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() { fn main() {
let ms = MyStruct { let value = 1234;
attr: 37u64, let ms = v0::MyStruct { builtin: value };
builtin: 1234,
};
let serialized = bincode::serialize(&ms.versionize()).unwrap(); let serialized = bincode::serialize(&ms.versionize()).unwrap();
let _unserialized = MyStruct::<u64>::unversionize(bincode::deserialize(&serialized).unwrap()); let unserialized =
MyStruct::<u64>::unversionize(bincode::deserialize(&serialized).unwrap()).unwrap();
assert_eq!(unserialized.builtin, value);
assert_eq!(unserialized.attr, u64::default());
} }
#[test] #[test]

View File

@@ -7,7 +7,7 @@ use tfhe_versionable::{Unversionize, Upgrade, Version, Versionize, VersionsDispa
// The inner struct is independently versioned // The inner struct is independently versioned
#[derive(Versionize)] #[derive(Versionize)]
#[versionize(MyStructInnerVersions)] #[versionize(MyStructInnerVersions)]
struct MyStructInner<T: Default> { struct MyStructInner<T> {
attr: T, attr: T,
builtin: u32, builtin: u32,
} }
@@ -30,7 +30,7 @@ impl<T: Default> Upgrade<MyStructInner<T>> for MyStructInnerV0 {
#[derive(VersionsDispatch)] #[derive(VersionsDispatch)]
#[allow(unused)] #[allow(unused)]
enum MyStructInnerVersions<T: Default> { enum MyStructInnerVersions<T> {
V0(MyStructInnerV0), V0(MyStructInnerV0),
V1(MyStructInner<T>), V1(MyStructInner<T>),
} }
@@ -38,13 +38,13 @@ enum MyStructInnerVersions<T: Default> {
// An upgrade of the inner struct does not require an upgrade of the outer struct // An upgrade of the inner struct does not require an upgrade of the outer struct
#[derive(Versionize)] #[derive(Versionize)]
#[versionize(MyStructVersions)] #[versionize(MyStructVersions)]
struct MyStruct<T: Default> { struct MyStruct<T> {
inner: MyStructInner<T>, inner: MyStructInner<T>,
} }
#[derive(VersionsDispatch)] #[derive(VersionsDispatch)]
#[allow(unused)] #[allow(unused)]
enum MyStructVersions<T: Default> { enum MyStructVersions<T> {
V0(MyStruct<T>), V0(MyStruct<T>),
} }

View File

@@ -8,7 +8,7 @@ use tfhe_versionable::{Unversionize, Upgrade, Version, Versionize, VersionsDispa
#[derive(Versionize)] #[derive(Versionize)]
#[versionize(MyStructVersions)] // Link to the enum type that will holds all the versions of this #[versionize(MyStructVersions)] // Link to the enum type that will holds all the versions of this
// type // type
struct MyStruct<T: Default> { struct MyStruct<T> {
attr: T, attr: T,
builtin: u32, builtin: u32,
} }
@@ -38,7 +38,7 @@ impl<T: Default> Upgrade<MyStruct<T>> for MyStructV0 {
// This enum is not directly used but serves as a template to generate a new enum that will be // This enum is not directly used but serves as a template to generate a new enum that will be
// serialized. This allows recursive versioning. // serialized. This allows recursive versioning.
#[allow(unused)] #[allow(unused)]
enum MyStructVersions<T: Default> { enum MyStructVersions<T> {
V0(MyStructV0), V0(MyStructV0),
V1(MyStruct<T>), V1(MyStruct<T>),
} }

View File

@@ -34,7 +34,7 @@ mod v1 {
#[derive(Serialize, Deserialize, Versionize)] #[derive(Serialize, Deserialize, Versionize)]
#[versionize(MyStructVersions)] #[versionize(MyStructVersions)]
pub struct MyStruct<T: Default>(pub u32, pub T); pub struct MyStruct<T>(pub u32, pub T);
mod backward_compat { mod backward_compat {
use std::convert::Infallible; use std::convert::Infallible;
@@ -56,7 +56,7 @@ mod v1 {
#[derive(VersionsDispatch)] #[derive(VersionsDispatch)]
#[allow(unused)] #[allow(unused)]
pub enum MyStructVersions<T: Default> { pub enum MyStructVersions<T> {
V0(MyStructV0), V0(MyStructV0),
V1(MyStruct<T>), V1(MyStruct<T>),
} }
@@ -71,7 +71,7 @@ mod v2 {
#[derive(Serialize, Deserialize, Versionize)] #[derive(Serialize, Deserialize, Versionize)]
#[versionize(MyEnumVersions)] #[versionize(MyEnumVersions)]
pub enum MyEnum<T: Default> { pub enum MyEnum<T> {
Variant0, Variant0,
Variant1 { count: u64 }, Variant1 { count: u64 },
Variant2(T), Variant2(T),
@@ -79,7 +79,7 @@ mod v2 {
#[derive(Serialize, Deserialize, Versionize)] #[derive(Serialize, Deserialize, Versionize)]
#[versionize(MyStructVersions)] #[versionize(MyStructVersions)]
pub struct MyStruct<T: Default> { pub struct MyStruct<T> {
pub count: u32, pub count: u32,
pub attr: T, pub attr: T,
} }
@@ -118,7 +118,7 @@ mod v2 {
#[derive(VersionsDispatch)] #[derive(VersionsDispatch)]
#[allow(unused)] #[allow(unused)]
pub enum MyStructVersions<T: Default> { pub enum MyStructVersions<T> {
V0(MyStructV0), V0(MyStructV0),
V1(MyStructV1<T>), V1(MyStructV1<T>),
V2(MyStruct<T>), V2(MyStruct<T>),
@@ -126,7 +126,7 @@ mod v2 {
#[derive(VersionsDispatch)] #[derive(VersionsDispatch)]
#[allow(unused)] #[allow(unused)]
pub enum MyEnumVersions<T: Default> { pub enum MyEnumVersions<T> {
V0(MyEnum<T>), V0(MyEnum<T>),
} }
} }