Skip to content

Commit f158822

Browse files
authored
Improved Get<ByteSpan, crate::ops::Range<usize>> by existing functions. (#8553)
1 parent bc5c197 commit f158822

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

corelib/src/byte_array.cairo

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ use crate::cmp::min;
5555
use crate::integer::{U32TryIntoNonZero, u128_safe_divmod};
5656
#[feature("bounded-int-utils")]
5757
use 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)]
6060
use crate::serde::Serde;
6161
use crate::traits::{Into, TryInto};
@@ -72,7 +72,6 @@ pub const BYTE_ARRAY_MAGIC: felt252 =
7272
0x46a6158a16a947e5916b2a2ca68501a45e93d7110e81aa2d6438b1c57c879a3;
7373
const BYTES_IN_U128: usize = 16;
7474
const 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

Comments
 (0)