Rollup merge of #111081 - mattfbacon:master, r=workingjubilee
impl SliceIndex<str> for (Bound<usize>, Bound<usize>) This impl is conspicuously missing.
This commit is contained in:
commit
14a5dc52c7
3 changed files with 56 additions and 4 deletions
|
@ -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> {
|
||||
|
@ -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>> {
|
||||
|
@ -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> {
|
||||
|
|
|
@ -38,7 +38,7 @@ pub mod sort;
|
|||
|
||||
mod ascii;
|
||||
mod cmp;
|
||||
mod index;
|
||||
pub(crate) mod index;
|
||||
mod iter;
|
||||
mod raw;
|
||||
mod rotate;
|
||||
|
|
|
@ -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]`.
|
||||
///
|
||||
|
|
Loading…
Add table
Reference in a new issue