diff options
| author | Waffle <waffle.lapkin@gmail.com> | 2021-05-29 10:36:30 +0300 |
|---|---|---|
| committer | Waffle <waffle.lapkin@gmail.com> | 2021-05-29 10:36:30 +0300 |
| commit | 23f9b92c5e3fd6dcff19fb185b64990f0336a8bf (patch) | |
| tree | c5e38deb6914dafc45d1808a4c15fe9b49a7b960 | |
| parent | 4664725ae03ef9becae413a1e56b5010f88fdc46 (diff) | |
| download | rust-23f9b92c5e3fd6dcff19fb185b64990f0336a8bf.tar.gz rust-23f9b92c5e3fd6dcff19fb185b64990f0336a8bf.zip | |
Add `String::extend_from_within`
This patch adds `String::extend_from_within` function under the `string_extend_from_within` feature gate similar to the `Vec::extend_from_within` function.
| -rw-r--r-- | library/alloc/src/lib.rs | 1 | ||||
| -rw-r--r-- | library/alloc/src/string.rs | 36 |
2 files changed, 37 insertions, 0 deletions
diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index 97765c36d93..7bc9aa69be9 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -144,6 +144,7 @@ #![feature(associated_type_bounds)] #![feature(slice_group_by)] #![feature(decl_macro)] +#![feature(bindings_after_at)] // Allow testing this library #[cfg(test)] diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index ec09595e357..dbe5bc1da46 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -843,6 +843,42 @@ impl String { self.vec.extend_from_slice(string.as_bytes()) } + /// Copies elements from `src` range to the end of the string. + /// + /// ## Panics + /// + /// Panics if the starting point or end point do not lie on a [`char`] + /// boundary, or if they're out of bounds. + /// + /// ## Examples + /// + /// ``` + /// #![feature(string_extend_from_within)] + /// let mut string = String::from("abcde"); + /// + /// string.extend_from_within(2..); + /// assert_eq!(string, "abcdecde"); + /// + /// string.extend_from_within(..2); + /// assert_eq!(string, "abcdecdeab"); + /// + /// string.extend_from_within(4..8); + /// assert_eq!(string, "abcdecdeabecde"); + /// ``` + #[cfg(not(no_global_oom_handling))] + #[unstable(feature = "string_extend_from_within", issue = "none")] + pub fn extend_from_within<R>(&mut self, src: R) + where + R: RangeBounds<usize>, + { + let src @ Range { start, end } = slice::range(src, ..self.len()); + + assert!(self.is_char_boundary(start)); + assert!(self.is_char_boundary(end)); + + self.vec.extend_from_within(src); + } + /// Returns this `String`'s capacity, in bytes. /// /// # Examples |
