Skip to content

Commit 150c637

Browse files
committed
feat: add rkyv serialize, deserialize, archive
Signed-off-by: Anthony Griffon <[email protected]>
1 parent 5ed7bda commit 150c637

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ once_cell = { version = "1.4", optional = true }
3131
tinyset = { version = "0.4.2", optional = true }
3232
hashbrown = { version = "0.9" }
3333
serde = { version = "1.0", optional = true }
34+
rkyv = { version = "0.7", optional = true }
3435

3536
arc-interner = { version = "0.5", optional = true }
3637

src/lib.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,16 @@ use std::sync::atomic::Ordering;
6161
mod container;
6262
use container::{TypeHolder, TypeHolderSend};
6363

64-
use std::any::TypeId;
6564
use std::any::Any;
65+
use std::any::TypeId;
6666
use std::borrow::Borrow;
6767
use std::convert::AsRef;
6868
use std::fmt::{Debug, Display, Pointer};
6969
use std::hash::{Hash, Hasher};
7070
use std::ops::Deref;
7171

72+
#[cfg(feature = "rkyv")]
73+
use rkyv::{Archive as RkyvArchive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
7274
#[cfg(feature = "serde")]
7375
use serde::{Deserialize, Deserializer, Serialize, Serializer};
7476
#[cfg(feature = "tinyset")]
@@ -778,6 +780,36 @@ macro_rules! create_impls {
778780
}
779781
}
780782

783+
#[cfg(feature = "rkyv")]
784+
impl<T: $( $traits +)* rkyv::Archive> rkyv::Archive for $Intern<T> {
785+
type Archived = rkyv::Archived<T>;
786+
type Resolver = rkyv::Resolver<T>;
787+
788+
#[allow(clippy::unit_arg)]
789+
#[inline]
790+
unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
791+
self.as_ref().resolve(pos, resolver, out)
792+
}
793+
}
794+
795+
#[cfg(feature = "rkyv")]
796+
impl<T: $( $traits +)* RkyvSerialize<S>, S: rkyv::Fallible + ?Sized> RkyvSerialize<S> for $Intern<T>
797+
{
798+
#[inline]
799+
fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
800+
RkyvSerialize::serialize(self.as_ref(), serializer)
801+
}
802+
}
803+
804+
#[cfg(feature = "rkyv")]
805+
impl<T: Eq + Hash + Sync + Send + $( $traits +)* rkyv::Archive<Archived = impl RkyvDeserialize<T, D>> + 'static, D: rkyv::Fallible + ?Sized> RkyvDeserialize<$Intern<T>, D> for rkyv::Archived<$Intern<T>>
806+
{
807+
#[inline]
808+
fn deserialize(&self, deserializer: &mut D) -> Result<$Intern<T>, D::Error> {
809+
RkyvDeserialize::<T, D>::deserialize(self, deserializer).map($Intern::new)
810+
}
811+
}
812+
781813
#[cfg(test)]
782814
mod $testname {
783815
use super::$Intern;

0 commit comments

Comments
 (0)