Skip to content

Commit e162ecc

Browse files
author
bors-servo
authored
Auto merge of #57 - Xaeroxe:serde, r=mbrubeck
Add serde support Things done in this PR: - Add optional serde dependency - Add Serialize and Deserialize implementations to SmallVec - Add test_serde to verify functionality. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/rust-smallvec/57) <!-- Reviewable:end -->
2 parents ecc9007 + 40cfbb4 commit e162ecc

File tree

3 files changed

+83
-2
lines changed

3 files changed

+83
-2
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ rust:
55
- stable
66
script: |
77
cargo build --verbose &&
8-
cargo build --features=heapsizeof --verbose &&
8+
cargo build --all-features --verbose &&
99
cargo test --verbose &&
10-
cargo test --features=heapsizeof --verbose &&
10+
cargo test --all-features --verbose &&
1111
([ $TRAVIS_RUST_VERSION != nightly ] || cargo test --verbose --no-default-features) &&
1212
([ $TRAVIS_RUST_VERSION != nightly ] || cargo bench --verbose bench)
1313
notifications:

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ path = "lib.rs"
2020

2121
[dependencies]
2222
heapsize = { version = "0.4", optional = true }
23+
serde = { version = "1", optional = true }
24+
25+
[dev_dependencies]
26+
bincode = "0.8"

lib.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ use alloc::Vec;
2929
#[cfg(feature="heapsizeof")]
3030
extern crate heapsize;
3131

32+
#[cfg(feature = "serde")]
33+
extern crate serde;
34+
3235
#[cfg(not(feature = "std"))]
3336
mod std {
3437
pub use core::*;
@@ -47,6 +50,12 @@ use std::slice;
4750
use std::io;
4851
#[cfg(feature="heapsizeof")]
4952
use std::os::raw::c_void;
53+
#[cfg(feature = "serde")]
54+
use serde::ser::{Serialize, Serializer, SerializeSeq};
55+
#[cfg(feature = "serde")]
56+
use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor};
57+
#[cfg(feature = "serde")]
58+
use std::marker::PhantomData;
5059

5160
#[cfg(feature="heapsizeof")]
5261
use heapsize::{HeapSizeOf, heap_size_of};
@@ -713,6 +722,53 @@ impl<A: Array<Item = u8>> io::Write for SmallVec<A> {
713722
}
714723
}
715724

725+
#[cfg(feature = "serde")]
726+
impl<A: Array> Serialize for SmallVec<A> where A::Item: Serialize {
727+
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
728+
let mut state = serializer.serialize_seq(Some(self.len()))?;
729+
for item in self {
730+
state.serialize_element(&item)?;
731+
}
732+
state.end()
733+
}
734+
}
735+
736+
#[cfg(feature = "serde")]
737+
impl<'de, A: Array> Deserialize<'de> for SmallVec<A> where A::Item: Deserialize<'de> {
738+
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
739+
deserializer.deserialize_seq(SmallVecVisitor{phantom: PhantomData})
740+
}
741+
}
742+
743+
#[cfg(feature = "serde")]
744+
struct SmallVecVisitor<A> {
745+
phantom: PhantomData<A>
746+
}
747+
748+
#[cfg(feature = "serde")]
749+
impl<'de, A: Array> Visitor<'de> for SmallVecVisitor<A>
750+
where A::Item: Deserialize<'de>,
751+
{
752+
type Value = SmallVec<A>;
753+
754+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
755+
formatter.write_str("a sequence")
756+
}
757+
758+
fn visit_seq<B>(self, mut seq: B) -> Result<Self::Value, B::Error>
759+
where
760+
B: SeqAccess<'de>,
761+
{
762+
let mut values = SmallVec::new();
763+
764+
while let Some(value) = seq.next_element()? {
765+
values.push(value);
766+
}
767+
768+
Ok(values)
769+
}
770+
}
771+
716772
impl<'a, A: Array> From<&'a [A::Item]> for SmallVec<A> where A::Item: Clone {
717773
#[inline]
718774
fn from(slice: &'a [A::Item]) -> SmallVec<A> {
@@ -1549,4 +1605,25 @@ pub mod tests {
15491605
small_vec.write_all(&data[..]).unwrap();
15501606
assert_eq!(small_vec.as_ref(), data.as_ref());
15511607
}
1608+
1609+
extern crate bincode;
1610+
1611+
#[cfg(feature = "serde")]
1612+
#[test]
1613+
fn test_serde() {
1614+
use self::bincode::{serialize, deserialize, Bounded};
1615+
let mut small_vec: SmallVec<[i32; 2]> = SmallVec::new();
1616+
small_vec.push(1);
1617+
let encoded = serialize(&small_vec, Bounded(100)).unwrap();
1618+
let decoded: SmallVec<[i32; 2]> = deserialize(&encoded).unwrap();
1619+
assert_eq!(small_vec, decoded);
1620+
small_vec.push(2);
1621+
// Spill the vec
1622+
small_vec.push(3);
1623+
small_vec.push(4);
1624+
// Check again after spilling.
1625+
let encoded = serialize(&small_vec, Bounded(100)).unwrap();
1626+
let decoded: SmallVec<[i32; 2]> = deserialize(&encoded).unwrap();
1627+
assert_eq!(small_vec, decoded);
1628+
}
15521629
}

0 commit comments

Comments
 (0)