@@ -21,8 +21,8 @@ use char;
2121use convert:: TryFrom ;
2222use fmt;
2323use iter:: { Map , Cloned , FusedIterator } ;
24- use mem;
2524use slice:: { self , SliceIndex } ;
25+ use mem;
2626
2727pub mod pattern;
2828
@@ -300,6 +300,13 @@ pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> {
300300 Ok ( unsafe { from_utf8_unchecked ( v) } )
301301}
302302
303+ /// Converts a mutable slice of bytes to a mutable string slice.
304+ #[ unstable( feature = "str_mut_extras" , issue = "41119" ) ]
305+ pub fn from_utf8_mut ( v : & mut [ u8 ] ) -> Result < & mut str , Utf8Error > {
306+ run_utf8_validation ( v) ?;
307+ Ok ( unsafe { from_utf8_unchecked_mut ( v) } )
308+ }
309+
303310/// Forms a str from a pointer and a length.
304311///
305312/// The `len` argument is the number of bytes in the string.
@@ -325,7 +332,7 @@ pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> {
325332/// str is returned.
326333///
327334unsafe fn from_raw_parts_mut < ' a > ( p : * mut u8 , len : usize ) -> & ' a mut str {
328- mem :: transmute :: < & mut [ u8 ] , & mut str > ( slice:: from_raw_parts_mut ( p, len) )
335+ from_utf8_unchecked_mut ( slice:: from_raw_parts_mut ( p, len) )
329336}
330337
331338/// Converts a slice of bytes to a string slice without checking
@@ -365,6 +372,18 @@ pub unsafe fn from_utf8_unchecked(v: &[u8]) -> &str {
365372 mem:: transmute ( v)
366373}
367374
375+ /// Converts a slice of bytes to a string slice without checking
376+ /// that the string contains valid UTF-8; mutable version.
377+ ///
378+ /// See the immutable version, [`from_utf8_unchecked()`][fromutf8], for more information.
379+ ///
380+ /// [fromutf8]: fn.from_utf8_unchecked.html
381+ #[ inline( always) ]
382+ #[ unstable( feature = "str_mut_extras" , issue = "41119" ) ]
383+ pub unsafe fn from_utf8_unchecked_mut ( v : & mut [ u8 ] ) -> & mut str {
384+ mem:: transmute ( v)
385+ }
386+
368387#[ stable( feature = "rust1" , since = "1.0.0" ) ]
369388impl fmt:: Display for Utf8Error {
370389 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
@@ -1474,7 +1493,6 @@ Section: Trait implementations
14741493mod traits {
14751494 use cmp:: Ordering ;
14761495 use ops;
1477- use mem;
14781496 use slice:: { self , SliceIndex } ;
14791497 use str:: eq_slice;
14801498
@@ -1811,7 +1829,7 @@ mod traits {
18111829 unsafe fn get_unchecked_mut ( self , slice : & mut str ) -> & mut Self :: Output {
18121830 let ptr = slice. as_ptr ( ) . offset ( self . start as isize ) ;
18131831 let len = self . end - self . start ;
1814- mem :: transmute ( slice:: from_raw_parts_mut ( ptr as * mut u8 , len) )
1832+ super :: from_utf8_unchecked_mut ( slice:: from_raw_parts_mut ( ptr as * mut u8 , len) )
18151833 }
18161834 #[ inline]
18171835 fn index ( self , slice : & str ) -> & Self :: Output {
@@ -1859,7 +1877,7 @@ mod traits {
18591877 #[ inline]
18601878 unsafe fn get_unchecked_mut ( self , slice : & mut str ) -> & mut Self :: Output {
18611879 let ptr = slice. as_ptr ( ) ;
1862- mem :: transmute ( slice:: from_raw_parts_mut ( ptr as * mut u8 , self . end ) )
1880+ super :: from_utf8_unchecked_mut ( slice:: from_raw_parts_mut ( ptr as * mut u8 , self . end ) )
18631881 }
18641882 #[ inline]
18651883 fn index ( self , slice : & str ) -> & Self :: Output {
@@ -1905,7 +1923,7 @@ mod traits {
19051923 unsafe fn get_unchecked_mut ( self , slice : & mut str ) -> & mut Self :: Output {
19061924 let ptr = slice. as_ptr ( ) . offset ( self . start as isize ) ;
19071925 let len = slice. len ( ) - self . start ;
1908- mem :: transmute ( slice:: from_raw_parts_mut ( ptr as * mut u8 , len) )
1926+ super :: from_utf8_unchecked_mut ( slice:: from_raw_parts_mut ( ptr as * mut u8 , len) )
19091927 }
19101928 #[ inline]
19111929 fn index ( self , slice : & str ) -> & Self :: Output {
@@ -1998,7 +2016,7 @@ mod traits {
19982016 #[ inline]
19992017 unsafe fn get_unchecked_mut ( self , slice : & mut str ) -> & mut Self :: Output {
20002018 let ptr = slice. as_ptr ( ) ;
2001- mem :: transmute ( slice:: from_raw_parts_mut ( ptr as * mut u8 , self . end + 1 ) )
2019+ super :: from_utf8_unchecked_mut ( slice:: from_raw_parts_mut ( ptr as * mut u8 , self . end + 1 ) )
20022020 }
20032021 #[ inline]
20042022 fn index ( self , slice : & str ) -> & Self :: Output {
@@ -2096,6 +2114,8 @@ pub trait StrExt {
20962114 fn is_char_boundary ( & self , index : usize ) -> bool ;
20972115 #[ stable( feature = "core" , since = "1.6.0" ) ]
20982116 fn as_bytes ( & self ) -> & [ u8 ] ;
2117+ #[ unstable( feature = "str_mut_extras" , issue = "0" ) ]
2118+ unsafe fn as_bytes_mut ( & mut self ) -> & mut [ u8 ] ;
20992119 #[ stable( feature = "core" , since = "1.6.0" ) ]
21002120 fn find < ' a , P : Pattern < ' a > > ( & ' a self , pat : P ) -> Option < usize > ;
21012121 #[ stable( feature = "core" , since = "1.6.0" ) ]
@@ -2373,6 +2393,11 @@ impl StrExt for str {
23732393 unsafe { mem:: transmute ( self ) }
23742394 }
23752395
2396+ #[ inline]
2397+ unsafe fn as_bytes_mut ( & mut self ) -> & mut [ u8 ] {
2398+ mem:: transmute ( self )
2399+ }
2400+
23762401 fn find < ' a , P : Pattern < ' a > > ( & ' a self , pat : P ) -> Option < usize > {
23772402 pat. into_searcher ( self ) . next_match ( ) . map ( |( i, _) | i)
23782403 }
0 commit comments