From 5d59d0c7d725fe259b652bb9e9d17e6cbe1919af Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Tue, 23 Jan 2024 19:00:10 -0700
Subject: [PATCH] have `String` use `SliceIndex` impls from `str`
---
library/alloc/src/lib.rs | 1 +
library/alloc/src/string.rs | 102 +++++-------------------------------
2 files changed, 15 insertions(+), 88 deletions(-)
diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs
index 45e93feb6c5b3..28695ade5bf55 100644
--- a/library/alloc/src/lib.rs
+++ b/library/alloc/src/lib.rs
@@ -152,6 +152,7 @@
#![feature(set_ptr_value)]
#![feature(sized_type_properties)]
#![feature(slice_from_ptr_range)]
+#![feature(slice_index_methods)]
#![feature(slice_ptr_get)]
#![feature(slice_ptr_len)]
#![feature(slice_range)]
diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs
index 6dadbc8e36428..25991a91498f1 100644
--- a/library/alloc/src/string.rs
+++ b/library/alloc/src/string.rs
@@ -54,7 +54,7 @@ use core::ops::Add;
use core::ops::AddAssign;
#[cfg(not(no_global_oom_handling))]
use core::ops::Bound::{Excluded, Included, Unbounded};
-use core::ops::{self, Index, IndexMut, Range, RangeBounds};
+use core::ops::{self, Range, RangeBounds};
use core::ptr;
use core::slice;
use core::str::pattern::Pattern;
@@ -2433,100 +2433,26 @@ impl AddAssign<&str> for String {
}
#[stable(feature = "rust1", since = "1.0.0")]
-impl ops::Index> for String {
- type Output = str;
+impl ops::Index for String
+where
+ I: slice::SliceIndex,
+{
+ type Output = I::Output;
#[inline]
- fn index(&self, index: ops::Range) -> &str {
- &self[..][index]
+ fn index(&self, index: I) -> &I::Output {
+ index.index(self.as_str())
}
}
-#[stable(feature = "rust1", since = "1.0.0")]
-impl ops::Index> for String {
- type Output = str;
- #[inline]
- fn index(&self, index: ops::RangeTo) -> &str {
- &self[..][index]
- }
-}
#[stable(feature = "rust1", since = "1.0.0")]
-impl ops::Index> for String {
- type Output = str;
-
- #[inline]
- fn index(&self, index: ops::RangeFrom) -> &str {
- &self[..][index]
- }
-}
-#[stable(feature = "rust1", since = "1.0.0")]
-impl ops::Index for String {
- type Output = str;
-
- #[inline]
- fn index(&self, _index: ops::RangeFull) -> &str {
- unsafe { str::from_utf8_unchecked(&self.vec) }
- }
-}
-#[stable(feature = "inclusive_range", since = "1.26.0")]
-impl ops::Index> for String {
- type Output = str;
-
- #[inline]
- fn index(&self, index: ops::RangeInclusive) -> &str {
- Index::index(&**self, index)
- }
-}
-#[stable(feature = "inclusive_range", since = "1.26.0")]
-impl ops::Index> for String {
- type Output = str;
-
- #[inline]
- fn index(&self, index: ops::RangeToInclusive) -> &str {
- Index::index(&**self, index)
- }
-}
-
-#[stable(feature = "derefmut_for_string", since = "1.3.0")]
-impl ops::IndexMut> for String {
- #[inline]
- fn index_mut(&mut self, index: ops::Range) -> &mut str {
- &mut self[..][index]
- }
-}
-#[stable(feature = "derefmut_for_string", since = "1.3.0")]
-impl ops::IndexMut> for String {
- #[inline]
- fn index_mut(&mut self, index: ops::RangeTo) -> &mut str {
- &mut self[..][index]
- }
-}
-#[stable(feature = "derefmut_for_string", since = "1.3.0")]
-impl ops::IndexMut> for String {
- #[inline]
- fn index_mut(&mut self, index: ops::RangeFrom) -> &mut str {
- &mut self[..][index]
- }
-}
-#[stable(feature = "derefmut_for_string", since = "1.3.0")]
-impl ops::IndexMut for String {
- #[inline]
- fn index_mut(&mut self, _index: ops::RangeFull) -> &mut str {
- unsafe { str::from_utf8_unchecked_mut(&mut *self.vec) }
- }
-}
-#[stable(feature = "inclusive_range", since = "1.26.0")]
-impl ops::IndexMut> for String {
- #[inline]
- fn index_mut(&mut self, index: ops::RangeInclusive) -> &mut str {
- IndexMut::index_mut(&mut **self, index)
- }
-}
-#[stable(feature = "inclusive_range", since = "1.26.0")]
-impl ops::IndexMut> for String {
+impl ops::IndexMut for String
+where
+ I: slice::SliceIndex,
+{
#[inline]
- fn index_mut(&mut self, index: ops::RangeToInclusive) -> &mut str {
- IndexMut::index_mut(&mut **self, index)
+ fn index_mut(&mut self, index: I) -> &mut I::Output {
+ index.index_mut(self.as_mut_str())
}
}