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