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
@ -727,7 +727,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Convert pair of `ops::Bound`s into `ops::Range` without performing any bounds checking and (in debug) overflow checking
|
/// 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,
|
len: usize,
|
||||||
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
|
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
|
||||||
) -> ops::Range<usize> {
|
) -> ops::Range<usize> {
|
||||||
@ -747,7 +747,7 @@ fn into_range_unchecked(
|
|||||||
|
|
||||||
/// Convert pair of `ops::Bound`s into `ops::Range`.
|
/// Convert pair of `ops::Bound`s into `ops::Range`.
|
||||||
/// Returns `None` on overflowing indices.
|
/// Returns `None` on overflowing indices.
|
||||||
fn into_range(
|
pub(crate) fn into_range(
|
||||||
len: usize,
|
len: usize,
|
||||||
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
|
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
|
||||||
) -> Option<ops::Range<usize>> {
|
) -> Option<ops::Range<usize>> {
|
||||||
@ -772,7 +772,7 @@ fn into_range(
|
|||||||
|
|
||||||
/// Convert pair of `ops::Bound`s into `ops::Range`.
|
/// Convert pair of `ops::Bound`s into `ops::Range`.
|
||||||
/// Panics on overflowing indices.
|
/// Panics on overflowing indices.
|
||||||
fn into_slice_range(
|
pub(crate) fn into_slice_range(
|
||||||
len: usize,
|
len: usize,
|
||||||
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
|
(start, end): (ops::Bound<usize>, ops::Bound<usize>),
|
||||||
) -> ops::Range<usize> {
|
) -> ops::Range<usize> {
|
||||||
|
@ -38,7 +38,7 @@ pub mod sort;
|
|||||||
|
|
||||||
mod ascii;
|
mod ascii;
|
||||||
mod cmp;
|
mod cmp;
|
||||||
mod index;
|
pub(crate) mod index;
|
||||||
mod iter;
|
mod iter;
|
||||||
mod raw;
|
mod raw;
|
||||||
mod rotate;
|
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
|
/// Implements substring slicing with syntax `&self[.. end]` or `&mut
|
||||||
/// self[.. end]`.
|
/// self[.. end]`.
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user