@@ -92,12 +92,22 @@ unsafe impl NSMutableCopying for NSData {
9292 type Output = NSMutableData ;
9393}
9494
95+ impl alloc:: borrow:: ToOwned for NSData {
96+ type Owned = Id < NSData , Shared > ;
97+ fn to_owned ( & self ) -> Self :: Owned {
98+ self . copy ( )
99+ }
100+ }
101+
95102impl AsRef < [ u8 ] > for NSData {
96103 fn as_ref ( & self ) -> & [ u8 ] {
97104 self . bytes ( )
98105 }
99106}
100107
108+ // Note: We don't implement `Borrow<[u8]>` since we can't guarantee that `Eq`,
109+ // `Ord` and `Hash` are equal for `NSData` vs. `[u8]`!
110+
101111impl < I : SliceIndex < [ u8 ] > > Index < I > for NSData {
102112 type Output = I :: Output ;
103113
@@ -217,6 +227,13 @@ unsafe impl NSMutableCopying for NSMutableData {
217227 type Output = NSMutableData ;
218228}
219229
230+ impl alloc:: borrow:: ToOwned for NSMutableData {
231+ type Owned = Id < NSMutableData , Owned > ;
232+ fn to_owned ( & self ) -> Self :: Owned {
233+ self . mutable_copy ( )
234+ }
235+ }
236+
220237impl AsRef < [ u8 ] > for NSMutableData {
221238 fn as_ref ( & self ) -> & [ u8 ] {
222239 self . bytes ( )
@@ -336,7 +353,7 @@ unsafe fn data_from_vec(cls: &Class, bytes: Vec<u8>) -> *mut Object {
336353
337354#[ cfg( test) ]
338355mod tests {
339- use super :: { NSData , NSMutableData } ;
356+ use super :: * ;
340357 #[ cfg( feature = "block" ) ]
341358 use alloc:: vec;
342359
@@ -431,4 +448,46 @@ mod tests {
431448 data. extend ( iter) ;
432449 assert_eq ! ( data. bytes( ) , & [ 1 , 2 , 3 , 4 , 5 ] ) ;
433450 }
451+
452+ #[ test]
453+ fn test_as_ref_borrow ( ) {
454+ use core:: borrow:: { Borrow , BorrowMut } ;
455+
456+ fn impls_borrow < T : AsRef < U > + Borrow < U > + ?Sized , U : ?Sized > ( _: & T ) { }
457+ fn impls_borrow_mut < T : AsMut < U > + BorrowMut < U > + ?Sized , U : ?Sized > ( _: & mut T ) { }
458+
459+ let mut obj = NSMutableData :: new ( ) ;
460+ impls_borrow :: < Id < NSMutableData , Owned > , NSMutableData > ( & obj) ;
461+ impls_borrow_mut :: < Id < NSMutableData , Owned > , NSMutableData > ( & mut obj) ;
462+
463+ impls_borrow :: < NSMutableData , NSMutableData > ( & obj) ;
464+ impls_borrow_mut :: < NSMutableData , NSMutableData > ( & mut obj) ;
465+ impls_borrow :: < NSMutableData , NSData > ( & obj) ;
466+ impls_borrow_mut :: < NSMutableData , NSData > ( & mut obj) ;
467+ impls_borrow :: < NSMutableData , NSObject > ( & obj) ;
468+ impls_borrow_mut :: < NSMutableData , NSObject > ( & mut obj) ;
469+ impls_borrow :: < NSMutableData , Object > ( & obj) ;
470+ impls_borrow_mut :: < NSMutableData , Object > ( & mut obj) ;
471+
472+ impls_borrow :: < NSData , NSData > ( & obj) ;
473+ impls_borrow_mut :: < NSData , NSData > ( & mut obj) ;
474+ impls_borrow :: < NSData , NSObject > ( & obj) ;
475+ impls_borrow_mut :: < NSData , NSObject > ( & mut obj) ;
476+ impls_borrow :: < NSData , Object > ( & obj) ;
477+ impls_borrow_mut :: < NSData , Object > ( & mut obj) ;
478+
479+ fn impls_as_ref < T : AsRef < U > + ?Sized , U : ?Sized > ( _: & T ) { }
480+ fn impls_as_mut < T : AsMut < U > + ?Sized , U : ?Sized > ( _: & mut T ) { }
481+
482+ impls_as_ref :: < NSMutableData , [ u8 ] > ( & obj) ;
483+ impls_as_mut :: < NSMutableData , [ u8 ] > ( & mut obj) ;
484+ impls_as_ref :: < NSData , [ u8 ] > ( & obj) ;
485+
486+ let obj: & mut NSMutableData = & mut * obj;
487+ let _: & [ u8 ] = obj. as_ref ( ) ;
488+ let _: & mut [ u8 ] = obj. as_mut ( ) ;
489+
490+ let obj: & mut NSData = & mut * * obj;
491+ let _: & [ u8 ] = obj. as_ref ( ) ;
492+ }
434493}
0 commit comments