@@ -1391,19 +1391,19 @@ impl String {
1391
1391
}
1392
1392
1393
1393
/// Creates a splicing iterator that removes the specified range in the string,
1394
- /// replaces with the given string, and yields the removed chars .
1395
- /// The given string doesn’ t need to be the same length as the range.
1394
+ /// and replaces it with the given string.
1395
+ /// The given string doesn' t need to be the same length as the range.
1396
1396
///
1397
- /// Note: The element range is removed when the [`Splice`] is dropped,
1398
- /// even if the iterator is not consumed until the end .
1397
+ /// Note: Unlike [`Vec::splice`], the replacement happens eagerly, and this
1398
+ /// method does not return the removed chars .
1399
1399
///
1400
1400
/// # Panics
1401
1401
///
1402
1402
/// Panics if the starting point or end point do not lie on a [`char`]
1403
1403
/// boundary, or if they're out of bounds.
1404
1404
///
1405
1405
/// [`char`]: ../../std/primitive.char.html
1406
- /// [`Splice `]: ../../std/string /struct.Splice .html
1406
+ /// [`Vec::splice `]: ../../std/vec /struct.Vec .html#method.splice
1407
1407
///
1408
1408
/// # Examples
1409
1409
///
@@ -1415,45 +1415,32 @@ impl String {
1415
1415
/// let beta_offset = s.find('β').unwrap_or(s.len());
1416
1416
///
1417
1417
/// // Replace the range up until the β from the string
1418
- /// let t: String = s.splice(..beta_offset, "Α is capital alpha; ").collect();
1419
- /// assert_eq!(t, "α is alpha, ");
1418
+ /// s.splice(..beta_offset, "Α is capital alpha; ");
1420
1419
/// assert_eq!(s, "Α is capital alpha; β is beta");
1421
1420
/// ```
1422
1421
#[ unstable( feature = "splice" , reason = "recently added" , issue = "32310" ) ]
1423
- pub fn splice < ' a , ' b , R > ( & ' a mut self , range : R , replace_with : & ' b str ) -> Splice < ' a , ' b >
1422
+ pub fn splice < R > ( & mut self , range : R , replace_with : & str )
1424
1423
where R : RangeArgument < usize >
1425
1424
{
1426
1425
// Memory safety
1427
1426
//
1428
1427
// The String version of Splice does not have the memory safety issues
1429
1428
// of the vector version. The data is just plain bytes.
1430
- // Because the range removal happens in Drop, if the Splice iterator is leaked,
1431
- // the removal will not happen.
1432
- let len = self . len ( ) ;
1433
- let start = match range. start ( ) {
1434
- Included ( & n) => n,
1435
- Excluded ( & n) => n + 1 ,
1436
- Unbounded => 0 ,
1429
+
1430
+ match range. start ( ) {
1431
+ Included ( & n) => assert ! ( self . is_char_boundary( n) ) ,
1432
+ Excluded ( & n) => assert ! ( self . is_char_boundary( n + 1 ) ) ,
1433
+ Unbounded => { } ,
1437
1434
} ;
1438
- let end = match range. end ( ) {
1439
- Included ( & n) => n + 1 ,
1440
- Excluded ( & n) => n ,
1441
- Unbounded => len ,
1435
+ match range. end ( ) {
1436
+ Included ( & n) => assert ! ( self . is_char_boundary ( n + 1 ) ) ,
1437
+ Excluded ( & n) => assert ! ( self . is_char_boundary ( n ) ) ,
1438
+ Unbounded => { } ,
1442
1439
} ;
1443
1440
1444
- // Take out two simultaneous borrows. The &mut String won't be accessed
1445
- // until iteration is over, in Drop.
1446
- let self_ptr = self as * mut _ ;
1447
- // slicing does the appropriate bounds checks
1448
- let chars_iter = self [ start..end] . chars ( ) ;
1449
-
1450
- Splice {
1451
- start,
1452
- end,
1453
- iter : chars_iter,
1454
- string : self_ptr,
1455
- replace_with,
1456
- }
1441
+ unsafe {
1442
+ self . as_mut_vec ( )
1443
+ } . splice ( range, replace_with. bytes ( ) ) ;
1457
1444
}
1458
1445
1459
1446
/// Converts this `String` into a [`Box`]`<`[`str`]`>`.
@@ -2240,61 +2227,3 @@ impl<'a> DoubleEndedIterator for Drain<'a> {
2240
2227
2241
2228
#[ unstable( feature = "fused" , issue = "35602" ) ]
2242
2229
impl < ' a > FusedIterator for Drain < ' a > { }
2243
-
2244
- /// A splicing iterator for `String`.
2245
- ///
2246
- /// This struct is created by the [`splice()`] method on [`String`]. See its
2247
- /// documentation for more.
2248
- ///
2249
- /// [`splice()`]: struct.String.html#method.splice
2250
- /// [`String`]: struct.String.html
2251
- #[ derive( Debug ) ]
2252
- #[ unstable( feature = "splice" , reason = "recently added" , issue = "32310" ) ]
2253
- pub struct Splice < ' a , ' b > {
2254
- /// Will be used as &'a mut String in the destructor
2255
- string : * mut String ,
2256
- /// Start of part to remove
2257
- start : usize ,
2258
- /// End of part to remove
2259
- end : usize ,
2260
- /// Current remaining range to remove
2261
- iter : Chars < ' a > ,
2262
- replace_with : & ' b str ,
2263
- }
2264
-
2265
- #[ unstable( feature = "splice" , reason = "recently added" , issue = "32310" ) ]
2266
- unsafe impl < ' a , ' b > Sync for Splice < ' a , ' b > { }
2267
- #[ unstable( feature = "splice" , reason = "recently added" , issue = "32310" ) ]
2268
- unsafe impl < ' a , ' b > Send for Splice < ' a , ' b > { }
2269
-
2270
- #[ unstable( feature = "splice" , reason = "recently added" , issue = "32310" ) ]
2271
- impl < ' a , ' b > Drop for Splice < ' a , ' b > {
2272
- fn drop ( & mut self ) {
2273
- unsafe {
2274
- let vec = ( * self . string ) . as_mut_vec ( ) ;
2275
- vec. splice ( self . start ..self . end , self . replace_with . bytes ( ) ) ;
2276
- }
2277
- }
2278
- }
2279
-
2280
- #[ unstable( feature = "splice" , reason = "recently added" , issue = "32310" ) ]
2281
- impl < ' a , ' b > Iterator for Splice < ' a , ' b > {
2282
- type Item = char ;
2283
-
2284
- #[ inline]
2285
- fn next ( & mut self ) -> Option < char > {
2286
- self . iter . next ( )
2287
- }
2288
-
2289
- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
2290
- self . iter . size_hint ( )
2291
- }
2292
- }
2293
-
2294
- #[ unstable( feature = "splice" , reason = "recently added" , issue = "32310" ) ]
2295
- impl < ' a , ' b > DoubleEndedIterator for Splice < ' a , ' b > {
2296
- #[ inline]
2297
- fn next_back ( & mut self ) -> Option < char > {
2298
- self . iter . next_back ( )
2299
- }
2300
- }
0 commit comments