const fn str::split_at* · qinheping/verify-rust-std@6799f85 (original) (raw)
`@@ -640,7 +640,8 @@ impl str {
`
640
640
`#[inline]
`
641
641
`#[must_use]
`
642
642
`#[stable(feature = "str_split_at", since = "1.4.0")]
`
643
``
`-
pub fn split_at(&self, mid: usize) -> (&str, &str) {
`
``
643
`+
#[rustc_const_unstable(feature = "const_str_split_at", issue = "131518")]
`
``
644
`+
pub const fn split_at(&self, mid: usize) -> (&str, &str) {
`
644
645
`match self.split_at_checked(mid) {
`
645
646
`None => slice_error_fail(self, 0, mid),
`
646
647
`Some(pair) => pair,
`
`@@ -680,7 +681,8 @@ impl str {
`
680
681
`#[inline]
`
681
682
`#[must_use]
`
682
683
`#[stable(feature = "str_split_at", since = "1.4.0")]
`
683
``
`-
pub fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str) {
`
``
684
`+
#[rustc_const_unstable(feature = "const_str_split_at", issue = "131518")]
`
``
685
`+
pub const fn split_at_mut(&mut self, mid: usize) -> (&mut str, &mut str) {
`
684
686
`// is_char_boundary checks that the index is in [0, .len()]
`
685
687
`if self.is_char_boundary(mid) {
`
686
688
`` // SAFETY: just checked that mid
is on a char boundary.
``
`@@ -719,11 +721,12 @@ impl str {
`
719
721
`#[inline]
`
720
722
`#[must_use]
`
721
723
`#[stable(feature = "split_at_checked", since = "1.80.0")]
`
722
``
`-
pub fn split_at_checked(&self, mid: usize) -> Option<(&str, &str)> {
`
``
724
`+
#[rustc_const_unstable(feature = "const_str_split_at", issue = "131518")]
`
``
725
`+
pub const fn split_at_checked(&self, mid: usize) -> Option<(&str, &str)> {
`
723
726
`// is_char_boundary checks that the index is in [0, .len()]
`
724
727
`if self.is_char_boundary(mid) {
`
725
728
`` // SAFETY: just checked that mid
is on a char boundary.
``
726
``
`-
Some(unsafe { (self.get_unchecked(0..mid), self.get_unchecked(mid..self.len())) })
`
``
729
`+
Some(unsafe { self.split_at_unchecked(mid) })
`
727
730
`} else {
`
728
731
`None
`
729
732
`}
`
`@@ -759,7 +762,9 @@ impl str {
`
759
762
`#[inline]
`
760
763
`#[must_use]
`
761
764
`#[stable(feature = "split_at_checked", since = "1.80.0")]
`
762
``
`-
pub fn split_at_mut_checked(&mut self, mid: usize) -> Option<(&mut str, &mut str)> {
`
``
765
`+
#[rustc_const_unstable(feature = "const_str_split_at", issue = "131518")]
`
``
766
`+
#[rustc_allow_const_fn_unstable(const_is_char_boundary)]
`
``
767
`+
pub const fn split_at_mut_checked(&mut self, mid: usize) -> Option<(&mut str, &mut str)> {
`
763
768
`// is_char_boundary checks that the index is in [0, .len()]
`
764
769
`if self.is_char_boundary(mid) {
`
765
770
`` // SAFETY: just checked that mid
is on a char boundary.
``
`@@ -775,7 +780,25 @@ impl str {
`
775
780
`///
`
776
781
`` /// The caller must ensure that mid
is a valid byte offset from the start
``
777
782
`/// of the string and falls on the boundary of a UTF-8 code point.
`
778
``
`-
unsafe fn split_at_mut_unchecked(&mut self, mid: usize) -> (&mut str, &mut str) {
`
``
783
`+
const unsafe fn split_at_unchecked(&self, mid: usize) -> (&str, &str) {
`
``
784
`+
let len = self.len();
`
``
785
`+
let ptr = self.as_ptr();
`
``
786
`` +
// SAFETY: caller guarantees mid
is on a char boundary.
``
``
787
`+
unsafe {
`
``
788
`+
(
`
``
789
`+
from_utf8_unchecked(slice::from_raw_parts(ptr, mid)),
`
``
790
`+
from_utf8_unchecked(slice::from_raw_parts(ptr.add(mid), len - mid)),
`
``
791
`+
)
`
``
792
`+
}
`
``
793
`+
}
`
``
794
+
``
795
`+
/// Divides one string slice into two at an index.
`
``
796
`+
///
`
``
797
`+
/// # Safety
`
``
798
`+
///
`
``
799
`` +
/// The caller must ensure that mid
is a valid byte offset from the start
``
``
800
`+
/// of the string and falls on the boundary of a UTF-8 code point.
`
``
801
`+
const unsafe fn split_at_mut_unchecked(&mut self, mid: usize) -> (&mut str, &mut str) {
`
779
802
`let len = self.len();
`
780
803
`let ptr = self.as_mut_ptr();
`
781
804
`` // SAFETY: caller guarantees mid
is on a char boundary.
``