diff --git a/Cargo.toml b/Cargo.toml index 6968caa..91f38da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,7 @@ once_cell = { version = "1.4", optional = true } tinyset = { version = "0.4.2", optional = true } hashbrown = { version = "0.9" } serde = { version = "1.0", optional = true } +rkyv = { version = "0.7", optional = true } arc-interner = { version = "0.5", optional = true } diff --git a/src/lib.rs b/src/lib.rs index dfd6496..6ff4772 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -61,14 +61,16 @@ use std::sync::atomic::Ordering; mod container; use container::{TypeHolder, TypeHolderSend}; -use std::any::TypeId; use std::any::Any; +use std::any::TypeId; use std::borrow::Borrow; use std::convert::AsRef; use std::fmt::{Debug, Display, Pointer}; use std::hash::{Hash, Hasher}; use std::ops::Deref; +#[cfg(feature = "rkyv")] +use rkyv::{Archive as RkyvArchive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize}; #[cfg(feature = "serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[cfg(feature = "tinyset")] @@ -778,6 +780,36 @@ macro_rules! create_impls { } } + #[cfg(feature = "rkyv")] + impl rkyv::Archive for $Intern { + type Archived = rkyv::Archived; + type Resolver = rkyv::Resolver; + + #[allow(clippy::unit_arg)] + #[inline] + unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { + self.as_ref().resolve(pos, resolver, out) + } + } + + #[cfg(feature = "rkyv")] + impl, S: rkyv::Fallible + ?Sized> RkyvSerialize for $Intern + { + #[inline] + fn serialize(&self, serializer: &mut S) -> Result { + RkyvSerialize::serialize(self.as_ref(), serializer) + } + } + + #[cfg(feature = "rkyv")] + impl> + 'static, D: rkyv::Fallible + ?Sized> RkyvDeserialize<$Intern, D> for rkyv::Archived<$Intern> + { + #[inline] + fn deserialize(&self, deserializer: &mut D) -> Result<$Intern, D::Error> { + RkyvDeserialize::::deserialize(self, deserializer).map($Intern::new) + } + } + #[cfg(test)] mod $testname { use super::$Intern;