@@ -21,8 +21,8 @@ use char;
21
21
use convert:: TryFrom ;
22
22
use fmt;
23
23
use iter:: { Map , Cloned , FusedIterator } ;
24
- use mem;
25
24
use slice:: { self , SliceIndex } ;
25
+ use mem;
26
26
27
27
pub mod pattern;
28
28
@@ -300,6 +300,13 @@ pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> {
300
300
Ok ( unsafe { from_utf8_unchecked ( v) } )
301
301
}
302
302
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
+
303
310
/// Forms a str from a pointer and a length.
304
311
///
305
312
/// The `len` argument is the number of bytes in the string.
@@ -325,7 +332,7 @@ pub fn from_utf8(v: &[u8]) -> Result<&str, Utf8Error> {
325
332
/// str is returned.
326
333
///
327
334
unsafe 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) )
329
336
}
330
337
331
338
/// Converts a slice of bytes to a string slice without checking
@@ -365,6 +372,18 @@ pub unsafe fn from_utf8_unchecked(v: &[u8]) -> &str {
365
372
mem:: transmute ( v)
366
373
}
367
374
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
+
368
387
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
369
388
impl fmt:: Display for Utf8Error {
370
389
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
@@ -1474,7 +1493,6 @@ Section: Trait implementations
1474
1493
mod traits {
1475
1494
use cmp:: Ordering ;
1476
1495
use ops;
1477
- use mem;
1478
1496
use slice:: { self , SliceIndex } ;
1479
1497
use str:: eq_slice;
1480
1498
@@ -1811,7 +1829,7 @@ mod traits {
1811
1829
unsafe fn get_unchecked_mut ( self , slice : & mut str ) -> & mut Self :: Output {
1812
1830
let ptr = slice. as_ptr ( ) . offset ( self . start as isize ) ;
1813
1831
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) )
1815
1833
}
1816
1834
#[ inline]
1817
1835
fn index ( self , slice : & str ) -> & Self :: Output {
@@ -1859,7 +1877,7 @@ mod traits {
1859
1877
#[ inline]
1860
1878
unsafe fn get_unchecked_mut ( self , slice : & mut str ) -> & mut Self :: Output {
1861
1879
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 ) )
1863
1881
}
1864
1882
#[ inline]
1865
1883
fn index ( self , slice : & str ) -> & Self :: Output {
@@ -1905,7 +1923,7 @@ mod traits {
1905
1923
unsafe fn get_unchecked_mut ( self , slice : & mut str ) -> & mut Self :: Output {
1906
1924
let ptr = slice. as_ptr ( ) . offset ( self . start as isize ) ;
1907
1925
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) )
1909
1927
}
1910
1928
#[ inline]
1911
1929
fn index ( self , slice : & str ) -> & Self :: Output {
@@ -1998,7 +2016,7 @@ mod traits {
1998
2016
#[ inline]
1999
2017
unsafe fn get_unchecked_mut ( self , slice : & mut str ) -> & mut Self :: Output {
2000
2018
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 ) )
2002
2020
}
2003
2021
#[ inline]
2004
2022
fn index ( self , slice : & str ) -> & Self :: Output {
@@ -2096,6 +2114,8 @@ pub trait StrExt {
2096
2114
fn is_char_boundary ( & self , index : usize ) -> bool ;
2097
2115
#[ stable( feature = "core" , since = "1.6.0" ) ]
2098
2116
fn as_bytes ( & self ) -> & [ u8 ] ;
2117
+ #[ unstable( feature = "str_mut_extras" , issue = "0" ) ]
2118
+ unsafe fn as_bytes_mut ( & mut self ) -> & mut [ u8 ] ;
2099
2119
#[ stable( feature = "core" , since = "1.6.0" ) ]
2100
2120
fn find < ' a , P : Pattern < ' a > > ( & ' a self , pat : P ) -> Option < usize > ;
2101
2121
#[ stable( feature = "core" , since = "1.6.0" ) ]
@@ -2373,6 +2393,11 @@ impl StrExt for str {
2373
2393
unsafe { mem:: transmute ( self ) }
2374
2394
}
2375
2395
2396
+ #[ inline]
2397
+ unsafe fn as_bytes_mut ( & mut self ) -> & mut [ u8 ] {
2398
+ mem:: transmute ( self )
2399
+ }
2400
+
2376
2401
fn find < ' a , P : Pattern < ' a > > ( & ' a self , pat : P ) -> Option < usize > {
2377
2402
pat. into_searcher ( self ) . next_match ( ) . map ( |( i, _) | i)
2378
2403
}
0 commit comments