rkyv/collections/swiss_table/
index_set.rs1use core::{
5 borrow::Borrow,
6 fmt,
7 hash::{Hash, Hasher},
8};
9
10use munge::munge;
11use rancor::{Fallible, Source};
12
13use crate::{
14 collections::swiss_table::{
15 index_map::Keys, ArchivedIndexMap, IndexMapResolver,
16 },
17 hash::FxHasher64,
18 ser::{Allocator, Writer},
19 Place, Portable, Serialize,
20};
21
22#[derive(Portable)]
24#[rkyv(crate)]
25#[cfg_attr(feature = "bytecheck", derive(bytecheck::CheckBytes))]
26#[repr(transparent)]
27pub struct ArchivedIndexSet<K, H = FxHasher64> {
28 inner: ArchivedIndexMap<K, (), H>,
29}
30
31impl<K, H> ArchivedIndexSet<K, H> {
32 pub fn is_empty(&self) -> bool {
34 self.inner.is_empty()
35 }
36
37 pub fn iter(&self) -> Keys<'_, K, ()> {
39 self.inner.keys()
40 }
41
42 pub fn len(&self) -> usize {
44 self.inner.len()
45 }
46}
47
48impl<K, H: Default + Hasher> ArchivedIndexSet<K, H> {
49 pub fn contains<Q>(&self, k: &Q) -> bool
51 where
52 K: Borrow<Q>,
53 Q: Hash + Eq + ?Sized,
54 {
55 self.inner.contains_key(k)
56 }
57
58 pub fn get<Q>(&self, k: &Q) -> Option<&K>
60 where
61 K: Borrow<Q>,
62 Q: Hash + Eq + ?Sized,
63 {
64 self.inner.get_full(k).map(|(_, k, _)| k)
65 }
66
67 pub fn get_full<Q>(&self, k: &Q) -> Option<(usize, &K)>
69 where
70 K: Borrow<Q>,
71 Q: Hash + Eq + ?Sized,
72 {
73 self.inner.get_full(k).map(|(i, k, _)| (i, k))
74 }
75
76 pub fn get_index(&self, index: usize) -> Option<&K> {
78 self.inner.get_index(index).map(|(k, _)| k)
79 }
80
81 pub fn get_index_of<Q>(&self, key: &Q) -> Option<usize>
83 where
84 K: Borrow<Q>,
85 Q: Hash + Eq + ?Sized,
86 {
87 self.inner.get_index_of(key)
88 }
89
90 pub fn resolve_from_len(
92 len: usize,
93 load_factor: (usize, usize),
94 resolver: IndexSetResolver,
95 out: Place<Self>,
96 ) {
97 munge!(let ArchivedIndexSet { inner } = out);
98 ArchivedIndexMap::resolve_from_len(len, load_factor, resolver.0, inner);
99 }
100
101 pub fn serialize_from_iter<I, UK, S>(
103 iter: I,
104 load_factor: (usize, usize),
105 serializer: &mut S,
106 ) -> Result<IndexSetResolver, S::Error>
107 where
108 I: Clone + ExactSizeIterator,
109 I::Item: Borrow<UK>,
110 UK: Serialize<S, Archived = K> + Hash + Eq,
111 S: Fallible + Writer + Allocator + ?Sized,
112 S::Error: Source,
113 {
114 Ok(IndexSetResolver(
115 ArchivedIndexMap::<K, (), H>::serialize_from_iter::<
116 _,
117 _,
118 (),
119 _,
120 _,
121 _,
122 >(iter.map(|x| (x, ())), load_factor, serializer)?,
123 ))
124 }
125}
126
127impl<K: fmt::Debug, H> fmt::Debug for ArchivedIndexSet<K, H> {
128 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
129 f.debug_set().entries(self.iter()).finish()
130 }
131}
132
133impl<K: PartialEq, H> PartialEq for ArchivedIndexSet<K, H> {
134 fn eq(&self, other: &Self) -> bool {
135 self.iter().eq(other.iter())
136 }
137}
138
139impl<K: Eq, H> Eq for ArchivedIndexSet<K, H> {}
140
141pub struct IndexSetResolver(IndexMapResolver);