mirror of
https://github.com/zama-ai/tfhe-rs.git
synced 2026-01-09 22:57:59 -05:00
chore(versionable): remove unneeded bounds in examples
This commit is contained in:
committed by
Nicolas Sarlin
parent
cd36ac5092
commit
7d044b00a3
@@ -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]
|
||||||
|
|||||||
@@ -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>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>),
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user