use core::marker::PhantomData;
use epserde::PhantomDeserData;
use epserde::TypeInfo;
use epserde::prelude::*;
#[test]
fn test_phantom() {
let obj = PhantomData::<usize>;
let mut cursor = <AlignedCursor<Aligned16>>::new();
let _bytes_written = unsafe { obj.serialize(&mut cursor).unwrap() };
cursor.set_position(0);
let full = unsafe { <PhantomData<usize>>::deserialize_full(&mut cursor).unwrap() };
assert_eq!(obj, full);
println!();
let eps = unsafe { <PhantomData<usize>>::deserialize_eps(cursor.as_bytes()).unwrap() };
assert_eq!(obj, eps);
}
#[derive(Epserde, Debug, PartialEq, Eq, Clone, Default)]
#[epserde(deep_copy)]
struct DataFull<D> {
a: usize,
b: PhantomData<D>,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, TypeInfo)]
struct NotSerializableType;
#[test]
fn test_not_serializable_in_phantom() {
let obj = <DataFull<NotSerializableType>>::default();
let mut cursor = <AlignedCursor<Aligned16>>::new();
let _bytes_written = unsafe { obj.serialize(&mut cursor).unwrap() };
cursor.set_position(0);
let full = unsafe { <DataFull<NotSerializableType>>::deserialize_full(&mut cursor).unwrap() };
assert_eq!(obj, full);
println!();
cursor.set_position(0);
let eps =
unsafe { <DataFull<NotSerializableType>>::deserialize_eps(cursor.as_bytes()).unwrap() };
assert_eq!(obj.a, eps.a);
}
#[derive(Epserde, Copy, Debug, PartialEq, Eq, Clone, Default)]
#[repr(C)]
#[epserde(zero_copy)]
struct DataZero<A: Default + ZeroCopy> {
a: usize,
b: PhantomData<A>,
}
#[derive(Epserde, Debug, Copy, PartialEq, Eq, Clone, Default)]
#[repr(C)]
#[epserde(zero_copy)]
struct ZeroCopyType;
#[test]
fn test_phantom_zero_copy() {
let obj = <DataZero<ZeroCopyType>>::default();
let mut cursor = <AlignedCursor<Aligned16>>::new();
let _bytes_written = unsafe { obj.serialize(&mut cursor).unwrap() };
cursor.set_position(0);
let zero = unsafe { <DataZero<ZeroCopyType>>::deserialize_full(&mut cursor).unwrap() };
assert_eq!(obj, zero);
println!();
cursor.set_position(0);
let eps = unsafe { <DataZero<ZeroCopyType>>::deserialize_eps(cursor.as_bytes()).unwrap() };
assert_eq!(obj.a, eps.a);
}
#[derive(Epserde, Copy, Debug, PartialEq, Eq, Clone, Default)]
#[repr(C)]
#[epserde(zero_copy)]
struct OnlyPhantom<A: Default + ZeroCopy> {
a: PhantomData<A>,
b: PhantomData<(A, A)>,
}
#[test]
fn test_only_phantom() {
let obj = <OnlyPhantom<ZeroCopyType>>::default();
let mut cursor = <AlignedCursor<Aligned16>>::new();
let _bytes_written = unsafe { obj.serialize(&mut cursor).unwrap() };
cursor.set_position(0);
let zero = unsafe { <OnlyPhantom<ZeroCopyType>>::deserialize_full(&mut cursor).unwrap() };
assert_eq!(obj, zero);
println!();
cursor.set_position(0);
let eps = unsafe { <OnlyPhantom<ZeroCopyType>>::deserialize_eps(cursor.as_bytes()).unwrap() };
assert_eq!(obj.a, eps.a);
let vec = vec![<OnlyPhantom<ZeroCopyType>>::default(); 10];
let mut cursor = <AlignedCursor<Aligned16>>::new();
let _bytes_written = unsafe { vec.serialize(&mut cursor).unwrap() };
cursor.set_position(0);
let zero = unsafe { <Vec<OnlyPhantom<ZeroCopyType>>>::deserialize_full(&mut cursor).unwrap() };
assert_eq!(vec, zero);
println!();
cursor.set_position(0);
let eps =
unsafe { <Vec<OnlyPhantom<ZeroCopyType>>>::deserialize_eps(cursor.as_bytes()).unwrap() };
assert_eq!(vec, eps);
}
#[derive(Epserde, Debug, PartialEq, Eq, Clone, Default)]
struct DataWithPhantomDeserData<T> {
data: T,
phantom: PhantomDeserData<T>,
}
#[test]
fn test_deser_phantom_deep_copy() {
let obj = DataWithPhantomDeserData {
data: vec![1, 2, 3, 4],
phantom: PhantomDeserData(PhantomData),
};
let mut cursor = <AlignedCursor<Aligned16>>::new();
let _bytes_written = unsafe { obj.serialize(&mut cursor).unwrap() };
cursor.set_position(0);
let full =
unsafe { <DataWithPhantomDeserData<Vec<i32>>>::deserialize_full(&mut cursor).unwrap() };
assert_eq!(obj, full);
cursor.set_position(0);
let eps = unsafe {
<DataWithPhantomDeserData<Vec<i32>>>::deserialize_eps(cursor.as_bytes()).unwrap()
};
assert_eq!(obj.data.as_slice(), eps.data);
let _phantom_check: PhantomDeserData<&[i32]> = eps.phantom;
}
#[derive(Epserde, Copy, Debug, PartialEq, Eq, Clone, Default)]
#[repr(C)]
#[epserde(zero_copy)]
struct DataZeroWithPhantomDeserData<T: ZeroCopy> {
data: T,
phantom: PhantomDeserData<T>,
}
#[test]
fn test_deser_phantom_zero_copy() {
let obj = DataZeroWithPhantomDeserData {
data: [1, 2, 3, 4],
phantom: PhantomDeserData(PhantomData),
};
let mut cursor = <AlignedCursor<Aligned16>>::new();
let _bytes_written = unsafe { obj.serialize(&mut cursor).unwrap() };
cursor.set_position(0);
let full =
unsafe { <DataZeroWithPhantomDeserData<[i32; 4]>>::deserialize_full(&mut cursor).unwrap() };
assert_eq!(obj, full);
cursor.set_position(0);
let eps = unsafe {
<DataZeroWithPhantomDeserData<[i32; 4]>>::deserialize_eps(cursor.as_bytes()).unwrap()
};
assert_eq!(obj.data.as_slice(), eps.data);
let _phantom_check: PhantomDeserData<[i32; 4]> = eps.phantom;
}