Skip to content

Commit e2c6399

Browse files
cjhopmanmeta-codesync[bot]
authored andcommitted
Add PagableSer/De for SmallVec
Summary: Adds PagableSerialize and PagableDeserialize implementations for smallvec::SmallVec. Serializes length followed by elements. Reviewed By: IanChilds Differential Revision: D91571266 fbshipit-source-id: 74e1d4e1bfb9bc01e94ee6ae5ec72f32cb7c3a7b
1 parent 78e27ba commit e2c6399

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

pagable/BUCK

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ rust_library(
2424
"fbsource//third-party/rust:sequence_trie",
2525
"fbsource//third-party/rust:serde",
2626
"fbsource//third-party/rust:serde_json",
27+
"fbsource//third-party/rust:smallvec",
2728
"fbsource//third-party/rust:static_assertions",
2829
"fbsource//third-party/rust:take_mut",
2930
"fbsource//third-party/rust:tokio",

pagable/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ serde = { workspace = true }
2626
serde_json = { workspace = true }
2727
sequence_trie = { workspace = true }
2828
sorted_vector_map = { workspace = true }
29+
smallvec = { workspace = true }
2930
static_assertions = { workspace = true }
3031
strong_hash = { workspace = true }
3132
take_mut = { workspace = true }

pagable/src/impls/collections.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,31 @@ impl<'de, T: PagableDeserialize<'de>> PagableDeserialize<'de> for Vec<T> {
240240
}
241241
}
242242

243+
impl<T: PagableSerialize, const N: usize> PagableSerialize for smallvec::SmallVec<[T; N]> {
244+
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
245+
usize::serialize(&self.len(), serializer.serde())?;
246+
for v in self {
247+
v.pagable_serialize(serializer)?;
248+
}
249+
Ok(())
250+
}
251+
}
252+
253+
impl<'de, T: PagableDeserialize<'de>, const N: usize> PagableDeserialize<'de>
254+
for smallvec::SmallVec<[T; N]>
255+
{
256+
fn pagable_deserialize<D: PagableDeserializer<'de> + ?Sized>(
257+
deserializer: &mut D,
258+
) -> crate::Result<Self> {
259+
let items = usize::deserialize(deserializer.serde())?;
260+
let mut v = smallvec::SmallVec::with_capacity(items);
261+
for _ in 0..items {
262+
v.push(T::pagable_deserialize(deserializer)?);
263+
}
264+
Ok(v)
265+
}
266+
}
267+
243268
impl<'a, T: PagableSerialize> PagableSerialize for &'a [T] {
244269
fn pagable_serialize(&self, serializer: &mut dyn PagableSerializer) -> crate::Result<()> {
245270
for v in *self {
@@ -446,4 +471,24 @@ mod tests {
446471
assert_eq!(set, restored);
447472
Ok(())
448473
}
474+
475+
#[test]
476+
fn test_smallvec_roundtrip() -> crate::Result<()> {
477+
use smallvec::SmallVec;
478+
479+
let mut vec: SmallVec<[String; 4]> = SmallVec::new();
480+
vec.push("one".to_owned());
481+
vec.push("two".to_owned());
482+
vec.push("three".to_owned());
483+
484+
let mut serializer = TestingSerializer::new();
485+
vec.pagable_serialize(&mut serializer)?;
486+
let bytes = serializer.finish();
487+
488+
let mut deserializer = TestingDeserializer::new(&bytes);
489+
let restored: SmallVec<[String; 4]> = SmallVec::pagable_deserialize(&mut deserializer)?;
490+
491+
assert_eq!(vec, restored);
492+
Ok(())
493+
}
449494
}

0 commit comments

Comments
 (0)