@@ -55,7 +55,7 @@ use crate::cmp::min;
5555use crate :: integer :: {U32TryIntoNonZero , u128_safe_divmod};
5656#[feature(" bounded-int-utils" )]
5757use crate :: internal :: bounded_int :: {self, BoundedInt , downcast, upcast};
58- use crate :: num :: traits :: CheckedSub ;
58+ use crate :: num :: traits :: { CheckedAdd , CheckedSub } ;
5959#[allow(unused_imports)]
6060use crate :: serde :: Serde ;
6161use crate :: traits :: {Into , TryInto };
@@ -72,7 +72,6 @@ pub const BYTE_ARRAY_MAGIC: felt252 =
7272 0x46a6158a16a947e5916b2a2ca68501a45e93d7110e81aa2d6438b1c57c879a3 ;
7373const BYTES_IN_U128 : usize = 16 ;
7474const BYTES_IN_BYTES31_MINUS_ONE : usize = BYTES_IN_BYTES31 - 1 ;
75- const BYTES_IN_BYTES31_NONZERO : NonZero <usize > = BYTES_IN_BYTES31 . try_into (). unwrap ();
7675
7776// TODO(yuval): don't allow creation of invalid ByteArray?
7877/// Byte array type.
@@ -867,33 +866,32 @@ impl ByteSpanGetRange of crate::ops::Get<ByteSpan, crate::ops::Range<usize>> {
867866 /// If out of bounds: returns `None`.
868867 fn get (self : @ ByteSpan , index : crate :: ops :: Range <usize >) -> Option <ByteSpan > {
869868 let range = index ;
870- let len = (range . end). checked_sub (range . start)? ;
871- if len == 0 {
869+ if range . start == range . end {
872870 return Some (Default :: default ());
873871 }
874- if range . end > self . len () {
872+ if range . start > range . end {
875873 return None ;
876874 }
877-
878- let abs_start = range . start + upcast ( * self . first_char_start_offset );
879- let (start_word , start_offset ) = DivRem :: div_rem ( abs_start , BYTES_IN_BYTES31_NONZERO );
880- let ( end_word , end_offset ) = DivRem :: div_rem ( abs_start + len , BYTES_IN_BYTES31_NONZERO ) ;
881- let data_len = self . data . len ();
882-
883- let remainder_with_end_offset_trimmed = if end_word < data_len {
884- let word = ( * self . data[ end_word ]) . into () ;
885- shift_right (word , BYTES_IN_BYTES31 , BYTES_IN_BYTES31 - end_offset )
875+ let base_start_offset : usize = upcast ( * self . first_char_start_offset);
876+ let ( start_word , start_offset ) = len_parts ( range . start. checked_add ( base_start_offset ) ? );
877+ let (end_word , end_offset ) = len_parts ( range . end . checked_add ( base_start_offset ) ? );
878+ let data_slice_len = end_word . checked_sub ( start_word ) ? ;
879+
880+ let remainder_with_end_offset_trimmed = if self . data . len () == end_word {
881+ let remainder_len : usize = upcast ( * self . remainder_len);
882+ let offset = remainder_len . checked_sub ( upcast ( end_offset )) ? ;
883+ shift_right (* self . remainder_word, remainder_len , offset )
886884 } else {
887- let remainder_len = upcast ( * self . remainder_len) ;
888- shift_right (* self . remainder_word, remainder_len , remainder_len - end_offset )
885+ let word = * * self . data . get ( end_word ) ? ;
886+ shift_right (word . into (), BYTES_IN_BYTES31 , BYTES_IN_BYTES31 - upcast ( end_offset ) )
889887 };
890888
891889 Some (
892890 ByteSpan {
893- data : self . data. slice (start_word , min ( end_word , data_len ) - start_word ),
894- first_char_start_offset : downcast ( start_offset ) . unwrap () ,
891+ data : self . data. slice (start_word , data_slice_len ),
892+ first_char_start_offset : start_offset ,
895893 remainder_word : remainder_with_end_offset_trimmed ,
896- remainder_len : downcast ( end_offset ) . unwrap () ,
894+ remainder_len : end_offset ,
897895 },
898896 )
899897 }
0 commit comments