@@ -29,6 +29,9 @@ use alloc::Vec;
2929#[ cfg( feature="heapsizeof" ) ]
3030extern crate heapsize;
3131
32+ #[ cfg( feature = "serde" ) ]
33+ extern crate serde;
34+
3235#[ cfg( not( feature = "std" ) ) ]
3336mod std {
3437 pub use core:: * ;
@@ -47,6 +50,12 @@ use std::slice;
4750use std:: io;
4851#[ cfg( feature="heapsizeof" ) ]
4952use 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" ) ]
5261use 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+
716772impl < ' 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