@@ -2498,3 +2498,106 @@ impl<T> Clone for ConstNonNull<T> {
24982498}
24992499
25002500impl < T > Copy for ConstNonNull < T > { }
2501+
2502+ #[ cfg( feature = "impl_bincode" ) ]
2503+ use bincode:: {
2504+ de:: { BorrowDecoder , Decode , Decoder , read:: Reader } ,
2505+ enc:: { Encode , Encoder , write:: Writer } ,
2506+ error:: { DecodeError , EncodeError } ,
2507+ BorrowDecode ,
2508+ } ;
2509+
2510+ #[ cfg( feature = "impl_bincode" ) ]
2511+ impl < A , Context > Decode < Context > for SmallVec < A >
2512+ where
2513+ A : Array ,
2514+ A :: Item : Decode < Context > ,
2515+ {
2516+ fn decode < D : Decoder < Context = Context > > ( decoder : & mut D ) -> Result < Self , DecodeError > {
2517+ use core:: convert:: TryInto ;
2518+ let len = u64:: decode ( decoder) ?;
2519+ let len = len. try_into ( ) . map_err ( |_| DecodeError :: OutsideUsizeRange ( len) ) ?;
2520+ decoder. claim_container_read :: < A :: Item > ( len) ?;
2521+
2522+ let mut vec = SmallVec :: with_capacity ( len) ;
2523+ if unty:: type_equal :: < A :: Item , u8 > ( ) {
2524+ // Initialize the smallvec's buffer. Note that we need to do this through
2525+ // the raw pointer as we cannot name the type [u8; N] even though A::Item is u8.
2526+ let ptr = vec. as_mut_ptr ( ) ;
2527+ // SAFETY: A::Item is u8 and the smallvec has been allocated with enough capacity
2528+ unsafe {
2529+ core:: ptr:: write_bytes ( ptr, 0 , len) ;
2530+ vec. set_len ( len) ;
2531+ }
2532+ // Read the data into the smallvec's buffer.
2533+ let slice = vec. as_mut_slice ( ) ;
2534+ // SAFETY: A::Item is u8
2535+ let slice = unsafe { core:: mem:: transmute :: < & mut [ A :: Item ] , & mut [ u8 ] > ( slice) } ;
2536+ decoder. reader ( ) . read ( slice) ?;
2537+ } else {
2538+ for _ in 0 ..len {
2539+ decoder. unclaim_bytes_read ( core:: mem:: size_of :: < A :: Item > ( ) ) ;
2540+ vec. push ( A :: Item :: decode ( decoder) ?) ;
2541+ }
2542+ }
2543+ Ok ( vec)
2544+ }
2545+ }
2546+
2547+ #[ cfg( feature = "impl_bincode" ) ]
2548+ impl < ' de , A , Context > BorrowDecode < ' de , Context > for SmallVec < A >
2549+ where
2550+ A : Array ,
2551+ A :: Item : BorrowDecode < ' de , Context > ,
2552+ {
2553+ fn borrow_decode < D : BorrowDecoder < ' de , Context = Context > > ( decoder : & mut D ) -> Result < Self , DecodeError > {
2554+ use core:: convert:: TryInto ;
2555+ let len = u64:: decode ( decoder) ?;
2556+ let len = len. try_into ( ) . map_err ( |_| DecodeError :: OutsideUsizeRange ( len) ) ?;
2557+ decoder. claim_container_read :: < A :: Item > ( len) ?;
2558+
2559+ let mut vec = SmallVec :: with_capacity ( len) ;
2560+ if unty:: type_equal :: < A :: Item , u8 > ( ) {
2561+ // Initialize the smallvec's buffer. Note that we need to do this through
2562+ // the raw pointer as we cannot name the type [u8; N] even though A::Item is u8.
2563+ let ptr = vec. as_mut_ptr ( ) ;
2564+ // SAFETY: A::Item is u8 and the smallvec has been allocated with enough capacity
2565+ unsafe {
2566+ core:: ptr:: write_bytes ( ptr, 0 , len) ;
2567+ vec. set_len ( len) ;
2568+ }
2569+ // Read the data into the smallvec's buffer.
2570+ let slice = vec. as_mut_slice ( ) ;
2571+ // SAFETY: A::Item is u8
2572+ let slice = unsafe { core:: mem:: transmute :: < & mut [ A :: Item ] , & mut [ u8 ] > ( slice) } ;
2573+ decoder. reader ( ) . read ( slice) ?;
2574+ } else {
2575+ for _ in 0 ..len {
2576+ decoder. unclaim_bytes_read ( core:: mem:: size_of :: < A :: Item > ( ) ) ;
2577+ vec. push ( A :: Item :: borrow_decode ( decoder) ?) ;
2578+ }
2579+ }
2580+ Ok ( vec)
2581+ }
2582+ }
2583+
2584+ #[ cfg( feature = "impl_bincode" ) ]
2585+ impl < A > Encode for SmallVec < A >
2586+ where
2587+ A : Array ,
2588+ A :: Item : Encode ,
2589+ {
2590+ fn encode < E : Encoder > ( & self , encoder : & mut E ) -> Result < ( ) , EncodeError > {
2591+ ( self . len ( ) as u64 ) . encode ( encoder) ?;
2592+ if unty:: type_equal :: < A :: Item , u8 > ( ) {
2593+ // Safety: A::Item is u8
2594+ let slice: & [ u8 ] = unsafe { core:: mem:: transmute ( self . as_slice ( ) ) } ;
2595+ encoder. writer ( ) . write ( slice) ?;
2596+ } else {
2597+ for item in self . iter ( ) {
2598+ item. encode ( encoder) ?;
2599+ }
2600+ }
2601+ Ok ( ( ) )
2602+ }
2603+ }
0 commit comments