alloc/
string.rs

1//! A UTF-8–encoded, growable string.
2//!
3//! This module contains the [`String`] type, the [`ToString`] trait for
4//! converting to strings, and several error types that may result from
5//! working with [`String`]s.
6//!
7//! # Examples
8//!
9//! There are multiple ways to create a new [`String`] from a string literal:
10//!
11//! ```
12//! let s = "Hello".to_string();
13//!
14//! let s = String::from("world");
15//! let s: String = "also this".into();
16//! ```
17//!
18//! You can create a new [`String`] from an existing one by concatenating with
19//! `+`:
20//!
21//! ```
22//! let s = "Hello".to_string();
23//!
24//! let message = s + " world!";
25//! ```
26//!
27//! If you have a vector of valid UTF-8 bytes, you can make a [`String`] out of
28//! it. You can do the reverse too.
29//!
30//! ```
31//! let sparkle_heart = vec![240, 159, 146, 150];
32//!
33//! // We know these bytes are valid, so we'll use `unwrap()`.
34//! let sparkle_heart = String::from_utf8(sparkle_heart).unwrap();
35//!
36//! assert_eq!("πŸ’–", sparkle_heart);
37//!
38//! let bytes = sparkle_heart.into_bytes();
39//!
40//! assert_eq!(bytes, [240, 159, 146, 150]);
41//! ```
42
43#![stable(feature = "rust1", since = "1.0.0")]
44
45use core::error::Error;
46use core::iter::FusedIterator;
47#[cfg(not(no_global_oom_handling))]
48use core::iter::from_fn;
49#[cfg(not(no_global_oom_handling))]
50use core::ops::Add;
51#[cfg(not(no_global_oom_handling))]
52use core::ops::AddAssign;
53#[cfg(not(no_global_oom_handling))]
54use core::ops::Bound::{Excluded, Included, Unbounded};
55use core::ops::{self, Range, RangeBounds};
56use core::str::pattern::{Pattern, Utf8Pattern};
57use core::{fmt, hash, ptr, slice};
58
59#[cfg(not(no_global_oom_handling))]
60use crate::alloc::Allocator;
61#[cfg(not(no_global_oom_handling))]
62use crate::borrow::{Cow, ToOwned};
63use crate::boxed::Box;
64use crate::collections::TryReserveError;
65use crate::str::{self, CharIndices, Chars, Utf8Error, from_utf8_unchecked_mut};
66#[cfg(not(no_global_oom_handling))]
67use crate::str::{FromStr, from_boxed_utf8_unchecked};
68use crate::vec::{self, Vec};
69
70/// A UTF-8–encoded, growable string.
71///
72/// `String` is the most common string type. It has ownership over the contents
73/// of the string, stored in a heap-allocated buffer (see [Representation](#representation)).
74/// It is closely related to its borrowed counterpart, the primitive [`str`].
75///
76/// # Examples
77///
78/// You can create a `String` from [a literal string][`&str`] with [`String::from`]:
79///
80/// [`String::from`]: From::from
81///
82/// ```
83/// let hello = String::from("Hello, world!");
84/// ```
85///
86/// You can append a [`char`] to a `String` with the [`push`] method, and
87/// append a [`&str`] with the [`push_str`] method:
88///
89/// ```
90/// let mut hello = String::from("Hello, ");
91///
92/// hello.push('w');
93/// hello.push_str("orld!");
94/// ```
95///
96/// [`push`]: String::push
97/// [`push_str`]: String::push_str
98///
99/// If you have a vector of UTF-8 bytes, you can create a `String` from it with
100/// the [`from_utf8`] method:
101///
102/// ```
103/// // some bytes, in a vector
104/// let sparkle_heart = vec![240, 159, 146, 150];
105///
106/// // We know these bytes are valid, so we'll use `unwrap()`.
107/// let sparkle_heart = String::from_utf8(sparkle_heart).unwrap();
108///
109/// assert_eq!("πŸ’–", sparkle_heart);
110/// ```
111///
112/// [`from_utf8`]: String::from_utf8
113///
114/// # UTF-8
115///
116/// `String`s are always valid UTF-8. If you need a non-UTF-8 string, consider
117/// [`OsString`]. It is similar, but without the UTF-8 constraint. Because UTF-8
118/// is a variable width encoding, `String`s are typically smaller than an array of
119/// the same `char`s:
120///
121/// ```
122/// // `s` is ASCII which represents each `char` as one byte
123/// let s = "hello";
124/// assert_eq!(s.len(), 5);
125///
126/// // A `char` array with the same contents would be longer because
127/// // every `char` is four bytes
128/// let s = ['h', 'e', 'l', 'l', 'o'];
129/// let size: usize = s.into_iter().map(|c| size_of_val(&c)).sum();
130/// assert_eq!(size, 20);
131///
132/// // However, for non-ASCII strings, the difference will be smaller
133/// // and sometimes they are the same
134/// let s = "πŸ’–πŸ’–πŸ’–πŸ’–πŸ’–";
135/// assert_eq!(s.len(), 20);
136///
137/// let s = ['πŸ’–', 'πŸ’–', 'πŸ’–', 'πŸ’–', 'πŸ’–'];
138/// let size: usize = s.into_iter().map(|c| size_of_val(&c)).sum();
139/// assert_eq!(size, 20);
140/// ```
141///
142/// This raises interesting questions as to how `s[i]` should work.
143/// What should `i` be here? Several options include byte indices and
144/// `char` indices but, because of UTF-8 encoding, only byte indices
145/// would provide constant time indexing. Getting the `i`th `char`, for
146/// example, is available using [`chars`]:
147///
148/// ```
149/// let s = "hello";
150/// let third_character = s.chars().nth(2);
151/// assert_eq!(third_character, Some('l'));
152///
153/// let s = "πŸ’–πŸ’–πŸ’–πŸ’–πŸ’–";
154/// let third_character = s.chars().nth(2);
155/// assert_eq!(third_character, Some('πŸ’–'));
156/// ```
157///
158/// Next, what should `s[i]` return? Because indexing returns a reference
159/// to underlying data it could be `&u8`, `&[u8]`, or something else similar.
160/// Since we're only providing one index, `&u8` makes the most sense but that
161/// might not be what the user expects and can be explicitly achieved with
162/// [`as_bytes()`]:
163///
164/// ```
165/// // The first byte is 104 - the byte value of `'h'`
166/// let s = "hello";
167/// assert_eq!(s.as_bytes()[0], 104);
168/// // or
169/// assert_eq!(s.as_bytes()[0], b'h');
170///
171/// // The first byte is 240 which isn't obviously useful
172/// let s = "πŸ’–πŸ’–πŸ’–πŸ’–πŸ’–";
173/// assert_eq!(s.as_bytes()[0], 240);
174/// ```
175///
176/// Due to these ambiguities/restrictions, indexing with a `usize` is simply
177/// forbidden:
178///
179/// ```compile_fail,E0277
180/// let s = "hello";
181///
182/// // The following will not compile!
183/// println!("The first letter of s is {}", s[0]);
184/// ```
185///
186/// It is more clear, however, how `&s[i..j]` should work (that is,
187/// indexing with a range). It should accept byte indices (to be constant-time)
188/// and return a `&str` which is UTF-8 encoded. This is also called "string slicing".
189/// Note this will panic if the byte indices provided are not character
190/// boundaries - see [`is_char_boundary`] for more details. See the implementations
191/// for [`SliceIndex<str>`] for more details on string slicing. For a non-panicking
192/// version of string slicing, see [`get`].
193///
194/// [`OsString`]: ../../std/ffi/struct.OsString.html "ffi::OsString"
195/// [`SliceIndex<str>`]: core::slice::SliceIndex
196/// [`as_bytes()`]: str::as_bytes
197/// [`get`]: str::get
198/// [`is_char_boundary`]: str::is_char_boundary
199///
200/// The [`bytes`] and [`chars`] methods return iterators over the bytes and
201/// codepoints of the string, respectively. To iterate over codepoints along
202/// with byte indices, use [`char_indices`].
203///
204/// [`bytes`]: str::bytes
205/// [`chars`]: str::chars
206/// [`char_indices`]: str::char_indices
207///
208/// # Deref
209///
210/// `String` implements <code>[Deref]<Target = [str]></code>, and so inherits all of [`str`]'s
211/// methods. In addition, this means that you can pass a `String` to a
212/// function which takes a [`&str`] by using an ampersand (`&`):
213///
214/// ```
215/// fn takes_str(s: &str) { }
216///
217/// let s = String::from("Hello");
218///
219/// takes_str(&s);
220/// ```
221///
222/// This will create a [`&str`] from the `String` and pass it in. This
223/// conversion is very inexpensive, and so generally, functions will accept
224/// [`&str`]s as arguments unless they need a `String` for some specific
225/// reason.
226///
227/// In certain cases Rust doesn't have enough information to make this
228/// conversion, known as [`Deref`] coercion. In the following example a string
229/// slice [`&'a str`][`&str`] implements the trait `TraitExample`, and the function
230/// `example_func` takes anything that implements the trait. In this case Rust
231/// would need to make two implicit conversions, which Rust doesn't have the
232/// means to do. For that reason, the following example will not compile.
233///
234/// ```compile_fail,E0277
235/// trait TraitExample {}
236///
237/// impl<'a> TraitExample for &'a str {}
238///
239/// fn example_func<A: TraitExample>(example_arg: A) {}
240///
241/// let example_string = String::from("example_string");
242/// example_func(&example_string);
243/// ```
244///
245/// There are two options that would work instead. The first would be to
246/// change the line `example_func(&example_string);` to
247/// `example_func(example_string.as_str());`, using the method [`as_str()`]
248/// to explicitly extract the string slice containing the string. The second
249/// way changes `example_func(&example_string);` to
250/// `example_func(&*example_string);`. In this case we are dereferencing a
251/// `String` to a [`str`], then referencing the [`str`] back to
252/// [`&str`]. The second way is more idiomatic, however both work to do the
253/// conversion explicitly rather than relying on the implicit conversion.
254///
255/// # Representation
256///
257/// A `String` is made up of three components: a pointer to some bytes, a
258/// length, and a capacity. The pointer points to the internal buffer which `String`
259/// uses to store its data. The length is the number of bytes currently stored
260/// in the buffer, and the capacity is the size of the buffer in bytes. As such,
261/// the length will always be less than or equal to the capacity.
262///
263/// This buffer is always stored on the heap.
264///
265/// You can look at these with the [`as_ptr`], [`len`], and [`capacity`]
266/// methods:
267///
268/// ```
269/// use std::mem;
270///
271/// let story = String::from("Once upon a time...");
272///
273// FIXME Update this when vec_into_raw_parts is stabilized
274/// // Prevent automatically dropping the String's data
275/// let mut story = mem::ManuallyDrop::new(story);
276///
277/// let ptr = story.as_mut_ptr();
278/// let len = story.len();
279/// let capacity = story.capacity();
280///
281/// // story has nineteen bytes
282/// assert_eq!(19, len);
283///
284/// // We can re-build a String out of ptr, len, and capacity. This is all
285/// // unsafe because we are responsible for making sure the components are
286/// // valid:
287/// let s = unsafe { String::from_raw_parts(ptr, len, capacity) } ;
288///
289/// assert_eq!(String::from("Once upon a time..."), s);
290/// ```
291///
292/// [`as_ptr`]: str::as_ptr
293/// [`len`]: String::len
294/// [`capacity`]: String::capacity
295///
296/// If a `String` has enough capacity, adding elements to it will not
297/// re-allocate. For example, consider this program:
298///
299/// ```
300/// let mut s = String::new();
301///
302/// println!("{}", s.capacity());
303///
304/// for _ in 0..5 {
305///     s.push_str("hello");
306///     println!("{}", s.capacity());
307/// }
308/// ```
309///
310/// This will output the following:
311///
312/// ```text
313/// 0
314/// 8
315/// 16
316/// 16
317/// 32
318/// 32
319/// ```
320///
321/// At first, we have no memory allocated at all, but as we append to the
322/// string, it increases its capacity appropriately. If we instead use the
323/// [`with_capacity`] method to allocate the correct capacity initially:
324///
325/// ```
326/// let mut s = String::with_capacity(25);
327///
328/// println!("{}", s.capacity());
329///
330/// for _ in 0..5 {
331///     s.push_str("hello");
332///     println!("{}", s.capacity());
333/// }
334/// ```
335///
336/// [`with_capacity`]: String::with_capacity
337///
338/// We end up with a different output:
339///
340/// ```text
341/// 25
342/// 25
343/// 25
344/// 25
345/// 25
346/// 25
347/// ```
348///
349/// Here, there's no need to allocate more memory inside the loop.
350///
351/// [str]: prim@str "str"
352/// [`str`]: prim@str "str"
353/// [`&str`]: prim@str "&str"
354/// [Deref]: core::ops::Deref "ops::Deref"
355/// [`Deref`]: core::ops::Deref "ops::Deref"
356/// [`as_str()`]: String::as_str
357#[derive(PartialEq, PartialOrd, Eq, Ord)]
358#[stable(feature = "rust1", since = "1.0.0")]
359#[lang = "String"]
360pub struct String {
361    vec: Vec<u8>,
362}
363
364/// A possible error value when converting a `String` from a UTF-8 byte vector.
365///
366/// This type is the error type for the [`from_utf8`] method on [`String`]. It
367/// is designed in such a way to carefully avoid reallocations: the
368/// [`into_bytes`] method will give back the byte vector that was used in the
369/// conversion attempt.
370///
371/// [`from_utf8`]: String::from_utf8
372/// [`into_bytes`]: FromUtf8Error::into_bytes
373///
374/// The [`Utf8Error`] type provided by [`std::str`] represents an error that may
375/// occur when converting a slice of [`u8`]s to a [`&str`]. In this sense, it's
376/// an analogue to `FromUtf8Error`, and you can get one from a `FromUtf8Error`
377/// through the [`utf8_error`] method.
378///
379/// [`Utf8Error`]: str::Utf8Error "std::str::Utf8Error"
380/// [`std::str`]: core::str "std::str"
381/// [`&str`]: prim@str "&str"
382/// [`utf8_error`]: FromUtf8Error::utf8_error
383///
384/// # Examples
385///
386/// ```
387/// // some invalid bytes, in a vector
388/// let bytes = vec![0, 159];
389///
390/// let value = String::from_utf8(bytes);
391///
392/// assert!(value.is_err());
393/// assert_eq!(vec![0, 159], value.unwrap_err().into_bytes());
394/// ```
395#[stable(feature = "rust1", since = "1.0.0")]
396#[cfg_attr(not(no_global_oom_handling), derive(Clone))]
397#[derive(Debug, PartialEq, Eq)]
398pub struct FromUtf8Error {
399    bytes: Vec<u8>,
400    error: Utf8Error,
401}
402
403/// A possible error value when converting a `String` from a UTF-16 byte slice.
404///
405/// This type is the error type for the [`from_utf16`] method on [`String`].
406///
407/// [`from_utf16`]: String::from_utf16
408///
409/// # Examples
410///
411/// ```
412/// // π„žmu<invalid>ic
413/// let v = &[0xD834, 0xDD1E, 0x006d, 0x0075,
414///           0xD800, 0x0069, 0x0063];
415///
416/// assert!(String::from_utf16(v).is_err());
417/// ```
418#[stable(feature = "rust1", since = "1.0.0")]
419#[derive(Debug)]
420pub struct FromUtf16Error(());
421
422impl String {
423    /// Creates a new empty `String`.
424    ///
425    /// Given that the `String` is empty, this will not allocate any initial
426    /// buffer. While that means that this initial operation is very
427    /// inexpensive, it may cause excessive allocation later when you add
428    /// data. If you have an idea of how much data the `String` will hold,
429    /// consider the [`with_capacity`] method to prevent excessive
430    /// re-allocation.
431    ///
432    /// [`with_capacity`]: String::with_capacity
433    ///
434    /// # Examples
435    ///
436    /// ```
437    /// let s = String::new();
438    /// ```
439    #[inline]
440    #[rustc_const_stable(feature = "const_string_new", since = "1.39.0")]
441    #[rustc_diagnostic_item = "string_new"]
442    #[stable(feature = "rust1", since = "1.0.0")]
443    #[must_use]
444    pub const fn new() -> String {
445        String { vec: Vec::new() }
446    }
447
448    /// Creates a new empty `String` with at least the specified capacity.
449    ///
450    /// `String`s have an internal buffer to hold their data. The capacity is
451    /// the length of that buffer, and can be queried with the [`capacity`]
452    /// method. This method creates an empty `String`, but one with an initial
453    /// buffer that can hold at least `capacity` bytes. This is useful when you
454    /// may be appending a bunch of data to the `String`, reducing the number of
455    /// reallocations it needs to do.
456    ///
457    /// [`capacity`]: String::capacity
458    ///
459    /// If the given capacity is `0`, no allocation will occur, and this method
460    /// is identical to the [`new`] method.
461    ///
462    /// [`new`]: String::new
463    ///
464    /// # Examples
465    ///
466    /// ```
467    /// let mut s = String::with_capacity(10);
468    ///
469    /// // The String contains no chars, even though it has capacity for more
470    /// assert_eq!(s.len(), 0);
471    ///
472    /// // These are all done without reallocating...
473    /// let cap = s.capacity();
474    /// for _ in 0..10 {
475    ///     s.push('a');
476    /// }
477    ///
478    /// assert_eq!(s.capacity(), cap);
479    ///
480    /// // ...but this may make the string reallocate
481    /// s.push('a');
482    /// ```
483    #[cfg(not(no_global_oom_handling))]
484    #[inline]
485    #[stable(feature = "rust1", since = "1.0.0")]
486    #[must_use]
487    pub fn with_capacity(capacity: usize) -> String {
488        String { vec: Vec::with_capacity(capacity) }
489    }
490
491    /// Creates a new empty `String` with at least the specified capacity.
492    ///
493    /// # Errors
494    ///
495    /// Returns [`Err`] if the capacity exceeds `isize::MAX` bytes,
496    /// or if the memory allocator reports failure.
497    ///
498    #[inline]
499    #[unstable(feature = "try_with_capacity", issue = "91913")]
500    pub fn try_with_capacity(capacity: usize) -> Result<String, TryReserveError> {
501        Ok(String { vec: Vec::try_with_capacity(capacity)? })
502    }
503
504    /// Converts a vector of bytes to a `String`.
505    ///
506    /// A string ([`String`]) is made of bytes ([`u8`]), and a vector of bytes
507    /// ([`Vec<u8>`]) is made of bytes, so this function converts between the
508    /// two. Not all byte slices are valid `String`s, however: `String`
509    /// requires that it is valid UTF-8. `from_utf8()` checks to ensure that
510    /// the bytes are valid UTF-8, and then does the conversion.
511    ///
512    /// If you are sure that the byte slice is valid UTF-8, and you don't want
513    /// to incur the overhead of the validity check, there is an unsafe version
514    /// of this function, [`from_utf8_unchecked`], which has the same behavior
515    /// but skips the check.
516    ///
517    /// This method will take care to not copy the vector, for efficiency's
518    /// sake.
519    ///
520    /// If you need a [`&str`] instead of a `String`, consider
521    /// [`str::from_utf8`].
522    ///
523    /// The inverse of this method is [`into_bytes`].
524    ///
525    /// # Errors
526    ///
527    /// Returns [`Err`] if the slice is not UTF-8 with a description as to why the
528    /// provided bytes are not UTF-8. The vector you moved in is also included.
529    ///
530    /// # Examples
531    ///
532    /// Basic usage:
533    ///
534    /// ```
535    /// // some bytes, in a vector
536    /// let sparkle_heart = vec![240, 159, 146, 150];
537    ///
538    /// // We know these bytes are valid, so we'll use `unwrap()`.
539    /// let sparkle_heart = String::from_utf8(sparkle_heart).unwrap();
540    ///
541    /// assert_eq!("πŸ’–", sparkle_heart);
542    /// ```
543    ///
544    /// Incorrect bytes:
545    ///
546    /// ```
547    /// // some invalid bytes, in a vector
548    /// let sparkle_heart = vec![0, 159, 146, 150];
549    ///
550    /// assert!(String::from_utf8(sparkle_heart).is_err());
551    /// ```
552    ///
553    /// See the docs for [`FromUtf8Error`] for more details on what you can do
554    /// with this error.
555    ///
556    /// [`from_utf8_unchecked`]: String::from_utf8_unchecked
557    /// [`Vec<u8>`]: crate::vec::Vec "Vec"
558    /// [`&str`]: prim@str "&str"
559    /// [`into_bytes`]: String::into_bytes
560    #[inline]
561    #[stable(feature = "rust1", since = "1.0.0")]
562    #[rustc_diagnostic_item = "string_from_utf8"]
563    pub fn from_utf8(vec: Vec<u8>) -> Result<String, FromUtf8Error> {
564        match str::from_utf8(&vec) {
565            Ok(..) => Ok(String { vec }),
566            Err(e) => Err(FromUtf8Error { bytes: vec, error: e }),
567        }
568    }
569
570    /// Converts a slice of bytes to a string, including invalid characters.
571    ///
572    /// Strings are made of bytes ([`u8`]), and a slice of bytes
573    /// ([`&[u8]`][byteslice]) is made of bytes, so this function converts
574    /// between the two. Not all byte slices are valid strings, however: strings
575    /// are required to be valid UTF-8. During this conversion,
576    /// `from_utf8_lossy()` will replace any invalid UTF-8 sequences with
577    /// [`U+FFFD REPLACEMENT CHARACTER`][U+FFFD], which looks like this: οΏ½
578    ///
579    /// [byteslice]: prim@slice
580    /// [U+FFFD]: core::char::REPLACEMENT_CHARACTER
581    ///
582    /// If you are sure that the byte slice is valid UTF-8, and you don't want
583    /// to incur the overhead of the conversion, there is an unsafe version
584    /// of this function, [`from_utf8_unchecked`], which has the same behavior
585    /// but skips the checks.
586    ///
587    /// [`from_utf8_unchecked`]: String::from_utf8_unchecked
588    ///
589    /// This function returns a [`Cow<'a, str>`]. If our byte slice is invalid
590    /// UTF-8, then we need to insert the replacement characters, which will
591    /// change the size of the string, and hence, require a `String`. But if
592    /// it's already valid UTF-8, we don't need a new allocation. This return
593    /// type allows us to handle both cases.
594    ///
595    /// [`Cow<'a, str>`]: crate::borrow::Cow "borrow::Cow"
596    ///
597    /// # Examples
598    ///
599    /// Basic usage:
600    ///
601    /// ```
602    /// // some bytes, in a vector
603    /// let sparkle_heart = vec![240, 159, 146, 150];
604    ///
605    /// let sparkle_heart = String::from_utf8_lossy(&sparkle_heart);
606    ///
607    /// assert_eq!("πŸ’–", sparkle_heart);
608    /// ```
609    ///
610    /// Incorrect bytes:
611    ///
612    /// ```
613    /// // some invalid bytes
614    /// let input = b"Hello \xF0\x90\x80World";
615    /// let output = String::from_utf8_lossy(input);
616    ///
617    /// assert_eq!("Hello οΏ½World", output);
618    /// ```
619    #[must_use]
620    #[cfg(not(no_global_oom_handling))]
621    #[stable(feature = "rust1", since = "1.0.0")]
622    pub fn from_utf8_lossy(v: &[u8]) -> Cow<'_, str> {
623        let mut iter = v.utf8_chunks();
624
625        let first_valid = if let Some(chunk) = iter.next() {
626            let valid = chunk.valid();
627            if chunk.invalid().is_empty() {
628                debug_assert_eq!(valid.len(), v.len());
629                return Cow::Borrowed(valid);
630            }
631            valid
632        } else {
633            return Cow::Borrowed("");
634        };
635
636        const REPLACEMENT: &str = "\u{FFFD}";
637
638        let mut res = String::with_capacity(v.len());
639        res.push_str(first_valid);
640        res.push_str(REPLACEMENT);
641
642        for chunk in iter {
643            res.push_str(chunk.valid());
644            if !chunk.invalid().is_empty() {
645                res.push_str(REPLACEMENT);
646            }
647        }
648
649        Cow::Owned(res)
650    }
651
652    /// Converts a [`Vec<u8>`] to a `String`, substituting invalid UTF-8
653    /// sequences with replacement characters.
654    ///
655    /// See [`from_utf8_lossy`] for more details.
656    ///
657    /// [`from_utf8_lossy`]: String::from_utf8_lossy
658    ///
659    /// Note that this function does not guarantee reuse of the original `Vec`
660    /// allocation.
661    ///
662    /// # Examples
663    ///
664    /// Basic usage:
665    ///
666    /// ```
667    /// #![feature(string_from_utf8_lossy_owned)]
668    /// // some bytes, in a vector
669    /// let sparkle_heart = vec![240, 159, 146, 150];
670    ///
671    /// let sparkle_heart = String::from_utf8_lossy_owned(sparkle_heart);
672    ///
673    /// assert_eq!(String::from("πŸ’–"), sparkle_heart);
674    /// ```
675    ///
676    /// Incorrect bytes:
677    ///
678    /// ```
679    /// #![feature(string_from_utf8_lossy_owned)]
680    /// // some invalid bytes
681    /// let input: Vec<u8> = b"Hello \xF0\x90\x80World".into();
682    /// let output = String::from_utf8_lossy_owned(input);
683    ///
684    /// assert_eq!(String::from("Hello οΏ½World"), output);
685    /// ```
686    #[must_use]
687    #[cfg(not(no_global_oom_handling))]
688    #[unstable(feature = "string_from_utf8_lossy_owned", issue = "129436")]
689    pub fn from_utf8_lossy_owned(v: Vec<u8>) -> String {
690        if let Cow::Owned(string) = String::from_utf8_lossy(&v) {
691            string
692        } else {
693            // SAFETY: `String::from_utf8_lossy`'s contract ensures that if
694            // it returns a `Cow::Borrowed`, it is a valid UTF-8 string.
695            // Otherwise, it returns a new allocation of an owned `String`, with
696            // replacement characters for invalid sequences, which is returned
697            // above.
698            unsafe { String::from_utf8_unchecked(v) }
699        }
700    }
701
702    /// Decode a native endian UTF-16–encoded vector `v` into a `String`,
703    /// returning [`Err`] if `v` contains any invalid data.
704    ///
705    /// # Examples
706    ///
707    /// ```
708    /// // π„žmusic
709    /// let v = &[0xD834, 0xDD1E, 0x006d, 0x0075,
710    ///           0x0073, 0x0069, 0x0063];
711    /// assert_eq!(String::from("π„žmusic"),
712    ///            String::from_utf16(v).unwrap());
713    ///
714    /// // π„žmu<invalid>ic
715    /// let v = &[0xD834, 0xDD1E, 0x006d, 0x0075,
716    ///           0xD800, 0x0069, 0x0063];
717    /// assert!(String::from_utf16(v).is_err());
718    /// ```
719    #[cfg(not(no_global_oom_handling))]
720    #[stable(feature = "rust1", since = "1.0.0")]
721    pub fn from_utf16(v: &[u16]) -> Result<String, FromUtf16Error> {
722        // This isn't done via collect::<Result<_, _>>() for performance reasons.
723        // FIXME: the function can be simplified again when #48994 is closed.
724        let mut ret = String::with_capacity(v.len());
725        for c in char::decode_utf16(v.iter().cloned()) {
726            if let Ok(c) = c {
727                ret.push(c);
728            } else {
729                return Err(FromUtf16Error(()));
730            }
731        }
732        Ok(ret)
733    }
734
735    /// Decode a native endian UTF-16–encoded slice `v` into a `String`,
736    /// replacing invalid data with [the replacement character (`U+FFFD`)][U+FFFD].
737    ///
738    /// Unlike [`from_utf8_lossy`] which returns a [`Cow<'a, str>`],
739    /// `from_utf16_lossy` returns a `String` since the UTF-16 to UTF-8
740    /// conversion requires a memory allocation.
741    ///
742    /// [`from_utf8_lossy`]: String::from_utf8_lossy
743    /// [`Cow<'a, str>`]: crate::borrow::Cow "borrow::Cow"
744    /// [U+FFFD]: core::char::REPLACEMENT_CHARACTER
745    ///
746    /// # Examples
747    ///
748    /// ```
749    /// // π„žmus<invalid>ic<invalid>
750    /// let v = &[0xD834, 0xDD1E, 0x006d, 0x0075,
751    ///           0x0073, 0xDD1E, 0x0069, 0x0063,
752    ///           0xD834];
753    ///
754    /// assert_eq!(String::from("π„žmus\u{FFFD}ic\u{FFFD}"),
755    ///            String::from_utf16_lossy(v));
756    /// ```
757    #[cfg(not(no_global_oom_handling))]
758    #[must_use]
759    #[inline]
760    #[stable(feature = "rust1", since = "1.0.0")]
761    pub fn from_utf16_lossy(v: &[u16]) -> String {
762        char::decode_utf16(v.iter().cloned())
763            .map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))
764            .collect()
765    }
766
767    /// Decode a UTF-16LE–encoded vector `v` into a `String`,
768    /// returning [`Err`] if `v` contains any invalid data.
769    ///
770    /// # Examples
771    ///
772    /// Basic usage:
773    ///
774    /// ```
775    /// #![feature(str_from_utf16_endian)]
776    /// // π„žmusic
777    /// let v = &[0x34, 0xD8, 0x1E, 0xDD, 0x6d, 0x00, 0x75, 0x00,
778    ///           0x73, 0x00, 0x69, 0x00, 0x63, 0x00];
779    /// assert_eq!(String::from("π„žmusic"),
780    ///            String::from_utf16le(v).unwrap());
781    ///
782    /// // π„žmu<invalid>ic
783    /// let v = &[0x34, 0xD8, 0x1E, 0xDD, 0x6d, 0x00, 0x75, 0x00,
784    ///           0x00, 0xD8, 0x69, 0x00, 0x63, 0x00];
785    /// assert!(String::from_utf16le(v).is_err());
786    /// ```
787    #[cfg(not(no_global_oom_handling))]
788    #[unstable(feature = "str_from_utf16_endian", issue = "116258")]
789    pub fn from_utf16le(v: &[u8]) -> Result<String, FromUtf16Error> {
790        if v.len() % 2 != 0 {
791            return Err(FromUtf16Error(()));
792        }
793        match (cfg!(target_endian = "little"), unsafe { v.align_to::<u16>() }) {
794            (true, ([], v, [])) => Self::from_utf16(v),
795            _ => char::decode_utf16(v.array_chunks::<2>().copied().map(u16::from_le_bytes))
796                .collect::<Result<_, _>>()
797                .map_err(|_| FromUtf16Error(())),
798        }
799    }
800
801    /// Decode a UTF-16LE–encoded slice `v` into a `String`, replacing
802    /// invalid data with [the replacement character (`U+FFFD`)][U+FFFD].
803    ///
804    /// Unlike [`from_utf8_lossy`] which returns a [`Cow<'a, str>`],
805    /// `from_utf16le_lossy` returns a `String` since the UTF-16 to UTF-8
806    /// conversion requires a memory allocation.
807    ///
808    /// [`from_utf8_lossy`]: String::from_utf8_lossy
809    /// [`Cow<'a, str>`]: crate::borrow::Cow "borrow::Cow"
810    /// [U+FFFD]: core::char::REPLACEMENT_CHARACTER
811    ///
812    /// # Examples
813    ///
814    /// Basic usage:
815    ///
816    /// ```
817    /// #![feature(str_from_utf16_endian)]
818    /// // π„žmus<invalid>ic<invalid>
819    /// let v = &[0x34, 0xD8, 0x1E, 0xDD, 0x6d, 0x00, 0x75, 0x00,
820    ///           0x73, 0x00, 0x1E, 0xDD, 0x69, 0x00, 0x63, 0x00,
821    ///           0x34, 0xD8];
822    ///
823    /// assert_eq!(String::from("π„žmus\u{FFFD}ic\u{FFFD}"),
824    ///            String::from_utf16le_lossy(v));
825    /// ```
826    #[cfg(not(no_global_oom_handling))]
827    #[unstable(feature = "str_from_utf16_endian", issue = "116258")]
828    pub fn from_utf16le_lossy(v: &[u8]) -> String {
829        match (cfg!(target_endian = "little"), unsafe { v.align_to::<u16>() }) {
830            (true, ([], v, [])) => Self::from_utf16_lossy(v),
831            (true, ([], v, [_remainder])) => Self::from_utf16_lossy(v) + "\u{FFFD}",
832            _ => {
833                let mut iter = v.array_chunks::<2>();
834                let string = char::decode_utf16(iter.by_ref().copied().map(u16::from_le_bytes))
835                    .map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))
836                    .collect();
837                if iter.remainder().is_empty() { string } else { string + "\u{FFFD}" }
838            }
839        }
840    }
841
842    /// Decode a UTF-16BE–encoded vector `v` into a `String`,
843    /// returning [`Err`] if `v` contains any invalid data.
844    ///
845    /// # Examples
846    ///
847    /// Basic usage:
848    ///
849    /// ```
850    /// #![feature(str_from_utf16_endian)]
851    /// // π„žmusic
852    /// let v = &[0xD8, 0x34, 0xDD, 0x1E, 0x00, 0x6d, 0x00, 0x75,
853    ///           0x00, 0x73, 0x00, 0x69, 0x00, 0x63];
854    /// assert_eq!(String::from("π„žmusic"),
855    ///            String::from_utf16be(v).unwrap());
856    ///
857    /// // π„žmu<invalid>ic
858    /// let v = &[0xD8, 0x34, 0xDD, 0x1E, 0x00, 0x6d, 0x00, 0x75,
859    ///           0xD8, 0x00, 0x00, 0x69, 0x00, 0x63];
860    /// assert!(String::from_utf16be(v).is_err());
861    /// ```
862    #[cfg(not(no_global_oom_handling))]
863    #[unstable(feature = "str_from_utf16_endian", issue = "116258")]
864    pub fn from_utf16be(v: &[u8]) -> Result<String, FromUtf16Error> {
865        if v.len() % 2 != 0 {
866            return Err(FromUtf16Error(()));
867        }
868        match (cfg!(target_endian = "big"), unsafe { v.align_to::<u16>() }) {
869            (true, ([], v, [])) => Self::from_utf16(v),
870            _ => char::decode_utf16(v.array_chunks::<2>().copied().map(u16::from_be_bytes))
871                .collect::<Result<_, _>>()
872                .map_err(|_| FromUtf16Error(())),
873        }
874    }
875
876    /// Decode a UTF-16BE–encoded slice `v` into a `String`, replacing
877    /// invalid data with [the replacement character (`U+FFFD`)][U+FFFD].
878    ///
879    /// Unlike [`from_utf8_lossy`] which returns a [`Cow<'a, str>`],
880    /// `from_utf16le_lossy` returns a `String` since the UTF-16 to UTF-8
881    /// conversion requires a memory allocation.
882    ///
883    /// [`from_utf8_lossy`]: String::from_utf8_lossy
884    /// [`Cow<'a, str>`]: crate::borrow::Cow "borrow::Cow"
885    /// [U+FFFD]: core::char::REPLACEMENT_CHARACTER
886    ///
887    /// # Examples
888    ///
889    /// Basic usage:
890    ///
891    /// ```
892    /// #![feature(str_from_utf16_endian)]
893    /// // π„žmus<invalid>ic<invalid>
894    /// let v = &[0xD8, 0x34, 0xDD, 0x1E, 0x00, 0x6d, 0x00, 0x75,
895    ///           0x00, 0x73, 0xDD, 0x1E, 0x00, 0x69, 0x00, 0x63,
896    ///           0xD8, 0x34];
897    ///
898    /// assert_eq!(String::from("π„žmus\u{FFFD}ic\u{FFFD}"),
899    ///            String::from_utf16be_lossy(v));
900    /// ```
901    #[cfg(not(no_global_oom_handling))]
902    #[unstable(feature = "str_from_utf16_endian", issue = "116258")]
903    pub fn from_utf16be_lossy(v: &[u8]) -> String {
904        match (cfg!(target_endian = "big"), unsafe { v.align_to::<u16>() }) {
905            (true, ([], v, [])) => Self::from_utf16_lossy(v),
906            (true, ([], v, [_remainder])) => Self::from_utf16_lossy(v) + "\u{FFFD}",
907            _ => {
908                let mut iter = v.array_chunks::<2>();
909                let string = char::decode_utf16(iter.by_ref().copied().map(u16::from_be_bytes))
910                    .map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))
911                    .collect();
912                if iter.remainder().is_empty() { string } else { string + "\u{FFFD}" }
913            }
914        }
915    }
916
917    /// Decomposes a `String` into its raw components: `(pointer, length, capacity)`.
918    ///
919    /// Returns the raw pointer to the underlying data, the length of
920    /// the string (in bytes), and the allocated capacity of the data
921    /// (in bytes). These are the same arguments in the same order as
922    /// the arguments to [`from_raw_parts`].
923    ///
924    /// After calling this function, the caller is responsible for the
925    /// memory previously managed by the `String`. The only way to do
926    /// this is to convert the raw pointer, length, and capacity back
927    /// into a `String` with the [`from_raw_parts`] function, allowing
928    /// the destructor to perform the cleanup.
929    ///
930    /// [`from_raw_parts`]: String::from_raw_parts
931    ///
932    /// # Examples
933    ///
934    /// ```
935    /// #![feature(vec_into_raw_parts)]
936    /// let s = String::from("hello");
937    ///
938    /// let (ptr, len, cap) = s.into_raw_parts();
939    ///
940    /// let rebuilt = unsafe { String::from_raw_parts(ptr, len, cap) };
941    /// assert_eq!(rebuilt, "hello");
942    /// ```
943    #[must_use = "losing the pointer will leak memory"]
944    #[unstable(feature = "vec_into_raw_parts", reason = "new API", issue = "65816")]
945    pub fn into_raw_parts(self) -> (*mut u8, usize, usize) {
946        self.vec.into_raw_parts()
947    }
948
949    /// Creates a new `String` from a pointer, a length and a capacity.
950    ///
951    /// # Safety
952    ///
953    /// This is highly unsafe, due to the number of invariants that aren't
954    /// checked:
955    ///
956    /// * all safety requirements for [`Vec::<u8>::from_raw_parts`].
957    /// * all safety requirements for [`String::from_utf8_unchecked`].
958    ///
959    /// Violating these may cause problems like corrupting the allocator's
960    /// internal data structures. For example, it is normally **not** safe to
961    /// build a `String` from a pointer to a C `char` array containing UTF-8
962    /// _unless_ you are certain that array was originally allocated by the
963    /// Rust standard library's allocator.
964    ///
965    /// The ownership of `buf` is effectively transferred to the
966    /// `String` which may then deallocate, reallocate or change the
967    /// contents of memory pointed to by the pointer at will. Ensure
968    /// that nothing else uses the pointer after calling this
969    /// function.
970    ///
971    /// # Examples
972    ///
973    /// ```
974    /// use std::mem;
975    ///
976    /// unsafe {
977    ///     let s = String::from("hello");
978    ///
979    // FIXME Update this when vec_into_raw_parts is stabilized
980    ///     // Prevent automatically dropping the String's data
981    ///     let mut s = mem::ManuallyDrop::new(s);
982    ///
983    ///     let ptr = s.as_mut_ptr();
984    ///     let len = s.len();
985    ///     let capacity = s.capacity();
986    ///
987    ///     let s = String::from_raw_parts(ptr, len, capacity);
988    ///
989    ///     assert_eq!(String::from("hello"), s);
990    /// }
991    /// ```
992    #[inline]
993    #[stable(feature = "rust1", since = "1.0.0")]
994    pub unsafe fn from_raw_parts(buf: *mut u8, length: usize, capacity: usize) -> String {
995        unsafe { String { vec: Vec::from_raw_parts(buf, length, capacity) } }
996    }
997
998    /// Converts a vector of bytes to a `String` without checking that the
999    /// string contains valid UTF-8.
1000    ///
1001    /// See the safe version, [`from_utf8`], for more details.
1002    ///
1003    /// [`from_utf8`]: String::from_utf8
1004    ///
1005    /// # Safety
1006    ///
1007    /// This function is unsafe because it does not check that the bytes passed
1008    /// to it are valid UTF-8. If this constraint is violated, it may cause
1009    /// memory unsafety issues with future users of the `String`, as the rest of
1010    /// the standard library assumes that `String`s are valid UTF-8.
1011    ///
1012    /// # Examples
1013    ///
1014    /// ```
1015    /// // some bytes, in a vector
1016    /// let sparkle_heart = vec![240, 159, 146, 150];
1017    ///
1018    /// let sparkle_heart = unsafe {
1019    ///     String::from_utf8_unchecked(sparkle_heart)
1020    /// };
1021    ///
1022    /// assert_eq!("πŸ’–", sparkle_heart);
1023    /// ```
1024    #[inline]
1025    #[must_use]
1026    #[stable(feature = "rust1", since = "1.0.0")]
1027    pub unsafe fn from_utf8_unchecked(bytes: Vec<u8>) -> String {
1028        String { vec: bytes }
1029    }
1030
1031    /// Converts a `String` into a byte vector.
1032    ///
1033    /// This consumes the `String`, so we do not need to copy its contents.
1034    ///
1035    /// # Examples
1036    ///
1037    /// ```
1038    /// let s = String::from("hello");
1039    /// let bytes = s.into_bytes();
1040    ///
1041    /// assert_eq!(&[104, 101, 108, 108, 111][..], &bytes[..]);
1042    /// ```
1043    #[inline]
1044    #[must_use = "`self` will be dropped if the result is not used"]
1045    #[stable(feature = "rust1", since = "1.0.0")]
1046    #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1047    #[rustc_allow_const_fn_unstable(const_precise_live_drops)]
1048    pub const fn into_bytes(self) -> Vec<u8> {
1049        self.vec
1050    }
1051
1052    /// Extracts a string slice containing the entire `String`.
1053    ///
1054    /// # Examples
1055    ///
1056    /// ```
1057    /// let s = String::from("foo");
1058    ///
1059    /// assert_eq!("foo", s.as_str());
1060    /// ```
1061    #[inline]
1062    #[must_use]
1063    #[stable(feature = "string_as_str", since = "1.7.0")]
1064    #[rustc_diagnostic_item = "string_as_str"]
1065    #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1066    pub const fn as_str(&self) -> &str {
1067        // SAFETY: String contents are stipulated to be valid UTF-8, invalid contents are an error
1068        // at construction.
1069        unsafe { str::from_utf8_unchecked(self.vec.as_slice()) }
1070    }
1071
1072    /// Converts a `String` into a mutable string slice.
1073    ///
1074    /// # Examples
1075    ///
1076    /// ```
1077    /// let mut s = String::from("foobar");
1078    /// let s_mut_str = s.as_mut_str();
1079    ///
1080    /// s_mut_str.make_ascii_uppercase();
1081    ///
1082    /// assert_eq!("FOOBAR", s_mut_str);
1083    /// ```
1084    #[inline]
1085    #[must_use]
1086    #[stable(feature = "string_as_str", since = "1.7.0")]
1087    #[rustc_diagnostic_item = "string_as_mut_str"]
1088    #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1089    pub const fn as_mut_str(&mut self) -> &mut str {
1090        // SAFETY: String contents are stipulated to be valid UTF-8, invalid contents are an error
1091        // at construction.
1092        unsafe { str::from_utf8_unchecked_mut(self.vec.as_mut_slice()) }
1093    }
1094
1095    /// Appends a given string slice onto the end of this `String`.
1096    ///
1097    /// # Examples
1098    ///
1099    /// ```
1100    /// let mut s = String::from("foo");
1101    ///
1102    /// s.push_str("bar");
1103    ///
1104    /// assert_eq!("foobar", s);
1105    /// ```
1106    #[cfg(not(no_global_oom_handling))]
1107    #[inline]
1108    #[stable(feature = "rust1", since = "1.0.0")]
1109    #[rustc_confusables("append", "push")]
1110    #[rustc_diagnostic_item = "string_push_str"]
1111    pub fn push_str(&mut self, string: &str) {
1112        self.vec.extend_from_slice(string.as_bytes())
1113    }
1114
1115    /// Copies elements from `src` range to the end of the string.
1116    ///
1117    /// # Panics
1118    ///
1119    /// Panics if the starting point or end point do not lie on a [`char`]
1120    /// boundary, or if they're out of bounds.
1121    ///
1122    /// # Examples
1123    ///
1124    /// ```
1125    /// let mut string = String::from("abcde");
1126    ///
1127    /// string.extend_from_within(2..);
1128    /// assert_eq!(string, "abcdecde");
1129    ///
1130    /// string.extend_from_within(..2);
1131    /// assert_eq!(string, "abcdecdeab");
1132    ///
1133    /// string.extend_from_within(4..8);
1134    /// assert_eq!(string, "abcdecdeabecde");
1135    /// ```
1136    #[cfg(not(no_global_oom_handling))]
1137    #[stable(feature = "string_extend_from_within", since = "1.87.0")]
1138    pub fn extend_from_within<R>(&mut self, src: R)
1139    where
1140        R: RangeBounds<usize>,
1141    {
1142        let src @ Range { start, end } = slice::range(src, ..self.len());
1143
1144        assert!(self.is_char_boundary(start));
1145        assert!(self.is_char_boundary(end));
1146
1147        self.vec.extend_from_within(src);
1148    }
1149
1150    /// Returns this `String`'s capacity, in bytes.
1151    ///
1152    /// # Examples
1153    ///
1154    /// ```
1155    /// let s = String::with_capacity(10);
1156    ///
1157    /// assert!(s.capacity() >= 10);
1158    /// ```
1159    #[inline]
1160    #[must_use]
1161    #[stable(feature = "rust1", since = "1.0.0")]
1162    #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1163    pub const fn capacity(&self) -> usize {
1164        self.vec.capacity()
1165    }
1166
1167    /// Reserves capacity for at least `additional` bytes more than the
1168    /// current length. The allocator may reserve more space to speculatively
1169    /// avoid frequent allocations. After calling `reserve`,
1170    /// capacity will be greater than or equal to `self.len() + additional`.
1171    /// Does nothing if capacity is already sufficient.
1172    ///
1173    /// # Panics
1174    ///
1175    /// Panics if the new capacity overflows [`usize`].
1176    ///
1177    /// # Examples
1178    ///
1179    /// Basic usage:
1180    ///
1181    /// ```
1182    /// let mut s = String::new();
1183    ///
1184    /// s.reserve(10);
1185    ///
1186    /// assert!(s.capacity() >= 10);
1187    /// ```
1188    ///
1189    /// This might not actually increase the capacity:
1190    ///
1191    /// ```
1192    /// let mut s = String::with_capacity(10);
1193    /// s.push('a');
1194    /// s.push('b');
1195    ///
1196    /// // s now has a length of 2 and a capacity of at least 10
1197    /// let capacity = s.capacity();
1198    /// assert_eq!(2, s.len());
1199    /// assert!(capacity >= 10);
1200    ///
1201    /// // Since we already have at least an extra 8 capacity, calling this...
1202    /// s.reserve(8);
1203    ///
1204    /// // ... doesn't actually increase.
1205    /// assert_eq!(capacity, s.capacity());
1206    /// ```
1207    #[cfg(not(no_global_oom_handling))]
1208    #[inline]
1209    #[stable(feature = "rust1", since = "1.0.0")]
1210    pub fn reserve(&mut self, additional: usize) {
1211        self.vec.reserve(additional)
1212    }
1213
1214    /// Reserves the minimum capacity for at least `additional` bytes more than
1215    /// the current length. Unlike [`reserve`], this will not
1216    /// deliberately over-allocate to speculatively avoid frequent allocations.
1217    /// After calling `reserve_exact`, capacity will be greater than or equal to
1218    /// `self.len() + additional`. Does nothing if the capacity is already
1219    /// sufficient.
1220    ///
1221    /// [`reserve`]: String::reserve
1222    ///
1223    /// # Panics
1224    ///
1225    /// Panics if the new capacity overflows [`usize`].
1226    ///
1227    /// # Examples
1228    ///
1229    /// Basic usage:
1230    ///
1231    /// ```
1232    /// let mut s = String::new();
1233    ///
1234    /// s.reserve_exact(10);
1235    ///
1236    /// assert!(s.capacity() >= 10);
1237    /// ```
1238    ///
1239    /// This might not actually increase the capacity:
1240    ///
1241    /// ```
1242    /// let mut s = String::with_capacity(10);
1243    /// s.push('a');
1244    /// s.push('b');
1245    ///
1246    /// // s now has a length of 2 and a capacity of at least 10
1247    /// let capacity = s.capacity();
1248    /// assert_eq!(2, s.len());
1249    /// assert!(capacity >= 10);
1250    ///
1251    /// // Since we already have at least an extra 8 capacity, calling this...
1252    /// s.reserve_exact(8);
1253    ///
1254    /// // ... doesn't actually increase.
1255    /// assert_eq!(capacity, s.capacity());
1256    /// ```
1257    #[cfg(not(no_global_oom_handling))]
1258    #[inline]
1259    #[stable(feature = "rust1", since = "1.0.0")]
1260    pub fn reserve_exact(&mut self, additional: usize) {
1261        self.vec.reserve_exact(additional)
1262    }
1263
1264    /// Tries to reserve capacity for at least `additional` bytes more than the
1265    /// current length. The allocator may reserve more space to speculatively
1266    /// avoid frequent allocations. After calling `try_reserve`, capacity will be
1267    /// greater than or equal to `self.len() + additional` if it returns
1268    /// `Ok(())`. Does nothing if capacity is already sufficient. This method
1269    /// preserves the contents even if an error occurs.
1270    ///
1271    /// # Errors
1272    ///
1273    /// If the capacity overflows, or the allocator reports a failure, then an error
1274    /// is returned.
1275    ///
1276    /// # Examples
1277    ///
1278    /// ```
1279    /// use std::collections::TryReserveError;
1280    ///
1281    /// fn process_data(data: &str) -> Result<String, TryReserveError> {
1282    ///     let mut output = String::new();
1283    ///
1284    ///     // Pre-reserve the memory, exiting if we can't
1285    ///     output.try_reserve(data.len())?;
1286    ///
1287    ///     // Now we know this can't OOM in the middle of our complex work
1288    ///     output.push_str(data);
1289    ///
1290    ///     Ok(output)
1291    /// }
1292    /// # process_data("rust").expect("why is the test harness OOMing on 4 bytes?");
1293    /// ```
1294    #[stable(feature = "try_reserve", since = "1.57.0")]
1295    pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
1296        self.vec.try_reserve(additional)
1297    }
1298
1299    /// Tries to reserve the minimum capacity for at least `additional` bytes
1300    /// more than the current length. Unlike [`try_reserve`], this will not
1301    /// deliberately over-allocate to speculatively avoid frequent allocations.
1302    /// After calling `try_reserve_exact`, capacity will be greater than or
1303    /// equal to `self.len() + additional` if it returns `Ok(())`.
1304    /// Does nothing if the capacity is already sufficient.
1305    ///
1306    /// Note that the allocator may give the collection more space than it
1307    /// requests. Therefore, capacity can not be relied upon to be precisely
1308    /// minimal. Prefer [`try_reserve`] if future insertions are expected.
1309    ///
1310    /// [`try_reserve`]: String::try_reserve
1311    ///
1312    /// # Errors
1313    ///
1314    /// If the capacity overflows, or the allocator reports a failure, then an error
1315    /// is returned.
1316    ///
1317    /// # Examples
1318    ///
1319    /// ```
1320    /// use std::collections::TryReserveError;
1321    ///
1322    /// fn process_data(data: &str) -> Result<String, TryReserveError> {
1323    ///     let mut output = String::new();
1324    ///
1325    ///     // Pre-reserve the memory, exiting if we can't
1326    ///     output.try_reserve_exact(data.len())?;
1327    ///
1328    ///     // Now we know this can't OOM in the middle of our complex work
1329    ///     output.push_str(data);
1330    ///
1331    ///     Ok(output)
1332    /// }
1333    /// # process_data("rust").expect("why is the test harness OOMing on 4 bytes?");
1334    /// ```
1335    #[stable(feature = "try_reserve", since = "1.57.0")]
1336    pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> {
1337        self.vec.try_reserve_exact(additional)
1338    }
1339
1340    /// Shrinks the capacity of this `String` to match its length.
1341    ///
1342    /// # Examples
1343    ///
1344    /// ```
1345    /// let mut s = String::from("foo");
1346    ///
1347    /// s.reserve(100);
1348    /// assert!(s.capacity() >= 100);
1349    ///
1350    /// s.shrink_to_fit();
1351    /// assert_eq!(3, s.capacity());
1352    /// ```
1353    #[cfg(not(no_global_oom_handling))]
1354    #[inline]
1355    #[stable(feature = "rust1", since = "1.0.0")]
1356    pub fn shrink_to_fit(&mut self) {
1357        self.vec.shrink_to_fit()
1358    }
1359
1360    /// Shrinks the capacity of this `String` with a lower bound.
1361    ///
1362    /// The capacity will remain at least as large as both the length
1363    /// and the supplied value.
1364    ///
1365    /// If the current capacity is less than the lower limit, this is a no-op.
1366    ///
1367    /// # Examples
1368    ///
1369    /// ```
1370    /// let mut s = String::from("foo");
1371    ///
1372    /// s.reserve(100);
1373    /// assert!(s.capacity() >= 100);
1374    ///
1375    /// s.shrink_to(10);
1376    /// assert!(s.capacity() >= 10);
1377    /// s.shrink_to(0);
1378    /// assert!(s.capacity() >= 3);
1379    /// ```
1380    #[cfg(not(no_global_oom_handling))]
1381    #[inline]
1382    #[stable(feature = "shrink_to", since = "1.56.0")]
1383    pub fn shrink_to(&mut self, min_capacity: usize) {
1384        self.vec.shrink_to(min_capacity)
1385    }
1386
1387    /// Appends the given [`char`] to the end of this `String`.
1388    ///
1389    /// # Examples
1390    ///
1391    /// ```
1392    /// let mut s = String::from("abc");
1393    ///
1394    /// s.push('1');
1395    /// s.push('2');
1396    /// s.push('3');
1397    ///
1398    /// assert_eq!("abc123", s);
1399    /// ```
1400    #[cfg(not(no_global_oom_handling))]
1401    #[inline]
1402    #[stable(feature = "rust1", since = "1.0.0")]
1403    pub fn push(&mut self, ch: char) {
1404        let len = self.len();
1405        let ch_len = ch.len_utf8();
1406        self.reserve(ch_len);
1407
1408        // SAFETY: Just reserved capacity for at least the length needed to encode `ch`.
1409        unsafe {
1410            core::char::encode_utf8_raw_unchecked(ch as u32, self.vec.as_mut_ptr().add(self.len()));
1411            self.vec.set_len(len + ch_len);
1412        }
1413    }
1414
1415    /// Returns a byte slice of this `String`'s contents.
1416    ///
1417    /// The inverse of this method is [`from_utf8`].
1418    ///
1419    /// [`from_utf8`]: String::from_utf8
1420    ///
1421    /// # Examples
1422    ///
1423    /// ```
1424    /// let s = String::from("hello");
1425    ///
1426    /// assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
1427    /// ```
1428    #[inline]
1429    #[must_use]
1430    #[stable(feature = "rust1", since = "1.0.0")]
1431    #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1432    pub const fn as_bytes(&self) -> &[u8] {
1433        self.vec.as_slice()
1434    }
1435
1436    /// Shortens this `String` to the specified length.
1437    ///
1438    /// If `new_len` is greater than or equal to the string's current length, this has no
1439    /// effect.
1440    ///
1441    /// Note that this method has no effect on the allocated capacity
1442    /// of the string
1443    ///
1444    /// # Panics
1445    ///
1446    /// Panics if `new_len` does not lie on a [`char`] boundary.
1447    ///
1448    /// # Examples
1449    ///
1450    /// ```
1451    /// let mut s = String::from("hello");
1452    ///
1453    /// s.truncate(2);
1454    ///
1455    /// assert_eq!("he", s);
1456    /// ```
1457    #[inline]
1458    #[stable(feature = "rust1", since = "1.0.0")]
1459    pub fn truncate(&mut self, new_len: usize) {
1460        if new_len <= self.len() {
1461            assert!(self.is_char_boundary(new_len));
1462            self.vec.truncate(new_len)
1463        }
1464    }
1465
1466    /// Removes the last character from the string buffer and returns it.
1467    ///
1468    /// Returns [`None`] if this `String` is empty.
1469    ///
1470    /// # Examples
1471    ///
1472    /// ```
1473    /// let mut s = String::from("abč");
1474    ///
1475    /// assert_eq!(s.pop(), Some('č'));
1476    /// assert_eq!(s.pop(), Some('b'));
1477    /// assert_eq!(s.pop(), Some('a'));
1478    ///
1479    /// assert_eq!(s.pop(), None);
1480    /// ```
1481    #[inline]
1482    #[stable(feature = "rust1", since = "1.0.0")]
1483    pub fn pop(&mut self) -> Option<char> {
1484        let ch = self.chars().rev().next()?;
1485        let newlen = self.len() - ch.len_utf8();
1486        unsafe {
1487            self.vec.set_len(newlen);
1488        }
1489        Some(ch)
1490    }
1491
1492    /// Removes a [`char`] from this `String` at a byte position and returns it.
1493    ///
1494    /// This is an *O*(*n*) operation, as it requires copying every element in the
1495    /// buffer.
1496    ///
1497    /// # Panics
1498    ///
1499    /// Panics if `idx` is larger than or equal to the `String`'s length,
1500    /// or if it does not lie on a [`char`] boundary.
1501    ///
1502    /// # Examples
1503    ///
1504    /// ```
1505    /// let mut s = String::from("abΓ§");
1506    ///
1507    /// assert_eq!(s.remove(0), 'a');
1508    /// assert_eq!(s.remove(1), 'Γ§');
1509    /// assert_eq!(s.remove(0), 'b');
1510    /// ```
1511    #[inline]
1512    #[stable(feature = "rust1", since = "1.0.0")]
1513    #[rustc_confusables("delete", "take")]
1514    pub fn remove(&mut self, idx: usize) -> char {
1515        let ch = match self[idx..].chars().next() {
1516            Some(ch) => ch,
1517            None => panic!("cannot remove a char from the end of a string"),
1518        };
1519
1520        let next = idx + ch.len_utf8();
1521        let len = self.len();
1522        unsafe {
1523            ptr::copy(self.vec.as_ptr().add(next), self.vec.as_mut_ptr().add(idx), len - next);
1524            self.vec.set_len(len - (next - idx));
1525        }
1526        ch
1527    }
1528
1529    /// Remove all matches of pattern `pat` in the `String`.
1530    ///
1531    /// # Examples
1532    ///
1533    /// ```
1534    /// #![feature(string_remove_matches)]
1535    /// let mut s = String::from("Trees are not green, the sky is not blue.");
1536    /// s.remove_matches("not ");
1537    /// assert_eq!("Trees are green, the sky is blue.", s);
1538    /// ```
1539    ///
1540    /// Matches will be detected and removed iteratively, so in cases where
1541    /// patterns overlap, only the first pattern will be removed:
1542    ///
1543    /// ```
1544    /// #![feature(string_remove_matches)]
1545    /// let mut s = String::from("banana");
1546    /// s.remove_matches("ana");
1547    /// assert_eq!("bna", s);
1548    /// ```
1549    #[cfg(not(no_global_oom_handling))]
1550    #[unstable(feature = "string_remove_matches", reason = "new API", issue = "72826")]
1551    pub fn remove_matches<P: Pattern>(&mut self, pat: P) {
1552        use core::str::pattern::Searcher;
1553
1554        let rejections = {
1555            let mut searcher = pat.into_searcher(self);
1556            // Per Searcher::next:
1557            //
1558            // A Match result needs to contain the whole matched pattern,
1559            // however Reject results may be split up into arbitrary many
1560            // adjacent fragments. Both ranges may have zero length.
1561            //
1562            // In practice the implementation of Searcher::next_match tends to
1563            // be more efficient, so we use it here and do some work to invert
1564            // matches into rejections since that's what we want to copy below.
1565            let mut front = 0;
1566            let rejections: Vec<_> = from_fn(|| {
1567                let (start, end) = searcher.next_match()?;
1568                let prev_front = front;
1569                front = end;
1570                Some((prev_front, start))
1571            })
1572            .collect();
1573            rejections.into_iter().chain(core::iter::once((front, self.len())))
1574        };
1575
1576        let mut len = 0;
1577        let ptr = self.vec.as_mut_ptr();
1578
1579        for (start, end) in rejections {
1580            let count = end - start;
1581            if start != len {
1582                // SAFETY: per Searcher::next:
1583                //
1584                // The stream of Match and Reject values up to a Done will
1585                // contain index ranges that are adjacent, non-overlapping,
1586                // covering the whole haystack, and laying on utf8
1587                // boundaries.
1588                unsafe {
1589                    ptr::copy(ptr.add(start), ptr.add(len), count);
1590                }
1591            }
1592            len += count;
1593        }
1594
1595        unsafe {
1596            self.vec.set_len(len);
1597        }
1598    }
1599
1600    /// Retains only the characters specified by the predicate.
1601    ///
1602    /// In other words, remove all characters `c` such that `f(c)` returns `false`.
1603    /// This method operates in place, visiting each character exactly once in the
1604    /// original order, and preserves the order of the retained characters.
1605    ///
1606    /// # Examples
1607    ///
1608    /// ```
1609    /// let mut s = String::from("f_o_ob_ar");
1610    ///
1611    /// s.retain(|c| c != '_');
1612    ///
1613    /// assert_eq!(s, "foobar");
1614    /// ```
1615    ///
1616    /// Because the elements are visited exactly once in the original order,
1617    /// external state may be used to decide which elements to keep.
1618    ///
1619    /// ```
1620    /// let mut s = String::from("abcde");
1621    /// let keep = [false, true, true, false, true];
1622    /// let mut iter = keep.iter();
1623    /// s.retain(|_| *iter.next().unwrap());
1624    /// assert_eq!(s, "bce");
1625    /// ```
1626    #[inline]
1627    #[stable(feature = "string_retain", since = "1.26.0")]
1628    pub fn retain<F>(&mut self, mut f: F)
1629    where
1630        F: FnMut(char) -> bool,
1631    {
1632        struct SetLenOnDrop<'a> {
1633            s: &'a mut String,
1634            idx: usize,
1635            del_bytes: usize,
1636        }
1637
1638        impl<'a> Drop for SetLenOnDrop<'a> {
1639            fn drop(&mut self) {
1640                let new_len = self.idx - self.del_bytes;
1641                debug_assert!(new_len <= self.s.len());
1642                unsafe { self.s.vec.set_len(new_len) };
1643            }
1644        }
1645
1646        let len = self.len();
1647        let mut guard = SetLenOnDrop { s: self, idx: 0, del_bytes: 0 };
1648
1649        while guard.idx < len {
1650            let ch =
1651                // SAFETY: `guard.idx` is positive-or-zero and less that len so the `get_unchecked`
1652                // is in bound. `self` is valid UTF-8 like string and the returned slice starts at
1653                // a unicode code point so the `Chars` always return one character.
1654                unsafe { guard.s.get_unchecked(guard.idx..len).chars().next().unwrap_unchecked() };
1655            let ch_len = ch.len_utf8();
1656
1657            if !f(ch) {
1658                guard.del_bytes += ch_len;
1659            } else if guard.del_bytes > 0 {
1660                // SAFETY: `guard.idx` is in bound and `guard.del_bytes` represent the number of
1661                // bytes that are erased from the string so the resulting `guard.idx -
1662                // guard.del_bytes` always represent a valid unicode code point.
1663                //
1664                // `guard.del_bytes` >= `ch.len_utf8()`, so taking a slice with `ch.len_utf8()` len
1665                // is safe.
1666                ch.encode_utf8(unsafe {
1667                    crate::slice::from_raw_parts_mut(
1668                        guard.s.as_mut_ptr().add(guard.idx - guard.del_bytes),
1669                        ch.len_utf8(),
1670                    )
1671                });
1672            }
1673
1674            // Point idx to the next char
1675            guard.idx += ch_len;
1676        }
1677
1678        drop(guard);
1679    }
1680
1681    /// Inserts a character into this `String` at a byte position.
1682    ///
1683    /// This is an *O*(*n*) operation as it requires copying every element in the
1684    /// buffer.
1685    ///
1686    /// # Panics
1687    ///
1688    /// Panics if `idx` is larger than the `String`'s length, or if it does not
1689    /// lie on a [`char`] boundary.
1690    ///
1691    /// # Examples
1692    ///
1693    /// ```
1694    /// let mut s = String::with_capacity(3);
1695    ///
1696    /// s.insert(0, 'f');
1697    /// s.insert(1, 'o');
1698    /// s.insert(2, 'o');
1699    ///
1700    /// assert_eq!("foo", s);
1701    /// ```
1702    #[cfg(not(no_global_oom_handling))]
1703    #[inline]
1704    #[stable(feature = "rust1", since = "1.0.0")]
1705    #[rustc_confusables("set")]
1706    pub fn insert(&mut self, idx: usize, ch: char) {
1707        assert!(self.is_char_boundary(idx));
1708
1709        let len = self.len();
1710        let ch_len = ch.len_utf8();
1711        self.reserve(ch_len);
1712
1713        // SAFETY: Move the bytes starting from `idx` to their new location `ch_len`
1714        // bytes ahead. This is safe because sufficient capacity was reserved, and `idx`
1715        // is a char boundary.
1716        unsafe {
1717            ptr::copy(
1718                self.vec.as_ptr().add(idx),
1719                self.vec.as_mut_ptr().add(idx + ch_len),
1720                len - idx,
1721            );
1722        }
1723
1724        // SAFETY: Encode the character into the vacated region if `idx != len`,
1725        // or into the uninitialized spare capacity otherwise.
1726        unsafe {
1727            core::char::encode_utf8_raw_unchecked(ch as u32, self.vec.as_mut_ptr().add(idx));
1728        }
1729
1730        // SAFETY: Update the length to include the newly added bytes.
1731        unsafe {
1732            self.vec.set_len(len + ch_len);
1733        }
1734    }
1735
1736    /// Inserts a string slice into this `String` at a byte position.
1737    ///
1738    /// This is an *O*(*n*) operation as it requires copying every element in the
1739    /// buffer.
1740    ///
1741    /// # Panics
1742    ///
1743    /// Panics if `idx` is larger than the `String`'s length, or if it does not
1744    /// lie on a [`char`] boundary.
1745    ///
1746    /// # Examples
1747    ///
1748    /// ```
1749    /// let mut s = String::from("bar");
1750    ///
1751    /// s.insert_str(0, "foo");
1752    ///
1753    /// assert_eq!("foobar", s);
1754    /// ```
1755    #[cfg(not(no_global_oom_handling))]
1756    #[inline]
1757    #[stable(feature = "insert_str", since = "1.16.0")]
1758    #[rustc_diagnostic_item = "string_insert_str"]
1759    pub fn insert_str(&mut self, idx: usize, string: &str) {
1760        assert!(self.is_char_boundary(idx));
1761
1762        let len = self.len();
1763        let amt = string.len();
1764        self.reserve(amt);
1765
1766        // SAFETY: Move the bytes starting from `idx` to their new location `amt` bytes
1767        // ahead. This is safe because sufficient capacity was just reserved, and `idx`
1768        // is a char boundary.
1769        unsafe {
1770            ptr::copy(self.vec.as_ptr().add(idx), self.vec.as_mut_ptr().add(idx + amt), len - idx);
1771        }
1772
1773        // SAFETY: Copy the new string slice into the vacated region if `idx != len`,
1774        // or into the uninitialized spare capacity otherwise. The borrow checker
1775        // ensures that the source and destination do not overlap.
1776        unsafe {
1777            ptr::copy_nonoverlapping(string.as_ptr(), self.vec.as_mut_ptr().add(idx), amt);
1778        }
1779
1780        // SAFETY: Update the length to include the newly added bytes.
1781        unsafe {
1782            self.vec.set_len(len + amt);
1783        }
1784    }
1785
1786    /// Returns a mutable reference to the contents of this `String`.
1787    ///
1788    /// # Safety
1789    ///
1790    /// This function is unsafe because the returned `&mut Vec` allows writing
1791    /// bytes which are not valid UTF-8. If this constraint is violated, using
1792    /// the original `String` after dropping the `&mut Vec` may violate memory
1793    /// safety, as the rest of the standard library assumes that `String`s are
1794    /// valid UTF-8.
1795    ///
1796    /// # Examples
1797    ///
1798    /// ```
1799    /// let mut s = String::from("hello");
1800    ///
1801    /// unsafe {
1802    ///     let vec = s.as_mut_vec();
1803    ///     assert_eq!(&[104, 101, 108, 108, 111][..], &vec[..]);
1804    ///
1805    ///     vec.reverse();
1806    /// }
1807    /// assert_eq!(s, "olleh");
1808    /// ```
1809    #[inline]
1810    #[stable(feature = "rust1", since = "1.0.0")]
1811    #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1812    pub const unsafe fn as_mut_vec(&mut self) -> &mut Vec<u8> {
1813        &mut self.vec
1814    }
1815
1816    /// Returns the length of this `String`, in bytes, not [`char`]s or
1817    /// graphemes. In other words, it might not be what a human considers the
1818    /// length of the string.
1819    ///
1820    /// # Examples
1821    ///
1822    /// ```
1823    /// let a = String::from("foo");
1824    /// assert_eq!(a.len(), 3);
1825    ///
1826    /// let fancy_f = String::from("Ζ’oo");
1827    /// assert_eq!(fancy_f.len(), 4);
1828    /// assert_eq!(fancy_f.chars().count(), 3);
1829    /// ```
1830    #[inline]
1831    #[must_use]
1832    #[stable(feature = "rust1", since = "1.0.0")]
1833    #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1834    #[rustc_confusables("length", "size")]
1835    #[cfg_attr(not(bootstrap), rustc_no_implicit_autorefs)]
1836    pub const fn len(&self) -> usize {
1837        self.vec.len()
1838    }
1839
1840    /// Returns `true` if this `String` has a length of zero, and `false` otherwise.
1841    ///
1842    /// # Examples
1843    ///
1844    /// ```
1845    /// let mut v = String::new();
1846    /// assert!(v.is_empty());
1847    ///
1848    /// v.push('a');
1849    /// assert!(!v.is_empty());
1850    /// ```
1851    #[inline]
1852    #[must_use]
1853    #[stable(feature = "rust1", since = "1.0.0")]
1854    #[rustc_const_stable(feature = "const_vec_string_slice", since = "1.87.0")]
1855    #[cfg_attr(not(bootstrap), rustc_no_implicit_autorefs)]
1856    pub const fn is_empty(&self) -> bool {
1857        self.len() == 0
1858    }
1859
1860    /// Splits the string into two at the given byte index.
1861    ///
1862    /// Returns a newly allocated `String`. `self` contains bytes `[0, at)`, and
1863    /// the returned `String` contains bytes `[at, len)`. `at` must be on the
1864    /// boundary of a UTF-8 code point.
1865    ///
1866    /// Note that the capacity of `self` does not change.
1867    ///
1868    /// # Panics
1869    ///
1870    /// Panics if `at` is not on a `UTF-8` code point boundary, or if it is beyond the last
1871    /// code point of the string.
1872    ///
1873    /// # Examples
1874    ///
1875    /// ```
1876    /// # fn main() {
1877    /// let mut hello = String::from("Hello, World!");
1878    /// let world = hello.split_off(7);
1879    /// assert_eq!(hello, "Hello, ");
1880    /// assert_eq!(world, "World!");
1881    /// # }
1882    /// ```
1883    #[cfg(not(no_global_oom_handling))]
1884    #[inline]
1885    #[stable(feature = "string_split_off", since = "1.16.0")]
1886    #[must_use = "use `.truncate()` if you don't need the other half"]
1887    pub fn split_off(&mut self, at: usize) -> String {
1888        assert!(self.is_char_boundary(at));
1889        let other = self.vec.split_off(at);
1890        unsafe { String::from_utf8_unchecked(other) }
1891    }
1892
1893    /// Truncates this `String`, removing all contents.
1894    ///
1895    /// While this means the `String` will have a length of zero, it does not
1896    /// touch its capacity.
1897    ///
1898    /// # Examples
1899    ///
1900    /// ```
1901    /// let mut s = String::from("foo");
1902    ///
1903    /// s.clear();
1904    ///
1905    /// assert!(s.is_empty());
1906    /// assert_eq!(0, s.len());
1907    /// assert_eq!(3, s.capacity());
1908    /// ```
1909    #[inline]
1910    #[stable(feature = "rust1", since = "1.0.0")]
1911    pub fn clear(&mut self) {
1912        self.vec.clear()
1913    }
1914
1915    /// Removes the specified range from the string in bulk, returning all
1916    /// removed characters as an iterator.
1917    ///
1918    /// The returned iterator keeps a mutable borrow on the string to optimize
1919    /// its implementation.
1920    ///
1921    /// # Panics
1922    ///
1923    /// Panics if the starting point or end point do not lie on a [`char`]
1924    /// boundary, or if they're out of bounds.
1925    ///
1926    /// # Leaking
1927    ///
1928    /// If the returned iterator goes out of scope without being dropped (due to
1929    /// [`core::mem::forget`], for example), the string may still contain a copy
1930    /// of any drained characters, or may have lost characters arbitrarily,
1931    /// including characters outside the range.
1932    ///
1933    /// # Examples
1934    ///
1935    /// ```
1936    /// let mut s = String::from("Ξ± is alpha, Ξ² is beta");
1937    /// let beta_offset = s.find('Ξ²').unwrap_or(s.len());
1938    ///
1939    /// // Remove the range up until the Ξ² from the string
1940    /// let t: String = s.drain(..beta_offset).collect();
1941    /// assert_eq!(t, "Ξ± is alpha, ");
1942    /// assert_eq!(s, "Ξ² is beta");
1943    ///
1944    /// // A full range clears the string, like `clear()` does
1945    /// s.drain(..);
1946    /// assert_eq!(s, "");
1947    /// ```
1948    #[stable(feature = "drain", since = "1.6.0")]
1949    pub fn drain<R>(&mut self, range: R) -> Drain<'_>
1950    where
1951        R: RangeBounds<usize>,
1952    {
1953        // Memory safety
1954        //
1955        // The String version of Drain does not have the memory safety issues
1956        // of the vector version. The data is just plain bytes.
1957        // Because the range removal happens in Drop, if the Drain iterator is leaked,
1958        // the removal will not happen.
1959        let Range { start, end } = slice::range(range, ..self.len());
1960        assert!(self.is_char_boundary(start));
1961        assert!(self.is_char_boundary(end));
1962
1963        // Take out two simultaneous borrows. The &mut String won't be accessed
1964        // until iteration is over, in Drop.
1965        let self_ptr = self as *mut _;
1966        // SAFETY: `slice::range` and `is_char_boundary` do the appropriate bounds checks.
1967        let chars_iter = unsafe { self.get_unchecked(start..end) }.chars();
1968
1969        Drain { start, end, iter: chars_iter, string: self_ptr }
1970    }
1971
1972    /// Converts a `String` into an iterator over the [`char`]s of the string.
1973    ///
1974    /// As a string consists of valid UTF-8, we can iterate through a string
1975    /// by [`char`]. This method returns such an iterator.
1976    ///
1977    /// It's important to remember that [`char`] represents a Unicode Scalar
1978    /// Value, and might not match your idea of what a 'character' is. Iteration
1979    /// over grapheme clusters may be what you actually want. That functionality
1980    /// is not provided by Rust's standard library, check crates.io instead.
1981    ///
1982    /// # Examples
1983    ///
1984    /// Basic usage:
1985    ///
1986    /// ```
1987    /// #![feature(string_into_chars)]
1988    ///
1989    /// let word = String::from("goodbye");
1990    ///
1991    /// let mut chars = word.into_chars();
1992    ///
1993    /// assert_eq!(Some('g'), chars.next());
1994    /// assert_eq!(Some('o'), chars.next());
1995    /// assert_eq!(Some('o'), chars.next());
1996    /// assert_eq!(Some('d'), chars.next());
1997    /// assert_eq!(Some('b'), chars.next());
1998    /// assert_eq!(Some('y'), chars.next());
1999    /// assert_eq!(Some('e'), chars.next());
2000    ///
2001    /// assert_eq!(None, chars.next());
2002    /// ```
2003    ///
2004    /// Remember, [`char`]s might not match your intuition about characters:
2005    ///
2006    /// ```
2007    /// #![feature(string_into_chars)]
2008    ///
2009    /// let y = String::from("y̆");
2010    ///
2011    /// let mut chars = y.into_chars();
2012    ///
2013    /// assert_eq!(Some('y'), chars.next()); // not 'y̆'
2014    /// assert_eq!(Some('\u{0306}'), chars.next());
2015    ///
2016    /// assert_eq!(None, chars.next());
2017    /// ```
2018    ///
2019    /// [`char`]: prim@char
2020    #[inline]
2021    #[must_use = "`self` will be dropped if the result is not used"]
2022    #[unstable(feature = "string_into_chars", issue = "133125")]
2023    pub fn into_chars(self) -> IntoChars {
2024        IntoChars { bytes: self.into_bytes().into_iter() }
2025    }
2026
2027    /// Removes the specified range in the string,
2028    /// and replaces it with the given string.
2029    /// The given string doesn't need to be the same length as the range.
2030    ///
2031    /// # Panics
2032    ///
2033    /// Panics if the starting point or end point do not lie on a [`char`]
2034    /// boundary, or if they're out of bounds.
2035    ///
2036    /// # Examples
2037    ///
2038    /// ```
2039    /// let mut s = String::from("Ξ± is alpha, Ξ² is beta");
2040    /// let beta_offset = s.find('Ξ²').unwrap_or(s.len());
2041    ///
2042    /// // Replace the range up until the Ξ² from the string
2043    /// s.replace_range(..beta_offset, "Ξ‘ is capital alpha; ");
2044    /// assert_eq!(s, "Ξ‘ is capital alpha; Ξ² is beta");
2045    /// ```
2046    #[cfg(not(no_global_oom_handling))]
2047    #[stable(feature = "splice", since = "1.27.0")]
2048    pub fn replace_range<R>(&mut self, range: R, replace_with: &str)
2049    where
2050        R: RangeBounds<usize>,
2051    {
2052        // Memory safety
2053        //
2054        // Replace_range does not have the memory safety issues of a vector Splice.
2055        // of the vector version. The data is just plain bytes.
2056
2057        // WARNING: Inlining this variable would be unsound (#81138)
2058        let start = range.start_bound();
2059        match start {
2060            Included(&n) => assert!(self.is_char_boundary(n)),
2061            Excluded(&n) => assert!(self.is_char_boundary(n + 1)),
2062            Unbounded => {}
2063        };
2064        // WARNING: Inlining this variable would be unsound (#81138)
2065        let end = range.end_bound();
2066        match end {
2067            Included(&n) => assert!(self.is_char_boundary(n + 1)),
2068            Excluded(&n) => assert!(self.is_char_boundary(n)),
2069            Unbounded => {}
2070        };
2071
2072        // Using `range` again would be unsound (#81138)
2073        // We assume the bounds reported by `range` remain the same, but
2074        // an adversarial implementation could change between calls
2075        unsafe { self.as_mut_vec() }.splice((start, end), replace_with.bytes());
2076    }
2077
2078    /// Converts this `String` into a <code>[Box]<[str]></code>.
2079    ///
2080    /// Before doing the conversion, this method discards excess capacity like [`shrink_to_fit`].
2081    /// Note that this call may reallocate and copy the bytes of the string.
2082    ///
2083    /// [`shrink_to_fit`]: String::shrink_to_fit
2084    /// [str]: prim@str "str"
2085    ///
2086    /// # Examples
2087    ///
2088    /// ```
2089    /// let s = String::from("hello");
2090    ///
2091    /// let b = s.into_boxed_str();
2092    /// ```
2093    #[cfg(not(no_global_oom_handling))]
2094    #[stable(feature = "box_str", since = "1.4.0")]
2095    #[must_use = "`self` will be dropped if the result is not used"]
2096    #[inline]
2097    pub fn into_boxed_str(self) -> Box<str> {
2098        let slice = self.vec.into_boxed_slice();
2099        unsafe { from_boxed_utf8_unchecked(slice) }
2100    }
2101
2102    /// Consumes and leaks the `String`, returning a mutable reference to the contents,
2103    /// `&'a mut str`.
2104    ///
2105    /// The caller has free choice over the returned lifetime, including `'static`. Indeed,
2106    /// this function is ideally used for data that lives for the remainder of the program's life,
2107    /// as dropping the returned reference will cause a memory leak.
2108    ///
2109    /// It does not reallocate or shrink the `String`, so the leaked allocation may include unused
2110    /// capacity that is not part of the returned slice. If you want to discard excess capacity,
2111    /// call [`into_boxed_str`], and then [`Box::leak`] instead. However, keep in mind that
2112    /// trimming the capacity may result in a reallocation and copy.
2113    ///
2114    /// [`into_boxed_str`]: Self::into_boxed_str
2115    ///
2116    /// # Examples
2117    ///
2118    /// ```
2119    /// let x = String::from("bucket");
2120    /// let static_ref: &'static mut str = x.leak();
2121    /// assert_eq!(static_ref, "bucket");
2122    /// # // FIXME(https://github.com/rust-lang/miri/issues/3670):
2123    /// # // use -Zmiri-disable-leak-check instead of unleaking in tests meant to leak.
2124    /// # drop(unsafe { Box::from_raw(static_ref) });
2125    /// ```
2126    #[stable(feature = "string_leak", since = "1.72.0")]
2127    #[inline]
2128    pub fn leak<'a>(self) -> &'a mut str {
2129        let slice = self.vec.leak();
2130        unsafe { from_utf8_unchecked_mut(slice) }
2131    }
2132}
2133
2134impl FromUtf8Error {
2135    /// Returns a slice of [`u8`]s bytes that were attempted to convert to a `String`.
2136    ///
2137    /// # Examples
2138    ///
2139    /// ```
2140    /// // some invalid bytes, in a vector
2141    /// let bytes = vec![0, 159];
2142    ///
2143    /// let value = String::from_utf8(bytes);
2144    ///
2145    /// assert_eq!(&[0, 159], value.unwrap_err().as_bytes());
2146    /// ```
2147    #[must_use]
2148    #[stable(feature = "from_utf8_error_as_bytes", since = "1.26.0")]
2149    pub fn as_bytes(&self) -> &[u8] {
2150        &self.bytes[..]
2151    }
2152
2153    /// Converts the bytes into a `String` lossily, substituting invalid UTF-8
2154    /// sequences with replacement characters.
2155    ///
2156    /// See [`String::from_utf8_lossy`] for more details on replacement of
2157    /// invalid sequences, and [`String::from_utf8_lossy_owned`] for the
2158    /// `String` function which corresponds to this function.
2159    ///
2160    /// # Examples
2161    ///
2162    /// ```
2163    /// #![feature(string_from_utf8_lossy_owned)]
2164    /// // some invalid bytes
2165    /// let input: Vec<u8> = b"Hello \xF0\x90\x80World".into();
2166    /// let output = String::from_utf8(input).unwrap_or_else(|e| e.into_utf8_lossy());
2167    ///
2168    /// assert_eq!(String::from("Hello οΏ½World"), output);
2169    /// ```
2170    #[must_use]
2171    #[cfg(not(no_global_oom_handling))]
2172    #[unstable(feature = "string_from_utf8_lossy_owned", issue = "129436")]
2173    pub fn into_utf8_lossy(self) -> String {
2174        const REPLACEMENT: &str = "\u{FFFD}";
2175
2176        let mut res = {
2177            let mut v = Vec::with_capacity(self.bytes.len());
2178
2179            // `Utf8Error::valid_up_to` returns the maximum index of validated
2180            // UTF-8 bytes. Copy the valid bytes into the output buffer.
2181            v.extend_from_slice(&self.bytes[..self.error.valid_up_to()]);
2182
2183            // SAFETY: This is safe because the only bytes present in the buffer
2184            // were validated as UTF-8 by the call to `String::from_utf8` which
2185            // produced this `FromUtf8Error`.
2186            unsafe { String::from_utf8_unchecked(v) }
2187        };
2188
2189        let iter = self.bytes[self.error.valid_up_to()..].utf8_chunks();
2190
2191        for chunk in iter {
2192            res.push_str(chunk.valid());
2193            if !chunk.invalid().is_empty() {
2194                res.push_str(REPLACEMENT);
2195            }
2196        }
2197
2198        res
2199    }
2200
2201    /// Returns the bytes that were attempted to convert to a `String`.
2202    ///
2203    /// This method is carefully constructed to avoid allocation. It will
2204    /// consume the error, moving out the bytes, so that a copy of the bytes
2205    /// does not need to be made.
2206    ///
2207    /// # Examples
2208    ///
2209    /// ```
2210    /// // some invalid bytes, in a vector
2211    /// let bytes = vec![0, 159];
2212    ///
2213    /// let value = String::from_utf8(bytes);
2214    ///
2215    /// assert_eq!(vec![0, 159], value.unwrap_err().into_bytes());
2216    /// ```
2217    #[must_use = "`self` will be dropped if the result is not used"]
2218    #[stable(feature = "rust1", since = "1.0.0")]
2219    pub fn into_bytes(self) -> Vec<u8> {
2220        self.bytes
2221    }
2222
2223    /// Fetch a `Utf8Error` to get more details about the conversion failure.
2224    ///
2225    /// The [`Utf8Error`] type provided by [`std::str`] represents an error that may
2226    /// occur when converting a slice of [`u8`]s to a [`&str`]. In this sense, it's
2227    /// an analogue to `FromUtf8Error`. See its documentation for more details
2228    /// on using it.
2229    ///
2230    /// [`std::str`]: core::str "std::str"
2231    /// [`&str`]: prim@str "&str"
2232    ///
2233    /// # Examples
2234    ///
2235    /// ```
2236    /// // some invalid bytes, in a vector
2237    /// let bytes = vec![0, 159];
2238    ///
2239    /// let error = String::from_utf8(bytes).unwrap_err().utf8_error();
2240    ///
2241    /// // the first byte is invalid here
2242    /// assert_eq!(1, error.valid_up_to());
2243    /// ```
2244    #[must_use]
2245    #[stable(feature = "rust1", since = "1.0.0")]
2246    pub fn utf8_error(&self) -> Utf8Error {
2247        self.error
2248    }
2249}
2250
2251#[stable(feature = "rust1", since = "1.0.0")]
2252impl fmt::Display for FromUtf8Error {
2253    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2254        fmt::Display::fmt(&self.error, f)
2255    }
2256}
2257
2258#[stable(feature = "rust1", since = "1.0.0")]
2259impl fmt::Display for FromUtf16Error {
2260    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2261        fmt::Display::fmt("invalid utf-16: lone surrogate found", f)
2262    }
2263}
2264
2265#[stable(feature = "rust1", since = "1.0.0")]
2266impl Error for FromUtf8Error {
2267    #[allow(deprecated)]
2268    fn description(&self) -> &str {
2269        "invalid utf-8"
2270    }
2271}
2272
2273#[stable(feature = "rust1", since = "1.0.0")]
2274impl Error for FromUtf16Error {
2275    #[allow(deprecated)]
2276    fn description(&self) -> &str {
2277        "invalid utf-16"
2278    }
2279}
2280
2281#[cfg(not(no_global_oom_handling))]
2282#[stable(feature = "rust1", since = "1.0.0")]
2283impl Clone for String {
2284    fn clone(&self) -> Self {
2285        String { vec: self.vec.clone() }
2286    }
2287
2288    /// Clones the contents of `source` into `self`.
2289    ///
2290    /// This method is preferred over simply assigning `source.clone()` to `self`,
2291    /// as it avoids reallocation if possible.
2292    fn clone_from(&mut self, source: &Self) {
2293        self.vec.clone_from(&source.vec);
2294    }
2295}
2296
2297#[cfg(not(no_global_oom_handling))]
2298#[stable(feature = "rust1", since = "1.0.0")]
2299impl FromIterator<char> for String {
2300    fn from_iter<I: IntoIterator<Item = char>>(iter: I) -> String {
2301        let mut buf = String::new();
2302        buf.extend(iter);
2303        buf
2304    }
2305}
2306
2307#[cfg(not(no_global_oom_handling))]
2308#[stable(feature = "string_from_iter_by_ref", since = "1.17.0")]
2309impl<'a> FromIterator<&'a char> for String {
2310    fn from_iter<I: IntoIterator<Item = &'a char>>(iter: I) -> String {
2311        let mut buf = String::new();
2312        buf.extend(iter);
2313        buf
2314    }
2315}
2316
2317#[cfg(not(no_global_oom_handling))]
2318#[stable(feature = "rust1", since = "1.0.0")]
2319impl<'a> FromIterator<&'a str> for String {
2320    fn from_iter<I: IntoIterator<Item = &'a str>>(iter: I) -> String {
2321        let mut buf = String::new();
2322        buf.extend(iter);
2323        buf
2324    }
2325}
2326
2327#[cfg(not(no_global_oom_handling))]
2328#[stable(feature = "extend_string", since = "1.4.0")]
2329impl FromIterator<String> for String {
2330    fn from_iter<I: IntoIterator<Item = String>>(iter: I) -> String {
2331        let mut iterator = iter.into_iter();
2332
2333        // Because we're iterating over `String`s, we can avoid at least
2334        // one allocation by getting the first string from the iterator
2335        // and appending to it all the subsequent strings.
2336        match iterator.next() {
2337            None => String::new(),
2338            Some(mut buf) => {
2339                buf.extend(iterator);
2340                buf
2341            }
2342        }
2343    }
2344}
2345
2346#[cfg(not(no_global_oom_handling))]
2347#[stable(feature = "box_str2", since = "1.45.0")]
2348impl<A: Allocator> FromIterator<Box<str, A>> for String {
2349    fn from_iter<I: IntoIterator<Item = Box<str, A>>>(iter: I) -> String {
2350        let mut buf = String::new();
2351        buf.extend(iter);
2352        buf
2353    }
2354}
2355
2356#[cfg(not(no_global_oom_handling))]
2357#[stable(feature = "herd_cows", since = "1.19.0")]
2358impl<'a> FromIterator<Cow<'a, str>> for String {
2359    fn from_iter<I: IntoIterator<Item = Cow<'a, str>>>(iter: I) -> String {
2360        let mut iterator = iter.into_iter();
2361
2362        // Because we're iterating over CoWs, we can (potentially) avoid at least
2363        // one allocation by getting the first item and appending to it all the
2364        // subsequent items.
2365        match iterator.next() {
2366            None => String::new(),
2367            Some(cow) => {
2368                let mut buf = cow.into_owned();
2369                buf.extend(iterator);
2370                buf
2371            }
2372        }
2373    }
2374}
2375
2376#[cfg(not(no_global_oom_handling))]
2377#[stable(feature = "rust1", since = "1.0.0")]
2378impl Extend<char> for String {
2379    fn extend<I: IntoIterator<Item = char>>(&mut self, iter: I) {
2380        let iterator = iter.into_iter();
2381        let (lower_bound, _) = iterator.size_hint();
2382        self.reserve(lower_bound);
2383        iterator.for_each(move |c| self.push(c));
2384    }
2385
2386    #[inline]
2387    fn extend_one(&mut self, c: char) {
2388        self.push(c);
2389    }
2390
2391    #[inline]
2392    fn extend_reserve(&mut self, additional: usize) {
2393        self.reserve(additional);
2394    }
2395}
2396
2397#[cfg(not(no_global_oom_handling))]
2398#[stable(feature = "extend_ref", since = "1.2.0")]
2399impl<'a> Extend<&'a char> for String {
2400    fn extend<I: IntoIterator<Item = &'a char>>(&mut self, iter: I) {
2401        self.extend(iter.into_iter().cloned());
2402    }
2403
2404    #[inline]
2405    fn extend_one(&mut self, &c: &'a char) {
2406        self.push(c);
2407    }
2408
2409    #[inline]
2410    fn extend_reserve(&mut self, additional: usize) {
2411        self.reserve(additional);
2412    }
2413}
2414
2415#[cfg(not(no_global_oom_handling))]
2416#[stable(feature = "rust1", since = "1.0.0")]
2417impl<'a> Extend<&'a str> for String {
2418    fn extend<I: IntoIterator<Item = &'a str>>(&mut self, iter: I) {
2419        iter.into_iter().for_each(move |s| self.push_str(s));
2420    }
2421
2422    #[inline]
2423    fn extend_one(&mut self, s: &'a str) {
2424        self.push_str(s);
2425    }
2426}
2427
2428#[cfg(not(no_global_oom_handling))]
2429#[stable(feature = "box_str2", since = "1.45.0")]
2430impl<A: Allocator> Extend<Box<str, A>> for String {
2431    fn extend<I: IntoIterator<Item = Box<str, A>>>(&mut self, iter: I) {
2432        iter.into_iter().for_each(move |s| self.push_str(&s));
2433    }
2434}
2435
2436#[cfg(not(no_global_oom_handling))]
2437#[stable(feature = "extend_string", since = "1.4.0")]
2438impl Extend<String> for String {
2439    fn extend<I: IntoIterator<Item = String>>(&mut self, iter: I) {
2440        iter.into_iter().for_each(move |s| self.push_str(&s));
2441    }
2442
2443    #[inline]
2444    fn extend_one(&mut self, s: String) {
2445        self.push_str(&s);
2446    }
2447}
2448
2449#[cfg(not(no_global_oom_handling))]
2450#[stable(feature = "herd_cows", since = "1.19.0")]
2451impl<'a> Extend<Cow<'a, str>> for String {
2452    fn extend<I: IntoIterator<Item = Cow<'a, str>>>(&mut self, iter: I) {
2453        iter.into_iter().for_each(move |s| self.push_str(&s));
2454    }
2455
2456    #[inline]
2457    fn extend_one(&mut self, s: Cow<'a, str>) {
2458        self.push_str(&s);
2459    }
2460}
2461
2462#[cfg(not(no_global_oom_handling))]
2463#[unstable(feature = "ascii_char", issue = "110998")]
2464impl Extend<core::ascii::Char> for String {
2465    fn extend<I: IntoIterator<Item = core::ascii::Char>>(&mut self, iter: I) {
2466        self.vec.extend(iter.into_iter().map(|c| c.to_u8()));
2467    }
2468
2469    #[inline]
2470    fn extend_one(&mut self, c: core::ascii::Char) {
2471        self.vec.push(c.to_u8());
2472    }
2473}
2474
2475#[cfg(not(no_global_oom_handling))]
2476#[unstable(feature = "ascii_char", issue = "110998")]
2477impl<'a> Extend<&'a core::ascii::Char> for String {
2478    fn extend<I: IntoIterator<Item = &'a core::ascii::Char>>(&mut self, iter: I) {
2479        self.extend(iter.into_iter().cloned());
2480    }
2481
2482    #[inline]
2483    fn extend_one(&mut self, c: &'a core::ascii::Char) {
2484        self.vec.push(c.to_u8());
2485    }
2486}
2487
2488/// A convenience impl that delegates to the impl for `&str`.
2489///
2490/// # Examples
2491///
2492/// ```
2493/// assert_eq!(String::from("Hello world").find("world"), Some(6));
2494/// ```
2495#[unstable(
2496    feature = "pattern",
2497    reason = "API not fully fleshed out and ready to be stabilized",
2498    issue = "27721"
2499)]
2500impl<'b> Pattern for &'b String {
2501    type Searcher<'a> = <&'b str as Pattern>::Searcher<'a>;
2502
2503    fn into_searcher(self, haystack: &str) -> <&'b str as Pattern>::Searcher<'_> {
2504        self[..].into_searcher(haystack)
2505    }
2506
2507    #[inline]
2508    fn is_contained_in(self, haystack: &str) -> bool {
2509        self[..].is_contained_in(haystack)
2510    }
2511
2512    #[inline]
2513    fn is_prefix_of(self, haystack: &str) -> bool {
2514        self[..].is_prefix_of(haystack)
2515    }
2516
2517    #[inline]
2518    fn strip_prefix_of(self, haystack: &str) -> Option<&str> {
2519        self[..].strip_prefix_of(haystack)
2520    }
2521
2522    #[inline]
2523    fn is_suffix_of<'a>(self, haystack: &'a str) -> bool
2524    where
2525        Self::Searcher<'a>: core::str::pattern::ReverseSearcher<'a>,
2526    {
2527        self[..].is_suffix_of(haystack)
2528    }
2529
2530    #[inline]
2531    fn strip_suffix_of<'a>(self, haystack: &'a str) -> Option<&'a str>
2532    where
2533        Self::Searcher<'a>: core::str::pattern::ReverseSearcher<'a>,
2534    {
2535        self[..].strip_suffix_of(haystack)
2536    }
2537
2538    #[inline]
2539    fn as_utf8_pattern(&self) -> Option<Utf8Pattern<'_>> {
2540        Some(Utf8Pattern::StringPattern(self.as_bytes()))
2541    }
2542}
2543
2544macro_rules! impl_eq {
2545    ($lhs:ty, $rhs: ty) => {
2546        #[stable(feature = "rust1", since = "1.0.0")]
2547        #[allow(unused_lifetimes)]
2548        impl<'a, 'b> PartialEq<$rhs> for $lhs {
2549            #[inline]
2550            fn eq(&self, other: &$rhs) -> bool {
2551                PartialEq::eq(&self[..], &other[..])
2552            }
2553            #[inline]
2554            fn ne(&self, other: &$rhs) -> bool {
2555                PartialEq::ne(&self[..], &other[..])
2556            }
2557        }
2558
2559        #[stable(feature = "rust1", since = "1.0.0")]
2560        #[allow(unused_lifetimes)]
2561        impl<'a, 'b> PartialEq<$lhs> for $rhs {
2562            #[inline]
2563            fn eq(&self, other: &$lhs) -> bool {
2564                PartialEq::eq(&self[..], &other[..])
2565            }
2566            #[inline]
2567            fn ne(&self, other: &$lhs) -> bool {
2568                PartialEq::ne(&self[..], &other[..])
2569            }
2570        }
2571    };
2572}
2573
2574impl_eq! { String, str }
2575impl_eq! { String, &'a str }
2576#[cfg(not(no_global_oom_handling))]
2577impl_eq! { Cow<'a, str>, str }
2578#[cfg(not(no_global_oom_handling))]
2579impl_eq! { Cow<'a, str>, &'b str }
2580#[cfg(not(no_global_oom_handling))]
2581impl_eq! { Cow<'a, str>, String }
2582
2583#[stable(feature = "rust1", since = "1.0.0")]
2584impl Default for String {
2585    /// Creates an empty `String`.
2586    #[inline]
2587    fn default() -> String {
2588        String::new()
2589    }
2590}
2591
2592#[stable(feature = "rust1", since = "1.0.0")]
2593impl fmt::Display for String {
2594    #[inline]
2595    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2596        fmt::Display::fmt(&**self, f)
2597    }
2598}
2599
2600#[stable(feature = "rust1", since = "1.0.0")]
2601impl fmt::Debug for String {
2602    #[inline]
2603    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2604        fmt::Debug::fmt(&**self, f)
2605    }
2606}
2607
2608#[stable(feature = "rust1", since = "1.0.0")]
2609impl hash::Hash for String {
2610    #[inline]
2611    fn hash<H: hash::Hasher>(&self, hasher: &mut H) {
2612        (**self).hash(hasher)
2613    }
2614}
2615
2616/// Implements the `+` operator for concatenating two strings.
2617///
2618/// This consumes the `String` on the left-hand side and re-uses its buffer (growing it if
2619/// necessary). This is done to avoid allocating a new `String` and copying the entire contents on
2620/// every operation, which would lead to *O*(*n*^2) running time when building an *n*-byte string by
2621/// repeated concatenation.
2622///
2623/// The string on the right-hand side is only borrowed; its contents are copied into the returned
2624/// `String`.
2625///
2626/// # Examples
2627///
2628/// Concatenating two `String`s takes the first by value and borrows the second:
2629///
2630/// ```
2631/// let a = String::from("hello");
2632/// let b = String::from(" world");
2633/// let c = a + &b;
2634/// // `a` is moved and can no longer be used here.
2635/// ```
2636///
2637/// If you want to keep using the first `String`, you can clone it and append to the clone instead:
2638///
2639/// ```
2640/// let a = String::from("hello");
2641/// let b = String::from(" world");
2642/// let c = a.clone() + &b;
2643/// // `a` is still valid here.
2644/// ```
2645///
2646/// Concatenating `&str` slices can be done by converting the first to a `String`:
2647///
2648/// ```
2649/// let a = "hello";
2650/// let b = " world";
2651/// let c = a.to_string() + b;
2652/// ```
2653#[cfg(not(no_global_oom_handling))]
2654#[stable(feature = "rust1", since = "1.0.0")]
2655impl Add<&str> for String {
2656    type Output = String;
2657
2658    #[inline]
2659    fn add(mut self, other: &str) -> String {
2660        self.push_str(other);
2661        self
2662    }
2663}
2664
2665/// Implements the `+=` operator for appending to a `String`.
2666///
2667/// This has the same behavior as the [`push_str`][String::push_str] method.
2668#[cfg(not(no_global_oom_handling))]
2669#[stable(feature = "stringaddassign", since = "1.12.0")]
2670impl AddAssign<&str> for String {
2671    #[inline]
2672    fn add_assign(&mut self, other: &str) {
2673        self.push_str(other);
2674    }
2675}
2676
2677#[stable(feature = "rust1", since = "1.0.0")]
2678impl<I> ops::Index<I> for String
2679where
2680    I: slice::SliceIndex<str>,
2681{
2682    type Output = I::Output;
2683
2684    #[inline]
2685    fn index(&self, index: I) -> &I::Output {
2686        index.index(self.as_str())
2687    }
2688}
2689
2690#[stable(feature = "rust1", since = "1.0.0")]
2691impl<I> ops::IndexMut<I> for String
2692where
2693    I: slice::SliceIndex<str>,
2694{
2695    #[inline]
2696    fn index_mut(&mut self, index: I) -> &mut I::Output {
2697        index.index_mut(self.as_mut_str())
2698    }
2699}
2700
2701#[stable(feature = "rust1", since = "1.0.0")]
2702impl ops::Deref for String {
2703    type Target = str;
2704
2705    #[inline]
2706    fn deref(&self) -> &str {
2707        self.as_str()
2708    }
2709}
2710
2711#[unstable(feature = "deref_pure_trait", issue = "87121")]
2712unsafe impl ops::DerefPure for String {}
2713
2714#[stable(feature = "derefmut_for_string", since = "1.3.0")]
2715impl ops::DerefMut for String {
2716    #[inline]
2717    fn deref_mut(&mut self) -> &mut str {
2718        self.as_mut_str()
2719    }
2720}
2721
2722/// A type alias for [`Infallible`].
2723///
2724/// This alias exists for backwards compatibility, and may be eventually deprecated.
2725///
2726/// [`Infallible`]: core::convert::Infallible "convert::Infallible"
2727#[stable(feature = "str_parse_error", since = "1.5.0")]
2728pub type ParseError = core::convert::Infallible;
2729
2730#[cfg(not(no_global_oom_handling))]
2731#[stable(feature = "rust1", since = "1.0.0")]
2732impl FromStr for String {
2733    type Err = core::convert::Infallible;
2734    #[inline]
2735    fn from_str(s: &str) -> Result<String, Self::Err> {
2736        Ok(String::from(s))
2737    }
2738}
2739
2740/// A trait for converting a value to a `String`.
2741///
2742/// This trait is automatically implemented for any type which implements the
2743/// [`Display`] trait. As such, `ToString` shouldn't be implemented directly:
2744/// [`Display`] should be implemented instead, and you get the `ToString`
2745/// implementation for free.
2746///
2747/// [`Display`]: fmt::Display
2748#[rustc_diagnostic_item = "ToString"]
2749#[stable(feature = "rust1", since = "1.0.0")]
2750pub trait ToString {
2751    /// Converts the given value to a `String`.
2752    ///
2753    /// # Examples
2754    ///
2755    /// ```
2756    /// let i = 5;
2757    /// let five = String::from("5");
2758    ///
2759    /// assert_eq!(five, i.to_string());
2760    /// ```
2761    #[rustc_conversion_suggestion]
2762    #[stable(feature = "rust1", since = "1.0.0")]
2763    #[rustc_diagnostic_item = "to_string_method"]
2764    fn to_string(&self) -> String;
2765}
2766
2767/// # Panics
2768///
2769/// In this implementation, the `to_string` method panics
2770/// if the `Display` implementation returns an error.
2771/// This indicates an incorrect `Display` implementation
2772/// since `fmt::Write for String` never returns an error itself.
2773#[cfg(not(no_global_oom_handling))]
2774#[stable(feature = "rust1", since = "1.0.0")]
2775impl<T: fmt::Display + ?Sized> ToString for T {
2776    #[inline]
2777    fn to_string(&self) -> String {
2778        <Self as SpecToString>::spec_to_string(self)
2779    }
2780}
2781
2782#[cfg(not(no_global_oom_handling))]
2783trait SpecToString {
2784    fn spec_to_string(&self) -> String;
2785}
2786
2787#[cfg(not(no_global_oom_handling))]
2788impl<T: fmt::Display + ?Sized> SpecToString for T {
2789    // A common guideline is to not inline generic functions. However,
2790    // removing `#[inline]` from this method causes non-negligible regressions.
2791    // See <https://github.com/rust-lang/rust/pull/74852>, the last attempt
2792    // to try to remove it.
2793    #[inline]
2794    default fn spec_to_string(&self) -> String {
2795        let mut buf = String::new();
2796        let mut formatter =
2797            core::fmt::Formatter::new(&mut buf, core::fmt::FormattingOptions::new());
2798        // Bypass format_args!() to avoid write_str with zero-length strs
2799        fmt::Display::fmt(self, &mut formatter)
2800            .expect("a Display implementation returned an error unexpectedly");
2801        buf
2802    }
2803}
2804
2805#[cfg(not(no_global_oom_handling))]
2806impl SpecToString for core::ascii::Char {
2807    #[inline]
2808    fn spec_to_string(&self) -> String {
2809        self.as_str().to_owned()
2810    }
2811}
2812
2813#[cfg(not(no_global_oom_handling))]
2814impl SpecToString for char {
2815    #[inline]
2816    fn spec_to_string(&self) -> String {
2817        String::from(self.encode_utf8(&mut [0; char::MAX_LEN_UTF8]))
2818    }
2819}
2820
2821#[cfg(not(no_global_oom_handling))]
2822impl SpecToString for bool {
2823    #[inline]
2824    fn spec_to_string(&self) -> String {
2825        String::from(if *self { "true" } else { "false" })
2826    }
2827}
2828
2829#[cfg(not(no_global_oom_handling))]
2830impl SpecToString for u8 {
2831    #[inline]
2832    fn spec_to_string(&self) -> String {
2833        let mut buf = String::with_capacity(3);
2834        let mut n = *self;
2835        if n >= 10 {
2836            if n >= 100 {
2837                buf.push((b'0' + n / 100) as char);
2838                n %= 100;
2839            }
2840            buf.push((b'0' + n / 10) as char);
2841            n %= 10;
2842        }
2843        buf.push((b'0' + n) as char);
2844        buf
2845    }
2846}
2847
2848#[cfg(not(no_global_oom_handling))]
2849impl SpecToString for i8 {
2850    #[inline]
2851    fn spec_to_string(&self) -> String {
2852        let mut buf = String::with_capacity(4);
2853        if self.is_negative() {
2854            buf.push('-');
2855        }
2856        let mut n = self.unsigned_abs();
2857        if n >= 10 {
2858            if n >= 100 {
2859                buf.push('1');
2860                n -= 100;
2861            }
2862            buf.push((b'0' + n / 10) as char);
2863            n %= 10;
2864        }
2865        buf.push((b'0' + n) as char);
2866        buf
2867    }
2868}
2869
2870// Generic/generated code can sometimes have multiple, nested references
2871// for strings, including `&&&str`s that would never be written
2872// by hand. This macro generates twelve layers of nested `&`-impl
2873// for primitive strings.
2874#[cfg(not(no_global_oom_handling))]
2875macro_rules! to_string_str_wrap_in_ref {
2876    {x $($x:ident)*} => {
2877        &to_string_str_wrap_in_ref! { $($x)* }
2878    };
2879    {} => { str };
2880}
2881#[cfg(not(no_global_oom_handling))]
2882macro_rules! to_string_expr_wrap_in_deref {
2883    {$self:expr ; x $($x:ident)*} => {
2884        *(to_string_expr_wrap_in_deref! { $self ; $($x)* })
2885    };
2886    {$self:expr ;} => { $self };
2887}
2888#[cfg(not(no_global_oom_handling))]
2889macro_rules! to_string_str {
2890    {$($($x:ident)*),+} => {
2891        $(
2892            impl SpecToString for to_string_str_wrap_in_ref!($($x)*) {
2893                #[inline]
2894                fn spec_to_string(&self) -> String {
2895                    String::from(to_string_expr_wrap_in_deref!(self ; $($x)*))
2896                }
2897            }
2898        )+
2899    };
2900}
2901
2902#[cfg(not(no_global_oom_handling))]
2903to_string_str! {
2904    x x x x x x x x x x x x,
2905    x x x x x x x x x x x,
2906    x x x x x x x x x x,
2907    x x x x x x x x x,
2908    x x x x x x x x,
2909    x x x x x x x,
2910    x x x x x x,
2911    x x x x x,
2912    x x x x,
2913    x x x,
2914    x x,
2915    x,
2916}
2917
2918#[cfg(not(no_global_oom_handling))]
2919impl SpecToString for Cow<'_, str> {
2920    #[inline]
2921    fn spec_to_string(&self) -> String {
2922        self[..].to_owned()
2923    }
2924}
2925
2926#[cfg(not(no_global_oom_handling))]
2927impl SpecToString for String {
2928    #[inline]
2929    fn spec_to_string(&self) -> String {
2930        self.to_owned()
2931    }
2932}
2933
2934#[cfg(not(no_global_oom_handling))]
2935impl SpecToString for fmt::Arguments<'_> {
2936    #[inline]
2937    fn spec_to_string(&self) -> String {
2938        crate::fmt::format(*self)
2939    }
2940}
2941
2942#[stable(feature = "rust1", since = "1.0.0")]
2943impl AsRef<str> for String {
2944    #[inline]
2945    fn as_ref(&self) -> &str {
2946        self
2947    }
2948}
2949
2950#[stable(feature = "string_as_mut", since = "1.43.0")]
2951impl AsMut<str> for String {
2952    #[inline]
2953    fn as_mut(&mut self) -> &mut str {
2954        self
2955    }
2956}
2957
2958#[stable(feature = "rust1", since = "1.0.0")]
2959impl AsRef<[u8]> for String {
2960    #[inline]
2961    fn as_ref(&self) -> &[u8] {
2962        self.as_bytes()
2963    }
2964}
2965
2966#[cfg(not(no_global_oom_handling))]
2967#[stable(feature = "rust1", since = "1.0.0")]
2968impl From<&str> for String {
2969    /// Converts a `&str` into a [`String`].
2970    ///
2971    /// The result is allocated on the heap.
2972    #[inline]
2973    fn from(s: &str) -> String {
2974        s.to_owned()
2975    }
2976}
2977
2978#[cfg(not(no_global_oom_handling))]
2979#[stable(feature = "from_mut_str_for_string", since = "1.44.0")]
2980impl From<&mut str> for String {
2981    /// Converts a `&mut str` into a [`String`].
2982    ///
2983    /// The result is allocated on the heap.
2984    #[inline]
2985    fn from(s: &mut str) -> String {
2986        s.to_owned()
2987    }
2988}
2989
2990#[cfg(not(no_global_oom_handling))]
2991#[stable(feature = "from_ref_string", since = "1.35.0")]
2992impl From<&String> for String {
2993    /// Converts a `&String` into a [`String`].
2994    ///
2995    /// This clones `s` and returns the clone.
2996    #[inline]
2997    fn from(s: &String) -> String {
2998        s.clone()
2999    }
3000}
3001
3002// note: test pulls in std, which causes errors here
3003#[stable(feature = "string_from_box", since = "1.18.0")]
3004impl From<Box<str>> for String {
3005    /// Converts the given boxed `str` slice to a [`String`].
3006    /// It is notable that the `str` slice is owned.
3007    ///
3008    /// # Examples
3009    ///
3010    /// ```
3011    /// let s1: String = String::from("hello world");
3012    /// let s2: Box<str> = s1.into_boxed_str();
3013    /// let s3: String = String::from(s2);
3014    ///
3015    /// assert_eq!("hello world", s3)
3016    /// ```
3017    fn from(s: Box<str>) -> String {
3018        s.into_string()
3019    }
3020}
3021
3022#[cfg(not(no_global_oom_handling))]
3023#[stable(feature = "box_from_str", since = "1.20.0")]
3024impl From<String> for Box<str> {
3025    /// Converts the given [`String`] to a boxed `str` slice that is owned.
3026    ///
3027    /// # Examples
3028    ///
3029    /// ```
3030    /// let s1: String = String::from("hello world");
3031    /// let s2: Box<str> = Box::from(s1);
3032    /// let s3: String = String::from(s2);
3033    ///
3034    /// assert_eq!("hello world", s3)
3035    /// ```
3036    fn from(s: String) -> Box<str> {
3037        s.into_boxed_str()
3038    }
3039}
3040
3041#[cfg(not(no_global_oom_handling))]
3042#[stable(feature = "string_from_cow_str", since = "1.14.0")]
3043impl<'a> From<Cow<'a, str>> for String {
3044    /// Converts a clone-on-write string to an owned
3045    /// instance of [`String`].
3046    ///
3047    /// This extracts the owned string,
3048    /// clones the string if it is not already owned.
3049    ///
3050    /// # Example
3051    ///
3052    /// ```
3053    /// # use std::borrow::Cow;
3054    /// // If the string is not owned...
3055    /// let cow: Cow<'_, str> = Cow::Borrowed("eggplant");
3056    /// // It will allocate on the heap and copy the string.
3057    /// let owned: String = String::from(cow);
3058    /// assert_eq!(&owned[..], "eggplant");
3059    /// ```
3060    fn from(s: Cow<'a, str>) -> String {
3061        s.into_owned()
3062    }
3063}
3064
3065#[cfg(not(no_global_oom_handling))]
3066#[stable(feature = "rust1", since = "1.0.0")]
3067impl<'a> From<&'a str> for Cow<'a, str> {
3068    /// Converts a string slice into a [`Borrowed`] variant.
3069    /// No heap allocation is performed, and the string
3070    /// is not copied.
3071    ///
3072    /// # Example
3073    ///
3074    /// ```
3075    /// # use std::borrow::Cow;
3076    /// assert_eq!(Cow::from("eggplant"), Cow::Borrowed("eggplant"));
3077    /// ```
3078    ///
3079    /// [`Borrowed`]: crate::borrow::Cow::Borrowed "borrow::Cow::Borrowed"
3080    #[inline]
3081    fn from(s: &'a str) -> Cow<'a, str> {
3082        Cow::Borrowed(s)
3083    }
3084}
3085
3086#[cfg(not(no_global_oom_handling))]
3087#[stable(feature = "rust1", since = "1.0.0")]
3088impl<'a> From<String> for Cow<'a, str> {
3089    /// Converts a [`String`] into an [`Owned`] variant.
3090    /// No heap allocation is performed, and the string
3091    /// is not copied.
3092    ///
3093    /// # Example
3094    ///
3095    /// ```
3096    /// # use std::borrow::Cow;
3097    /// let s = "eggplant".to_string();
3098    /// let s2 = "eggplant".to_string();
3099    /// assert_eq!(Cow::from(s), Cow::<'static, str>::Owned(s2));
3100    /// ```
3101    ///
3102    /// [`Owned`]: crate::borrow::Cow::Owned "borrow::Cow::Owned"
3103    #[inline]
3104    fn from(s: String) -> Cow<'a, str> {
3105        Cow::Owned(s)
3106    }
3107}
3108
3109#[cfg(not(no_global_oom_handling))]
3110#[stable(feature = "cow_from_string_ref", since = "1.28.0")]
3111impl<'a> From<&'a String> for Cow<'a, str> {
3112    /// Converts a [`String`] reference into a [`Borrowed`] variant.
3113    /// No heap allocation is performed, and the string
3114    /// is not copied.
3115    ///
3116    /// # Example
3117    ///
3118    /// ```
3119    /// # use std::borrow::Cow;
3120    /// let s = "eggplant".to_string();
3121    /// assert_eq!(Cow::from(&s), Cow::Borrowed("eggplant"));
3122    /// ```
3123    ///
3124    /// [`Borrowed`]: crate::borrow::Cow::Borrowed "borrow::Cow::Borrowed"
3125    #[inline]
3126    fn from(s: &'a String) -> Cow<'a, str> {
3127        Cow::Borrowed(s.as_str())
3128    }
3129}
3130
3131#[cfg(not(no_global_oom_handling))]
3132#[stable(feature = "cow_str_from_iter", since = "1.12.0")]
3133impl<'a> FromIterator<char> for Cow<'a, str> {
3134    fn from_iter<I: IntoIterator<Item = char>>(it: I) -> Cow<'a, str> {
3135        Cow::Owned(FromIterator::from_iter(it))
3136    }
3137}
3138
3139#[cfg(not(no_global_oom_handling))]
3140#[stable(feature = "cow_str_from_iter", since = "1.12.0")]
3141impl<'a, 'b> FromIterator<&'b str> for Cow<'a, str> {
3142    fn from_iter<I: IntoIterator<Item = &'b str>>(it: I) -> Cow<'a, str> {
3143        Cow::Owned(FromIterator::from_iter(it))
3144    }
3145}
3146
3147#[cfg(not(no_global_oom_handling))]
3148#[stable(feature = "cow_str_from_iter", since = "1.12.0")]
3149impl<'a> FromIterator<String> for Cow<'a, str> {
3150    fn from_iter<I: IntoIterator<Item = String>>(it: I) -> Cow<'a, str> {
3151        Cow::Owned(FromIterator::from_iter(it))
3152    }
3153}
3154
3155#[stable(feature = "from_string_for_vec_u8", since = "1.14.0")]
3156impl From<String> for Vec<u8> {
3157    /// Converts the given [`String`] to a vector [`Vec`] that holds values of type [`u8`].
3158    ///
3159    /// # Examples
3160    ///
3161    /// ```
3162    /// let s1 = String::from("hello world");
3163    /// let v1 = Vec::from(s1);
3164    ///
3165    /// for b in v1 {
3166    ///     println!("{b}");
3167    /// }
3168    /// ```
3169    fn from(string: String) -> Vec<u8> {
3170        string.into_bytes()
3171    }
3172}
3173
3174#[stable(feature = "try_from_vec_u8_for_string", since = "1.87.0")]
3175impl TryFrom<Vec<u8>> for String {
3176    type Error = FromUtf8Error;
3177    /// Converts the given [`Vec<u8>`] into a  [`String`] if it contains valid UTF-8 data.
3178    ///
3179    /// # Examples
3180    ///
3181    /// ```
3182    /// let s1 = b"hello world".to_vec();
3183    /// let v1 = String::try_from(s1).unwrap();
3184    /// assert_eq!(v1, "hello world");
3185    ///
3186    /// ```
3187    fn try_from(bytes: Vec<u8>) -> Result<Self, Self::Error> {
3188        Self::from_utf8(bytes)
3189    }
3190}
3191
3192#[cfg(not(no_global_oom_handling))]
3193#[stable(feature = "rust1", since = "1.0.0")]
3194impl fmt::Write for String {
3195    #[inline]
3196    fn write_str(&mut self, s: &str) -> fmt::Result {
3197        self.push_str(s);
3198        Ok(())
3199    }
3200
3201    #[inline]
3202    fn write_char(&mut self, c: char) -> fmt::Result {
3203        self.push(c);
3204        Ok(())
3205    }
3206}
3207
3208/// An iterator over the [`char`]s of a string.
3209///
3210/// This struct is created by the [`into_chars`] method on [`String`].
3211/// See its documentation for more.
3212///
3213/// [`char`]: prim@char
3214/// [`into_chars`]: String::into_chars
3215#[cfg_attr(not(no_global_oom_handling), derive(Clone))]
3216#[must_use = "iterators are lazy and do nothing unless consumed"]
3217#[unstable(feature = "string_into_chars", issue = "133125")]
3218pub struct IntoChars {
3219    bytes: vec::IntoIter<u8>,
3220}
3221
3222#[unstable(feature = "string_into_chars", issue = "133125")]
3223impl fmt::Debug for IntoChars {
3224    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3225        f.debug_tuple("IntoChars").field(&self.as_str()).finish()
3226    }
3227}
3228
3229impl IntoChars {
3230    /// Views the underlying data as a subslice of the original data.
3231    ///
3232    /// # Examples
3233    ///
3234    /// ```
3235    /// #![feature(string_into_chars)]
3236    ///
3237    /// let mut chars = String::from("abc").into_chars();
3238    ///
3239    /// assert_eq!(chars.as_str(), "abc");
3240    /// chars.next();
3241    /// assert_eq!(chars.as_str(), "bc");
3242    /// chars.next();
3243    /// chars.next();
3244    /// assert_eq!(chars.as_str(), "");
3245    /// ```
3246    #[unstable(feature = "string_into_chars", issue = "133125")]
3247    #[must_use]
3248    #[inline]
3249    pub fn as_str(&self) -> &str {
3250        // SAFETY: `bytes` is a valid UTF-8 string.
3251        unsafe { str::from_utf8_unchecked(self.bytes.as_slice()) }
3252    }
3253
3254    /// Consumes the `IntoChars`, returning the remaining string.
3255    ///
3256    /// # Examples
3257    ///
3258    /// ```
3259    /// #![feature(string_into_chars)]
3260    ///
3261    /// let chars = String::from("abc").into_chars();
3262    /// assert_eq!(chars.into_string(), "abc");
3263    ///
3264    /// let mut chars = String::from("def").into_chars();
3265    /// chars.next();
3266    /// assert_eq!(chars.into_string(), "ef");
3267    /// ```
3268    #[cfg(not(no_global_oom_handling))]
3269    #[unstable(feature = "string_into_chars", issue = "133125")]
3270    #[inline]
3271    pub fn into_string(self) -> String {
3272        // Safety: `bytes` are kept in UTF-8 form, only removing whole `char`s at a time.
3273        unsafe { String::from_utf8_unchecked(self.bytes.collect()) }
3274    }
3275
3276    #[inline]
3277    fn iter(&self) -> CharIndices<'_> {
3278        self.as_str().char_indices()
3279    }
3280}
3281
3282#[unstable(feature = "string_into_chars", issue = "133125")]
3283impl Iterator for IntoChars {
3284    type Item = char;
3285
3286    #[inline]
3287    fn next(&mut self) -> Option<char> {
3288        let mut iter = self.iter();
3289        match iter.next() {
3290            None => None,
3291            Some((_, ch)) => {
3292                let offset = iter.offset();
3293                // `offset` is a valid index.
3294                let _ = self.bytes.advance_by(offset);
3295                Some(ch)
3296            }
3297        }
3298    }
3299
3300    #[inline]
3301    fn count(self) -> usize {
3302        self.iter().count()
3303    }
3304
3305    #[inline]
3306    fn size_hint(&self) -> (usize, Option<usize>) {
3307        self.iter().size_hint()
3308    }
3309
3310    #[inline]
3311    fn last(mut self) -> Option<char> {
3312        self.next_back()
3313    }
3314}
3315
3316#[unstable(feature = "string_into_chars", issue = "133125")]
3317impl DoubleEndedIterator for IntoChars {
3318    #[inline]
3319    fn next_back(&mut self) -> Option<char> {
3320        let len = self.as_str().len();
3321        let mut iter = self.iter();
3322        match iter.next_back() {
3323            None => None,
3324            Some((idx, ch)) => {
3325                // `idx` is a valid index.
3326                let _ = self.bytes.advance_back_by(len - idx);
3327                Some(ch)
3328            }
3329        }
3330    }
3331}
3332
3333#[unstable(feature = "string_into_chars", issue = "133125")]
3334impl FusedIterator for IntoChars {}
3335
3336/// A draining iterator for `String`.
3337///
3338/// This struct is created by the [`drain`] method on [`String`]. See its
3339/// documentation for more.
3340///
3341/// [`drain`]: String::drain
3342#[stable(feature = "drain", since = "1.6.0")]
3343pub struct Drain<'a> {
3344    /// Will be used as &'a mut String in the destructor
3345    string: *mut String,
3346    /// Start of part to remove
3347    start: usize,
3348    /// End of part to remove
3349    end: usize,
3350    /// Current remaining range to remove
3351    iter: Chars<'a>,
3352}
3353
3354#[stable(feature = "collection_debug", since = "1.17.0")]
3355impl fmt::Debug for Drain<'_> {
3356    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3357        f.debug_tuple("Drain").field(&self.as_str()).finish()
3358    }
3359}
3360
3361#[stable(feature = "drain", since = "1.6.0")]
3362unsafe impl Sync for Drain<'_> {}
3363#[stable(feature = "drain", since = "1.6.0")]
3364unsafe impl Send for Drain<'_> {}
3365
3366#[stable(feature = "drain", since = "1.6.0")]
3367impl Drop for Drain<'_> {
3368    fn drop(&mut self) {
3369        unsafe {
3370            // Use Vec::drain. "Reaffirm" the bounds checks to avoid
3371            // panic code being inserted again.
3372            let self_vec = (*self.string).as_mut_vec();
3373            if self.start <= self.end && self.end <= self_vec.len() {
3374                self_vec.drain(self.start..self.end);
3375            }
3376        }
3377    }
3378}
3379
3380impl<'a> Drain<'a> {
3381    /// Returns the remaining (sub)string of this iterator as a slice.
3382    ///
3383    /// # Examples
3384    ///
3385    /// ```
3386    /// let mut s = String::from("abc");
3387    /// let mut drain = s.drain(..);
3388    /// assert_eq!(drain.as_str(), "abc");
3389    /// let _ = drain.next().unwrap();
3390    /// assert_eq!(drain.as_str(), "bc");
3391    /// ```
3392    #[must_use]
3393    #[stable(feature = "string_drain_as_str", since = "1.55.0")]
3394    pub fn as_str(&self) -> &str {
3395        self.iter.as_str()
3396    }
3397}
3398
3399#[stable(feature = "string_drain_as_str", since = "1.55.0")]
3400impl<'a> AsRef<str> for Drain<'a> {
3401    fn as_ref(&self) -> &str {
3402        self.as_str()
3403    }
3404}
3405
3406#[stable(feature = "string_drain_as_str", since = "1.55.0")]
3407impl<'a> AsRef<[u8]> for Drain<'a> {
3408    fn as_ref(&self) -> &[u8] {
3409        self.as_str().as_bytes()
3410    }
3411}
3412
3413#[stable(feature = "drain", since = "1.6.0")]
3414impl Iterator for Drain<'_> {
3415    type Item = char;
3416
3417    #[inline]
3418    fn next(&mut self) -> Option<char> {
3419        self.iter.next()
3420    }
3421
3422    fn size_hint(&self) -> (usize, Option<usize>) {
3423        self.iter.size_hint()
3424    }
3425
3426    #[inline]
3427    fn last(mut self) -> Option<char> {
3428        self.next_back()
3429    }
3430}
3431
3432#[stable(feature = "drain", since = "1.6.0")]
3433impl DoubleEndedIterator for Drain<'_> {
3434    #[inline]
3435    fn next_back(&mut self) -> Option<char> {
3436        self.iter.next_back()
3437    }
3438}
3439
3440#[stable(feature = "fused", since = "1.26.0")]
3441impl FusedIterator for Drain<'_> {}
3442
3443#[cfg(not(no_global_oom_handling))]
3444#[stable(feature = "from_char_for_string", since = "1.46.0")]
3445impl From<char> for String {
3446    /// Allocates an owned [`String`] from a single character.
3447    ///
3448    /// # Example
3449    /// ```rust
3450    /// let c: char = 'a';
3451    /// let s: String = String::from(c);
3452    /// assert_eq!("a", &s[..]);
3453    /// ```
3454    #[inline]
3455    fn from(c: char) -> Self {
3456        c.to_string()
3457    }
3458}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy