@@ -29,6 +29,9 @@ use alloc::Vec;
29
29
#[ cfg( feature="heapsizeof" ) ]
30
30
extern crate heapsize;
31
31
32
+ #[ cfg( feature = "serde" ) ]
33
+ extern crate serde;
34
+
32
35
#[ cfg( not( feature = "std" ) ) ]
33
36
mod std {
34
37
pub use core:: * ;
@@ -47,6 +50,12 @@ use std::slice;
47
50
use std:: io;
48
51
#[ cfg( feature="heapsizeof" ) ]
49
52
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 ;
50
59
51
60
#[ cfg( feature="heapsizeof" ) ]
52
61
use heapsize:: { HeapSizeOf , heap_size_of} ;
@@ -713,6 +722,53 @@ impl<A: Array<Item = u8>> io::Write for SmallVec<A> {
713
722
}
714
723
}
715
724
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
+
716
772
impl < ' a , A : Array > From < & ' a [ A :: Item ] > for SmallVec < A > where A :: Item : Clone {
717
773
#[ inline]
718
774
fn from ( slice : & ' a [ A :: Item ] ) -> SmallVec < A > {
@@ -1549,4 +1605,25 @@ pub mod tests {
1549
1605
small_vec. write_all ( & data[ ..] ) . unwrap ( ) ;
1550
1606
assert_eq ! ( small_vec. as_ref( ) , data. as_ref( ) ) ;
1551
1607
}
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
+ }
1552
1629
}
0 commit comments