Skip to content

Commit

Permalink
Rollup merge of #111081 - mattfbacon:master, r=workingjubilee
Browse files Browse the repository at this point in the history
impl SliceIndex<str> for (Bound<usize>, Bound<usize>)

This impl is conspicuously missing.
  • Loading branch information
matthiaskrgr committed Aug 1, 2023
2 parents 21f1cf1 + b497a7c commit ae46414
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 4 deletions.
6 changes: 3 additions & 3 deletions core/src/slice/index.rs
Expand Up @@ -727,7 +727,7 @@ where
}

/// Convert pair of `ops::Bound`s into `ops::Range` without performing any bounds checking and (in debug) overflow checking
fn into_range_unchecked(
pub(crate) fn into_range_unchecked(
len: usize,
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
) -> ops::Range<usize> {
Expand All @@ -747,7 +747,7 @@ fn into_range_unchecked(

/// Convert pair of `ops::Bound`s into `ops::Range`.
/// Returns `None` on overflowing indices.
fn into_range(
pub(crate) fn into_range(
len: usize,
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
) -> Option<ops::Range<usize>> {
Expand All @@ -772,7 +772,7 @@ fn into_range(

/// Convert pair of `ops::Bound`s into `ops::Range`.
/// Panics on overflowing indices.
fn into_slice_range(
pub(crate) fn into_slice_range(
len: usize,
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
) -> ops::Range<usize> {
Expand Down
2 changes: 1 addition & 1 deletion core/src/slice/mod.rs
Expand Up @@ -38,7 +38,7 @@ pub mod sort;

mod ascii;
mod cmp;
mod index;
pub(crate) mod index;
mod iter;
mod raw;
mod rotate;
Expand Down
52 changes: 52 additions & 0 deletions core/src/str/traits.rs
Expand Up @@ -252,6 +252,58 @@ unsafe impl SliceIndex<str> for ops::Range<usize> {
}
}

/// Implements substring slicing for arbitrary bounds.
///
/// Returns a slice of the given string bounded by the byte indices
/// provided by each bound.
///
/// This operation is *O*(1).
///
/// # Panics
///
/// Panics if `begin` or `end` (if it exists and once adjusted for
/// inclusion/exclusion) does not point to the starting byte offset of
/// a character (as defined by `is_char_boundary`), if `begin > end`, or if
/// `end > len`.
#[stable(feature = "slice_index_str_with_ops_bound_pair", since = "CURRENT_RUSTC_VERSION")]
unsafe impl SliceIndex<str> for (ops::Bound<usize>, ops::Bound<usize>) {
type Output = str;

#[inline]
fn get(self, slice: &str) -> Option<&str> {
crate::slice::index::into_range(slice.len(), self)?.get(slice)
}

#[inline]
fn get_mut(self, slice: &mut str) -> Option<&mut str> {
crate::slice::index::into_range(slice.len(), self)?.get_mut(slice)
}

#[inline]
unsafe fn get_unchecked(self, slice: *const str) -> *const str {
let len = (slice as *const [u8]).len();
// SAFETY: the caller has to uphold the safety contract for `get_unchecked`.
unsafe { crate::slice::index::into_range_unchecked(len, self).get_unchecked(slice) }
}

#[inline]
unsafe fn get_unchecked_mut(self, slice: *mut str) -> *mut str {
let len = (slice as *mut [u8]).len();
// SAFETY: the caller has to uphold the safety contract for `get_unchecked_mut`.
unsafe { crate::slice::index::into_range_unchecked(len, self).get_unchecked_mut(slice) }
}

#[inline]
fn index(self, slice: &str) -> &str {
crate::slice::index::into_slice_range(slice.len(), self).index(slice)
}

#[inline]
fn index_mut(self, slice: &mut str) -> &mut str {
crate::slice::index::into_slice_range(slice.len(), self).index_mut(slice)
}
}

/// Implements substring slicing with syntax `&self[.. end]` or `&mut
/// self[.. end]`.
///
Expand Down

0 comments on commit ae46414

Please sign in to comment.