@@ -632,7 +632,7 @@ fn size_from_ptr<T>(_: *const T) -> usize {
632
632
633
633
634
634
// Use macro to be generic over const/mut
635
- macro_rules! slice_offset {
635
+ macro_rules! slice_add_offset {
636
636
( $ptr: expr, $by: expr) => { {
637
637
let ptr = $ptr;
638
638
if size_from_ptr( ptr) == 0 {
@@ -643,6 +643,17 @@ macro_rules! slice_offset {
643
643
} } ;
644
644
}
645
645
646
+ macro_rules! slice_sub_offset {
647
+ ( $ptr: expr, $by: expr) => { {
648
+ let ptr = $ptr;
649
+ if size_from_ptr( ptr) == 0 {
650
+ transmute( ptr as usize - $by)
651
+ } else {
652
+ ptr. offset( -$by)
653
+ }
654
+ } } ;
655
+ }
656
+
646
657
macro_rules! slice_ref {
647
658
( $ptr: expr) => { {
648
659
let ptr = $ptr;
@@ -672,7 +683,7 @@ macro_rules! iterator {
672
683
None
673
684
} else {
674
685
let old = self . ptr;
675
- self . ptr = slice_offset !( self . ptr, 1 ) ;
686
+ self . ptr = slice_add_offset !( self . ptr, 1 ) ;
676
687
Some ( slice_ref!( old) )
677
688
}
678
689
}
@@ -714,7 +725,7 @@ macro_rules! iterator {
714
725
if self . end == self . ptr {
715
726
None
716
727
} else {
717
- self . end = slice_offset !( self . end, - 1 ) ;
728
+ self . end = slice_sub_offset !( self . end, 1 ) ;
718
729
Some ( slice_ref!( self . end) )
719
730
}
720
731
}
@@ -816,7 +827,7 @@ impl<'a, T> Iter<'a, T> {
816
827
fn iter_nth ( & mut self , n : usize ) -> Option < & ' a T > {
817
828
match self . as_slice ( ) . get ( n) {
818
829
Some ( elem_ref) => unsafe {
819
- self . ptr = slice_offset ! ( elem_ref as * const _, 1 ) ;
830
+ self . ptr = slice_add_offset ! ( elem_ref as * const _, 1 ) ;
820
831
Some ( slice_ref ! ( elem_ref) )
821
832
} ,
822
833
None => {
@@ -959,7 +970,7 @@ impl<'a, T> IterMut<'a, T> {
959
970
fn iter_nth ( & mut self , n : usize ) -> Option < & ' a mut T > {
960
971
match make_mut_slice ! ( T => & ' a mut [ T ] : self . ptr, self . end) . get_mut ( n) {
961
972
Some ( elem_ref) => unsafe {
962
- self . ptr = slice_offset ! ( elem_ref as * mut _, 1 ) ;
973
+ self . ptr = slice_add_offset ! ( elem_ref as * mut _, 1 ) ;
963
974
Some ( slice_ref ! ( elem_ref) )
964
975
} ,
965
976
None => {
0 commit comments