@@ -473,24 +473,30 @@ pub trait MatTraitConstManual: MatTraitConst {
473
473
unsafe fn at_row_unchecked < T : DataType > ( & self , row : i32 ) -> Result < & [ T ] > {
474
474
// safe because Mat::size() can't be negative
475
475
let width = self . size ( ) ?. width as usize ;
476
- self . ptr ( row) . map ( |x| slice:: from_raw_parts ( convert_ptr ( x) , width) )
476
+ self . ptr ( row) . map ( |row| {
477
+ if row. is_null ( ) {
478
+ & [ ]
479
+ } else {
480
+ slice:: from_raw_parts ( convert_ptr ( row) , width)
481
+ }
482
+ } )
477
483
}
478
484
479
485
#[ inline]
480
486
fn is_allocated ( & self ) -> bool {
481
487
!self . data ( ) . is_null ( )
482
488
}
483
489
484
- /// Returns underlying data array as byte slice, Mat must be continuous.
490
+ /// Returns underlying data array as byte slice, ` Mat` must be continuous
485
491
#[ inline]
486
492
fn data_bytes ( & self ) -> Result < & [ u8 ] > {
487
493
match_is_continuous ( self ) . and_then ( |_| {
488
494
let data = self . data ( ) ;
489
- if data. is_null ( ) {
490
- Err ( Error :: new ( core :: StsNullPtr , "Function returned null pointer" ) )
495
+ Ok ( if data. is_null ( ) {
496
+ & [ ]
491
497
} else {
492
- Ok ( unsafe { slice:: from_raw_parts ( data, self . total ( ) * self . elem_size ( ) ?) } )
493
- }
498
+ unsafe { slice:: from_raw_parts ( data, self . total ( ) * self . elem_size ( ) ?) }
499
+ } )
494
500
} )
495
501
}
496
502
@@ -502,15 +508,15 @@ pub trait MatTraitConstManual: MatTraitConst {
502
508
}
503
509
504
510
/// # Safety
505
- /// Caller must ensure that the `T` type argument corresponds to the data stored in the `Mat`
511
+ /// Caller must ensure that the `T` type argument corresponds to the data stored in the `Mat` and `Mat` is continuous
506
512
#[ inline]
507
513
unsafe fn data_typed_unchecked < T : DataType > ( & self ) -> Result < & [ T ] > {
508
514
let data = self . data ( ) ;
509
- if data. is_null ( ) {
510
- Err ( Error :: new ( core :: StsNullPtr , "Function returned null pointer" ) )
515
+ Ok ( if data. is_null ( ) {
516
+ & [ ]
511
517
} else {
512
- Ok ( slice:: from_raw_parts ( data. cast :: < T > ( ) , self . total ( ) ) )
513
- }
518
+ slice:: from_raw_parts ( data. cast :: < T > ( ) , self . total ( ) )
519
+ } )
514
520
}
515
521
516
522
fn to_vec_2d < T : DataType > ( & self ) -> Result < Vec < Vec < T > > > {
@@ -624,16 +630,26 @@ pub trait MatTraitManual: MatTraitConstManual + MatTrait {
624
630
unsafe fn at_row_unchecked_mut < T : DataType > ( & mut self , row : i32 ) -> Result < & mut [ T ] > {
625
631
// safe because Mat::size() can't be negative
626
632
let width = self . size ( ) ?. width as usize ;
627
- self
628
- . ptr_mut ( row)
629
- . map ( |x| slice:: from_raw_parts_mut ( convert_ptr_mut ( x) , width) )
633
+ self . ptr_mut ( row) . map ( |x| {
634
+ if x. is_null ( ) {
635
+ & mut [ ]
636
+ } else {
637
+ slice:: from_raw_parts_mut ( convert_ptr_mut ( x) , width)
638
+ }
639
+ } )
630
640
}
631
641
632
642
/// Returns underlying data array as mutable byte slice, Mat must be continuous.
633
643
#[ inline]
634
644
fn data_bytes_mut ( & mut self ) -> Result < & mut [ u8 ] > {
635
- match_is_continuous ( self )
636
- . and_then ( |_| Ok ( unsafe { slice:: from_raw_parts_mut ( self . data_mut ( ) , self . total ( ) * self . elem_size ( ) ?) } ) )
645
+ match_is_continuous ( self ) . and_then ( |_| {
646
+ let data = self . data_mut ( ) ;
647
+ Ok ( if data. is_null ( ) {
648
+ & mut [ ]
649
+ } else {
650
+ unsafe { slice:: from_raw_parts_mut ( self . data_mut ( ) , self . total ( ) * self . elem_size ( ) ?) }
651
+ } )
652
+ } )
637
653
}
638
654
639
655
#[ inline]
@@ -643,11 +659,16 @@ pub trait MatTraitManual: MatTraitConstManual + MatTrait {
643
659
}
644
660
645
661
/// # Safety
646
- /// Caller must ensure that the `T` type argument corresponds to the data stored in the `Mat`
662
+ /// Caller must ensure that the `T` type argument corresponds to the data stored in the `Mat` and `Mat` is continuous
647
663
#[ inline]
648
664
unsafe fn data_typed_unchecked_mut < T : DataType > ( & mut self ) -> Result < & mut [ T ] > {
649
665
let total = self . total ( ) ;
650
- Ok ( slice:: from_raw_parts_mut ( self . data_mut ( ) . cast :: < T > ( ) , total) )
666
+ let data = self . data_mut ( ) ;
667
+ Ok ( if data. is_null ( ) {
668
+ & mut [ ]
669
+ } else {
670
+ slice:: from_raw_parts_mut ( data. cast :: < T > ( ) , total)
671
+ } )
651
672
}
652
673
653
674
/// Returns a mutable iterator over `Mat` elements and their positions
@@ -707,9 +728,14 @@ impl Deref for MatSize {
707
728
708
729
#[ inline]
709
730
fn deref ( & self ) -> & Self :: Target {
710
- // safe because `Mat::dims()` returns value >= 2
711
- let dims = self . dims ( ) as usize ;
712
- unsafe { slice:: from_raw_parts ( self . p ( ) , dims) }
731
+ let p = self . p ( ) ;
732
+ if p. is_null ( ) {
733
+ & [ ]
734
+ } else {
735
+ // safe because `Mat::dims()` returns value >= 2
736
+ let dims = self . dims ( ) as usize ;
737
+ unsafe { slice:: from_raw_parts ( p, dims) }
738
+ }
713
739
}
714
740
}
715
741
0 commit comments