rkyv/impls/alloc/collections/
btree_set.rs

1use crate::{
2    collections::btree_set::{ArchivedBTreeSet, BTreeSetResolver},
3    ser::Serializer,
4    Archive, Deserialize, Fallible, Serialize,
5};
6#[cfg(not(feature = "std"))]
7use alloc::collections::BTreeSet;
8#[cfg(feature = "std")]
9use std::collections::BTreeSet;
10
11impl<K: Archive + Ord> Archive for BTreeSet<K>
12where
13    K::Archived: Ord,
14{
15    type Archived = ArchivedBTreeSet<K::Archived>;
16    type Resolver = BTreeSetResolver;
17
18    #[inline]
19    unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
20        ArchivedBTreeSet::<K::Archived>::resolve_from_len(self.len(), pos, resolver, out);
21    }
22}
23
24impl<K: Serialize<S> + Ord, S: Serializer + ?Sized> Serialize<S> for BTreeSet<K>
25where
26    K::Archived: Ord,
27{
28    #[inline]
29    fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
30        unsafe { ArchivedBTreeSet::serialize_from_reverse_iter(self.iter().rev(), serializer) }
31    }
32}
33
34impl<K, D> Deserialize<BTreeSet<K>, D> for ArchivedBTreeSet<K::Archived>
35where
36    K: Archive + Ord,
37    K::Archived: Deserialize<K, D> + Ord,
38    D: Fallible + ?Sized,
39{
40    #[inline]
41    fn deserialize(&self, deserializer: &mut D) -> Result<BTreeSet<K>, D::Error> {
42        let mut result = BTreeSet::new();
43        for k in self.iter() {
44            result.insert(k.deserialize(deserializer)?);
45        }
46        Ok(result)
47    }
48}
49
50impl<K, AK: PartialEq<K>> PartialEq<BTreeSet<K>> for ArchivedBTreeSet<AK> {
51    #[inline]
52    fn eq(&self, other: &BTreeSet<K>) -> bool {
53        if self.len() != other.len() {
54            false
55        } else {
56            self.iter().zip(other.iter()).all(|(a, b)| a.eq(b))
57        }
58    }
59}
60
61impl<K, AK: PartialEq<K>> PartialEq<ArchivedBTreeSet<AK>> for BTreeSet<K> {
62    #[inline]
63    fn eq(&self, other: &ArchivedBTreeSet<AK>) -> bool {
64        other.eq(self)
65    }
66}