Skip to content

Commit 78e27ba

Browse files
cjhopmanmeta-codesync[bot]
authored andcommitted
Back out "Revert D91571261"
Summary: Original commit changeset: 541d141ecbf6 Original Phabricator Diff: D91780392 Reviewed By: christolliday Differential Revision: D91840579 fbshipit-source-id: 274541f23606a8c3afd9b928d2d94d7e3663d587
1 parent ae65e46 commit 78e27ba

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed

pagable/BUCK

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ rust_library(
1616
"fbsource//third-party/rust:dashmap",
1717
"fbsource//third-party/rust:either",
1818
"fbsource//third-party/rust:erased-serde",
19+
"fbsource//third-party/rust:indexmap",
1920
"fbsource//third-party/rust:num-bigint",
2021
"fbsource//third-party/rust:parking_lot",
2122
"fbsource//third-party/rust:postcard",

pagable/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ dupe = { workspace = true }
1616
either = { workspace = true }
1717
erased-serde = { workspace = true }
1818
gazebo = { workspace = true }
19+
indexmap = { workspace = true }
1920
num-bigint = { workspace = true }
2021
pagable_derive = { path = "../pagable_derive" }
2122
parking_lot = { workspace = true }

pagable/src/impls/collections.rs

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,38 @@ impl<'de, K: Ord + PagableDeserialize<'de>, V: PagableDeserialize<'de>> PagableD
135135
}
136136
}
137137

138+
impl<K: PagableSerialize, V: PagableSerialize, H> PagableSerialize for indexmap::IndexMap<K, V, H> {
139+
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
140+
usize::serialize(&self.len(), serializer.serde())?;
141+
for (k, v) in self {
142+
k.pagable_serialize(serializer)?;
143+
v.pagable_serialize(serializer)?;
144+
}
145+
Ok(())
146+
}
147+
}
148+
149+
impl<
150+
'de,
151+
K: std::hash::Hash + Eq + PagableDeserialize<'de>,
152+
V: PagableDeserialize<'de>,
153+
H: std::default::Default + std::hash::BuildHasher,
154+
> PagableDeserialize<'de> for indexmap::IndexMap<K, V, H>
155+
{
156+
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
157+
deserializer: &mut D,
158+
) -> crate::Result<Self> {
159+
let items = usize::deserialize(deserializer.serde())?;
160+
let mut map: indexmap::IndexMap<K, V, H> = indexmap::IndexMap::default();
161+
for _ in 0..items {
162+
let k = K::pagable_deserialize(deserializer)?;
163+
let v = V::pagable_deserialize(deserializer)?;
164+
map.insert(k, v);
165+
}
166+
Ok(map)
167+
}
168+
}
169+
138170
impl<V: PagableSerialize> PagableSerialize for std::collections::BTreeSet<V> {
139171
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
140172
usize::serialize(&self.len(), serializer.serde())?;
@@ -160,6 +192,31 @@ impl<'de, V: Ord + PagableDeserialize<'de>> PagableDeserialize<'de>
160192
}
161193
}
162194

195+
impl<V: PagableSerialize> PagableSerialize for indexmap::IndexSet<V> {
196+
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
197+
usize::serialize(&self.len(), serializer.serde())?;
198+
for v in self {
199+
v.pagable_serialize(serializer)?;
200+
}
201+
Ok(())
202+
}
203+
}
204+
impl<'de, V: std::hash::Hash + Eq + PagableDeserialize<'de>> PagableDeserialize<'de>
205+
for indexmap::IndexSet<V>
206+
{
207+
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
208+
deserializer: &mut D,
209+
) -> crate::Result<Self> {
210+
let items = usize::deserialize(deserializer.serde())?;
211+
let mut set = indexmap::IndexSet::new();
212+
for _ in 0..items {
213+
let v = V::pagable_deserialize(deserializer)?;
214+
set.insert(v);
215+
}
216+
Ok(set)
217+
}
218+
}
219+
163220
impl<T: PagableSerialize> PagableSerialize for Vec<T> {
164221
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
165222
usize::serialize(&self.len(), serializer.serde())?;
@@ -349,4 +406,44 @@ mod tests {
349406
assert_eq!(set, restored);
350407
Ok(())
351408
}
409+
410+
#[test]
411+
fn test_indexmap_roundtrip() -> crate::Result<()> {
412+
use indexmap::IndexMap;
413+
414+
let mut map: IndexMap<String, i32> = IndexMap::new();
415+
map.insert("one".to_owned(), 1);
416+
map.insert("two".to_owned(), 2);
417+
map.insert("three".to_owned(), 3);
418+
419+
let mut serializer = TestingSerializer::new();
420+
map.pagable_serialize(&mut serializer)?;
421+
let bytes = serializer.finish();
422+
423+
let mut deserializer = TestingDeserializer::new(&bytes);
424+
let restored: IndexMap<String, i32> = IndexMap::pagable_deserialize(&mut deserializer)?;
425+
426+
assert_eq!(map, restored);
427+
Ok(())
428+
}
429+
430+
#[test]
431+
fn test_indexset_roundtrip() -> crate::Result<()> {
432+
use indexmap::IndexSet;
433+
434+
let mut set: IndexSet<String> = IndexSet::new();
435+
set.insert("one".to_owned());
436+
set.insert("two".to_owned());
437+
set.insert("three".to_owned());
438+
439+
let mut serializer = TestingSerializer::new();
440+
set.pagable_serialize(&mut serializer)?;
441+
let bytes = serializer.finish();
442+
443+
let mut deserializer = TestingDeserializer::new(&bytes);
444+
let restored: IndexSet<String> = IndexSet::pagable_deserialize(&mut deserializer)?;
445+
446+
assert_eq!(set, restored);
447+
Ok(())
448+
}
352449
}

0 commit comments

Comments
 (0)