@@ -2498,3 +2498,106 @@ impl<T> Clone for ConstNonNull<T> {
2498
2498
}
2499
2499
2500
2500
impl < 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