1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10 
11 //! A UTF-8 encoded, growable string.
12 //!
13 //! This module contains the [`String`] type and several error types that may
14 //! result from working with [`String`]s.
15 //!
16 //! # Examples
17 //!
18 //! You can create a new [`String`] from a string literal with [`String::from_str_in`]:
19 //!
20 //! ```
21 //! use bumpalo::{Bump, collections::String};
22 //!
23 //! let b = Bump::new();
24 //!
25 //! let s = String::from_str_in("world", &b);
26 //! ```
27 //!
28 //! You can create a new [`String`] from an existing one by concatenating with
29 //! `+`:
30 //!
31 //! [`String`]: struct.String.html
32 //! [`String::from_str_in`]: struct.String.html#method.from_str_in
33 //!
34 //! ```
35 //! use bumpalo::{Bump, collections::String};
36 //!
37 //! let s = "Hello".to_string();
38 //!
39 //! let message = s + " world!";
40 //! ```
41 //!
42 //! If you have a vector of valid UTF-8 bytes, you can make a [`String`] out of
43 //! it. You can do the reverse too.
44 //!
45 //! ```
46 //! use bumpalo::{Bump, collections::String};
47 //!
48 //! let b = Bump::new();
49 //!
50 //! let sparkle_heart = bumpalo::vec![in &b; 240, 159, 146, 150];
51 //!
52 //! // We know these bytes are valid, so we'll use `unwrap()`.
53 //! let sparkle_heart = String::from_utf8(sparkle_heart).unwrap();
54 //!
55 //! assert_eq!("��", sparkle_heart);
56 //!
57 //! let bytes = sparkle_heart.into_bytes();
58 //!
59 //! assert_eq!(bytes, [240, 159, 146, 150]);
60 //! ```
61 
62 use crate::collections::str::lossy;
63 use crate::collections::vec::Vec;
64 use crate::Bump;
65 use core::char::decode_utf16;
66 use core::fmt;
67 use core::hash;
68 use core::iter::FusedIterator;
69 use core::mem;
70 use core::ops::Bound::{Excluded, Included, Unbounded};
71 use core::ops::{self, Add, AddAssign, Index, IndexMut, RangeBounds};
72 use core::ptr;
73 use core::str::{self, Chars, Utf8Error};
74 use core_alloc::borrow::Cow;
75 
76 /// Like the `format!` macro for creating `std::string::String`s but for
77 /// `bumpalo::collections::String`.
78 ///
79 /// # Examples
80 ///
81 /// ```
82 /// use bumpalo::Bump;
83 ///
84 /// let b = Bump::new();
85 ///
86 /// let who = "World";
87 /// let s = bumpalo::format!(in &b, "Hello, {}!", who);
88 /// assert_eq!(s, "Hello, World!")
89 /// ```
90 #[macro_export]
91 macro_rules! format {
92     ( in $bump:expr, $fmt:expr, $($args:expr),* ) => {{
93         use std::fmt::Write;
94         let bump = $bump;
95         let mut s = $crate::collections::String::new_in(bump);
96         let _ = write!(&mut s, $fmt, $($args),*);
97         s
98     }};
99 
100     ( in $bump:expr, $fmt:expr, $($args:expr,)* ) => {
101         $crate::format!(in $bump, $fmt, $($args),*)
102     };
103 }
104 
105 /// A UTF-8 encoded, growable string.
106 ///
107 /// The `String` type is the most common string type that has ownership over the
108 /// contents of the string. It has a close relationship with its borrowed
109 /// counterpart, the primitive [`str`].
110 ///
111 /// [`str`]: https://doc.rust-lang.org/nightly/std/primitive.str.html
112 ///
113 /// # Examples
114 ///
115 /// You can create a `String` from a literal string with [`String::from_iter_in`]:
116 ///
117 /// ```
118 /// use bumpalo::{Bump, collections::String};
119 ///
120 /// let b = Bump::new();
121 ///
122 /// let hello = String::from_str_in("Hello, world!", &b);
123 /// ```
124 ///
125 /// You can append a [`char`] to a `String` with the [`push`] method, and
126 /// append a [`&str`] with the [`push_str`] method:
127 ///
128 /// ```
129 /// use bumpalo::{Bump, collections::String};
130 ///
131 /// let b = Bump::new();
132 ///
133 /// let mut hello = String::from_str_in("Hello, ", &b);
134 ///
135 /// hello.push('w');
136 /// hello.push_str("orld!");
137 /// ```
138 ///
139 /// [`String::from_iter_in`]: #method.from_iter_in
140 /// [`char`]: https://doc.rust-lang.org/nightly/std/primitive.char.html
141 /// [`push`]: #method.push
142 /// [`push_str`]: #method.push_str
143 ///
144 /// If you have a vector of UTF-8 bytes, you can create a `String` from it with
145 /// the [`from_utf8`] method:
146 ///
147 /// ```
148 /// use bumpalo::{Bump, collections::String};
149 ///
150 /// let b = Bump::new();
151 ///
152 /// // some bytes, in a vector
153 /// let sparkle_heart = bumpalo::vec![in &b; 240, 159, 146, 150];
154 ///
155 /// // We know these bytes are valid, so we'll use `unwrap()`.
156 /// let sparkle_heart = String::from_utf8(sparkle_heart).unwrap();
157 ///
158 /// assert_eq!("��", sparkle_heart);
159 /// ```
160 ///
161 /// [`from_utf8`]: #method.from_utf8
162 ///
163 /// # UTF-8
164 ///
165 /// `String`s are always valid UTF-8. This has a few implications, the first of
166 /// which is that if you need a non-UTF-8 string, consider [`OsString`]. It is
167 /// similar, but without the UTF-8 constraint. The second implication is that
168 /// you cannot index into a `String`:
169 ///
170 /// ```compile_fail,E0277
171 /// let s = "hello";
172 ///
173 /// println!("The first letter of s is {}", s[0]); // ERROR!!!
174 /// ```
175 ///
176 /// [`OsString`]: https://doc.rust-lang.org/nightly/std/ffi/struct.OsString.html
177 ///
178 /// Indexing is intended to be a constant-time operation, but UTF-8 encoding
179 /// does not allow us to do this. Furthermore, it's not clear what sort of
180 /// thing the index should return: a byte, a codepoint, or a grapheme cluster.
181 /// The [`bytes`] and [`chars`] methods return iterators over the first
182 /// two, respectively.
183 ///
184 /// [`bytes`]: #method.bytes
185 /// [`chars`]: #method.chars
186 ///
187 /// # Deref
188 ///
189 /// `String`s implement [`Deref`]`<Target=str>`, and so inherit all of [`str`]'s
190 /// methods. In addition, this means that you can pass a `String` to a
191 /// function which takes a [`&str`] by using an ampersand (`&`):
192 ///
193 /// ```
194 /// use bumpalo::{Bump, collections::String};
195 ///
196 /// let b = Bump::new();
197 ///
198 /// fn takes_str(s: &str) { }
199 ///
200 /// let s = String::from_str_in("Hello", &b);
201 ///
202 /// takes_str(&s);
203 /// ```
204 ///
205 /// This will create a [`&str`] from the `String` and pass it in. This
206 /// conversion is very inexpensive, and so generally, functions will accept
207 /// [`&str`]s as arguments unless they need a `String` for some specific
208 /// reason.
209 ///
210 /// In certain cases Rust doesn't have enough information to make this
211 /// conversion, known as [`Deref`] coercion. In the following example a string
212 /// slice [`&'a str`][`&str`] implements the trait `TraitExample`, and the function
213 /// `example_func` takes anything that implements the trait. In this case Rust
214 /// would need to make two implicit conversions, which Rust doesn't have the
215 /// means to do. For that reason, the following example will not compile.
216 ///
217 /// ```compile_fail,E0277
218 /// use bumpalo::{Bump, collections::String};
219 ///
220 /// trait TraitExample {}
221 ///
222 /// impl<'a> TraitExample for &'a str {}
223 ///
224 /// fn example_func<A: TraitExample>(example_arg: A) {}
225 ///
226 /// let b = Bump::new();
227 /// let example_string = String::from_str_in("example_string", &b);
228 /// example_func(&example_string);
229 /// ```
230 ///
231 /// There are two options that would work instead. The first would be to
232 /// change the line `example_func(&example_string);` to
233 /// `example_func(example_string.as_str());`, using the method [`as_str()`]
234 /// to explicitly extract the string slice containing the string. The second
235 /// way changes `example_func(&example_string);` to
236 /// `example_func(&*example_string);`. In this case we are dereferencing a
237 /// `String` to a [`str`][`&str`], then referencing the [`str`][`&str`] back to
238 /// [`&str`]. The second way is more idiomatic, however both work to do the
239 /// conversion explicitly rather than relying on the implicit conversion.
240 ///
241 /// # Representation
242 ///
243 /// A `String` is made up of three components: a pointer to some bytes, a
244 /// length, and a capacity. The pointer points to an internal buffer `String`
245 /// uses to store its data. The length is the number of bytes currently stored
246 /// in the buffer, and the capacity is the size of the buffer in bytes. As such,
247 /// the length will always be less than or equal to the capacity.
248 ///
249 /// This buffer is always stored on the heap.
250 ///
251 /// You can look at these with the [`as_ptr`], [`len`], and [`capacity`]
252 /// methods:
253 ///
254 /// ```
255 /// use bumpalo::{Bump, collections::String};
256 /// use std::mem;
257 ///
258 /// let b = Bump::new();
259 ///
260 /// let story = String::from_str_in("Once upon a time...", &b);
261 ///
262 /// let ptr = story.as_ptr();
263 /// let len = story.len();
264 /// let capacity = story.capacity();
265 ///
266 /// // story has nineteen bytes
267 /// assert_eq!(19, len);
268 ///
269 /// // Now that we have our parts, we throw the story away.
270 /// mem::forget(story);
271 ///
272 /// // We can re-build a String out of ptr, len, and capacity. This is all
273 /// // unsafe because we are responsible for making sure the components are
274 /// // valid:
275 /// let s = unsafe { String::from_raw_parts_in(ptr as *mut _, len, capacity, &b) } ;
276 ///
277 /// assert_eq!(String::from_str_in("Once upon a time...", &b), s);
278 /// ```
279 ///
280 /// [`as_ptr`]: #method.as_ptr
281 /// [`len`]: #method.len
282 /// [`capacity`]: #method.capacity
283 ///
284 /// If a `String` has enough capacity, adding elements to it will not
285 /// re-allocate. For example, consider this program:
286 ///
287 /// ```
288 /// use bumpalo::{Bump, collections::String};
289 ///
290 /// let b = Bump::new();
291 ///
292 /// let mut s = String::new_in(&b);
293 ///
294 /// println!("{}", s.capacity());
295 ///
296 /// for _ in 0..5 {
297 ///     s.push_str("hello");
298 ///     println!("{}", s.capacity());
299 /// }
300 /// ```
301 ///
302 /// This will output the following:
303 ///
304 /// ```text
305 /// 0
306 /// 5
307 /// 10
308 /// 20
309 /// 20
310 /// 40
311 /// ```
312 ///
313 /// At first, we have no memory allocated at all, but as we append to the
314 /// string, it increases its capacity appropriately. If we instead use the
315 /// [`with_capacity_in`] method to allocate the correct capacity initially:
316 ///
317 /// ```
318 /// use bumpalo::{Bump, collections::String};
319 ///
320 /// let b = Bump::new();
321 ///
322 /// let mut s = String::with_capacity_in(25, &b);
323 ///
324 /// println!("{}", s.capacity());
325 ///
326 /// for _ in 0..5 {
327 ///     s.push_str("hello");
328 ///     println!("{}", s.capacity());
329 /// }
330 /// ```
331 ///
332 /// [`with_capacity_in`]: #method.with_capacity_in
333 ///
334 /// We end up with a different output:
335 ///
336 /// ```text
337 /// 25
338 /// 25
339 /// 25
340 /// 25
341 /// 25
342 /// 25
343 /// ```
344 ///
345 /// Here, there's no need to allocate more memory inside the loop.
346 ///
347 /// [`&str`]: https://doc.rust-lang.org/nightly/std/primitive.str.html
348 /// [`Deref`]: https://doc.rust-lang.org/nightly/std/ops/trait.Deref.html
349 /// [`as_str()`]: struct.String.html#method.as_str
350 #[derive(PartialOrd, Eq, Ord)]
351 pub struct String<'bump> {
352     vec: Vec<'bump, u8>,
353 }
354 
355 /// A possible error value when converting a `String` from a UTF-8 byte vector.
356 ///
357 /// This type is the error type for the [`from_utf8`] method on [`String`]. It
358 /// is designed in such a way to carefully avoid reallocations: the
359 /// [`into_bytes`] method will give back the byte vector that was used in the
360 /// conversion attempt.
361 ///
362 /// [`from_utf8`]: struct.String.html#method.from_utf8
363 /// [`String`]: struct.String.html
364 /// [`into_bytes`]: struct.FromUtf8Error.html#method.into_bytes
365 ///
366 /// The [`Utf8Error`] type provided by [`std::str`] represents an error that may
367 /// occur when converting a slice of [`u8`]s to a [`&str`]. In this sense, it's
368 /// an analogue to `FromUtf8Error`, and you can get one from a `FromUtf8Error`
369 /// through the [`utf8_error`] method.
370 ///
371 /// [`Utf8Error`]: https://doc.rust-lang.org/nightly/std/str/struct.Utf8Error.html
372 /// [`std::str`]: https://doc.rust-lang.org/nightly/std/str/index.html
373 /// [`u8`]: https://doc.rust-lang.org/nightly/std/primitive.u8.html
374 /// [`&str`]: https://doc.rust-lang.org/nightly/std/primitive.str.html
375 /// [`utf8_error`]: #method.utf8_error
376 ///
377 /// # Examples
378 ///
379 /// Basic usage:
380 ///
381 /// ```
382 /// use bumpalo::{Bump, collections::String};
383 ///
384 /// let b = Bump::new();
385 ///
386 /// // some invalid bytes, in a vector
387 /// let bytes = bumpalo::vec![in &b; 0, 159];
388 ///
389 /// let value = String::from_utf8(bytes);
390 ///
391 /// assert!(value.is_err());
392 /// assert_eq!(bumpalo::vec![in &b; 0, 159], value.unwrap_err().into_bytes());
393 /// ```
394 #[derive(Debug)]
395 pub struct FromUtf8Error<'bump> {
396     bytes: Vec<'bump, u8>,
397     error: Utf8Error,
398 }
399 
400 /// A possible error value when converting a `String` from a UTF-16 byte slice.
401 ///
402 /// This type is the error type for the [`from_utf16`] method on [`String`].
403 ///
404 /// [`from_utf16`]: struct.String.html#method.from_utf16
405 /// [`String`]: struct.String.html
406 ///
407 /// # Examples
408 ///
409 /// Basic usage:
410 ///
411 /// ```
412 /// use bumpalo::{Bump, collections::String};
413 ///
414 /// let b = Bump::new();
415 ///
416 /// // ��mu<invalid>ic
417 /// let v = &[0xD834, 0xDD1E, 0x006d, 0x0075,
418 ///           0xD800, 0x0069, 0x0063];
419 ///
420 /// assert!(String::from_utf16_in(v, &b).is_err());
421 /// ```
422 #[derive(Debug)]
423 pub struct FromUtf16Error(());
424 
425 impl<'bump> String<'bump> {
426     /// Creates a new empty `String`.
427     ///
428     /// Given that the `String` is empty, this will not allocate any initial
429     /// buffer. While that means that this initial operation is very
430     /// inexpensive, it may cause excessive allocation later when you add
431     /// data. If you have an idea of how much data the `String` will hold,
432     /// consider the [`with_capacity_in`] method to prevent excessive
433     /// re-allocation.
434     ///
435     /// [`with_capacity_in`]: #method.with_capacity_in
436     ///
437     /// # Examples
438     ///
439     /// Basic usage:
440     ///
441     /// ```
442     /// use bumpalo::{Bump, collections::String};
443     ///
444     /// let b = Bump::new();
445     ///
446     /// let s = String::new_in(&b);
447     /// ```
448     #[inline]
new_in(bump: &'bump Bump) -> String<'bump>449     pub fn new_in(bump: &'bump Bump) -> String<'bump> {
450         String {
451             vec: Vec::new_in(bump),
452         }
453     }
454 
455     /// Creates a new empty `String` with a particular capacity.
456     ///
457     /// `String`s have an internal buffer to hold their data. The capacity is
458     /// the length of that buffer, and can be queried with the [`capacity`]
459     /// method. This method creates an empty `String`, but one with an initial
460     /// buffer that can hold `capacity` bytes. This is useful when you may be
461     /// appending a bunch of data to the `String`, reducing the number of
462     /// reallocations it needs to do.
463     ///
464     /// [`capacity`]: #method.capacity
465     ///
466     /// If the given capacity is `0`, no allocation will occur, and this method
467     /// is identical to the [`new_in`] method.
468     ///
469     /// [`new_in`]: #method.new
470     ///
471     /// # Examples
472     ///
473     /// Basic usage:
474     ///
475     /// ```
476     /// use bumpalo::{Bump, collections::String};
477     ///
478     /// let b = Bump::new();
479     ///
480     /// let mut s = String::with_capacity_in(10, &b);
481     ///
482     /// // The String contains no chars, even though it has capacity for more
483     /// assert_eq!(s.len(), 0);
484     ///
485     /// // These are all done without reallocating...
486     /// let cap = s.capacity();
487     /// for _ in 0..10 {
488     ///     s.push('a');
489     /// }
490     ///
491     /// assert_eq!(s.capacity(), cap);
492     ///
493     /// // ...but this may make the vector reallocate
494     /// s.push('a');
495     /// ```
496     #[inline]
with_capacity_in(capacity: usize, bump: &'bump Bump) -> String<'bump>497     pub fn with_capacity_in(capacity: usize, bump: &'bump Bump) -> String<'bump> {
498         String {
499             vec: Vec::with_capacity_in(capacity, bump),
500         }
501     }
502 
503     /// Converts a vector of bytes to a `String`.
504     ///
505     /// A string slice ([`&str`]) is made of bytes ([`u8`]), and a vector of bytes
506     /// ([`Vec<u8>`]) is made of bytes, so this function converts between the
507     /// two. Not all byte slices are valid `String`s, however: `String`
508     /// requires that it is valid UTF-8. `from_utf8()` checks to ensure that
509     /// the bytes are valid UTF-8, and then does the conversion.
510     ///
511     /// If you are sure that the byte slice is valid UTF-8, and you don't want
512     /// to incur the overhead of the validity check, there is an unsafe version
513     /// of this function, [`from_utf8_unchecked`], which has the same behavior
514     /// but skips the check.
515     ///
516     /// This method will take care to not copy the vector, for efficiency's
517     /// sake.
518     ///
519     /// If you need a [`&str`] instead of a `String`, consider
520     /// [`str::from_utf8`].
521     ///
522     /// The inverse of this method is [`as_bytes`].
523     ///
524     /// # Errors
525     ///
526     /// Returns [`Err`] if the slice is not UTF-8 with a description as to why the
527     /// provided bytes are not UTF-8. The vector you moved in is also included.
528     ///
529     /// # Examples
530     ///
531     /// Basic usage:
532     ///
533     /// ```
534     /// use bumpalo::{Bump, collections::String};
535     ///
536     /// let b = Bump::new();
537     ///
538     /// // some bytes, in a vector
539     /// let sparkle_heart = bumpalo::vec![in &b; 240, 159, 146, 150];
540     ///
541     /// // We know these bytes are valid, so we'll use `unwrap()`.
542     /// let sparkle_heart = String::from_utf8(sparkle_heart).unwrap();
543     ///
544     /// assert_eq!("��", sparkle_heart);
545     /// ```
546     ///
547     /// Incorrect bytes:
548     ///
549     /// ```
550     /// use bumpalo::{Bump, collections::String};
551     ///
552     /// let b = Bump::new();
553     ///
554     /// // some invalid bytes, in a vector
555     /// let sparkle_heart = bumpalo::vec![in &b; 0, 159, 146, 150];
556     ///
557     /// assert!(String::from_utf8(sparkle_heart).is_err());
558     /// ```
559     ///
560     /// See the docs for [`FromUtf8Error`] for more details on what you can do
561     /// with this error.
562     ///
563     /// [`from_utf8_unchecked`]: struct.String.html#method.from_utf8_unchecked
564     /// [`&str`]: https://doc.rust-lang.org/nightly/std/primitive.str.html
565     /// [`u8`]: https://doc.rust-lang.org/nightly/std/primitive.u8.html
566     /// [`Vec<u8>`]: ../vec/struct.Vec.html
567     /// [`str::from_utf8`]: https://doc.rust-lang.org/nightly/std/str/fn.from_utf8.html
568     /// [`as_bytes`]: struct.String.html#method.as_bytes
569     /// [`FromUtf8Error`]: struct.FromUtf8Error.html
570     /// [`Err`]: https://doc.rust-lang.org/nightly/std/result/enum.Result.html#variant.Err
571     #[inline]
from_utf8(vec: Vec<'bump, u8>) -> Result<String<'bump>, FromUtf8Error<'bump>>572     pub fn from_utf8(vec: Vec<'bump, u8>) -> Result<String<'bump>, FromUtf8Error<'bump>> {
573         match str::from_utf8(&vec) {
574             Ok(..) => Ok(String { vec }),
575             Err(e) => Err(FromUtf8Error {
576                 bytes: vec,
577                 error: e,
578             }),
579         }
580     }
581 
582     /// Converts a slice of bytes to a string, including invalid characters.
583     ///
584     /// Strings are made of bytes ([`u8`]), and a slice of bytes
585     /// ([`&[u8]`][byteslice]) is made of bytes, so this function converts
586     /// between the two. Not all byte slices are valid strings, however: strings
587     /// are required to be valid UTF-8. During this conversion,
588     /// `from_utf8_lossy()` will replace any invalid UTF-8 sequences with
589     /// [`U+FFFD REPLACEMENT CHARACTER`][U+FFFD], which looks like this: �
590     ///
591     /// [`u8`]: https://doc.rust-lang.org/nightly/std/primitive.u8.html
592     /// [byteslice]: https://doc.rust-lang.org/nightly/std/primitive.slice.html
593     /// [U+FFFD]: ../char/constant.REPLACEMENT_CHARACTER.html
594     ///
595     /// If you are sure that the byte slice is valid UTF-8, and you don't want
596     /// to incur the overhead of the conversion, there is an unsafe version
597     /// of this function, [`from_utf8_unchecked`], which has the same behavior
598     /// but skips the checks.
599     ///
600     /// [`from_utf8_unchecked`]: struct.String.html#method.from_utf8_unchecked
601     ///
602     /// # Examples
603     ///
604     /// Basic usage:
605     ///
606     /// ```
607     /// use bumpalo::{collections::String, Bump, vec};
608     ///
609     /// let b = Bump::new();
610     ///
611     /// // some bytes, in a vector
612     /// let sparkle_heart = bumpalo::vec![in &b; 240, 159, 146, 150];
613     ///
614     /// let sparkle_heart = String::from_utf8_lossy_in(&sparkle_heart, &b);
615     ///
616     /// assert_eq!("��", sparkle_heart);
617     /// ```
618     ///
619     /// Incorrect bytes:
620     ///
621     /// ```
622     /// use bumpalo::{collections::String, Bump, vec};
623     ///
624     /// let b = Bump::new();
625     ///
626     /// // some invalid bytes
627     /// let input = b"Hello \xF0\x90\x80World";
628     /// let output = String::from_utf8_lossy_in(input, &b);
629     ///
630     /// assert_eq!("Hello �World", output);
631     /// ```
from_utf8_lossy_in(v: &[u8], bump: &'bump Bump) -> String<'bump>632     pub fn from_utf8_lossy_in(v: &[u8], bump: &'bump Bump) -> String<'bump> {
633         let mut iter = lossy::Utf8Lossy::from_bytes(v).chunks();
634 
635         let (first_valid, first_broken) = if let Some(chunk) = iter.next() {
636             let lossy::Utf8LossyChunk { valid, broken } = chunk;
637             if valid.len() == v.len() {
638                 debug_assert!(broken.is_empty());
639                 unsafe {
640                     return String::from_utf8_unchecked(Vec::from_iter_in(v.iter().cloned(), bump));
641                 }
642             }
643             (valid, broken)
644         } else {
645             return String::from_str_in("", bump);
646         };
647 
648         const REPLACEMENT: &str = "\u{FFFD}";
649 
650         let mut res = String::with_capacity_in(v.len(), bump);
651         res.push_str(first_valid);
652         if !first_broken.is_empty() {
653             res.push_str(REPLACEMENT);
654         }
655 
656         for lossy::Utf8LossyChunk { valid, broken } in iter {
657             res.push_str(valid);
658             if !broken.is_empty() {
659                 res.push_str(REPLACEMENT);
660             }
661         }
662 
663         res
664     }
665 
666     /// Decode a UTF-16 encoded vector `v` into a `String`, returning [`Err`]
667     /// if `v` contains any invalid data.
668     ///
669     /// [`Err`]: https://doc.rust-lang.org/nightly/std/result/enum.Result.html#variant.Err
670     ///
671     /// # Examples
672     ///
673     /// Basic usage:
674     ///
675     /// ```
676     /// use bumpalo::{Bump, collections::String};
677     ///
678     /// let b = Bump::new();
679     ///
680     /// // ��music
681     /// let v = &[0xD834, 0xDD1E, 0x006d, 0x0075,
682     ///           0x0073, 0x0069, 0x0063];
683     /// assert_eq!(String::from_str_in("��music", &b),
684     ///            String::from_utf16_in(v, &b).unwrap());
685     ///
686     /// // ��mu<invalid>ic
687     /// let v = &[0xD834, 0xDD1E, 0x006d, 0x0075,
688     ///           0xD800, 0x0069, 0x0063];
689     /// assert!(String::from_utf16_in(v, &b).is_err());
690     /// ```
from_utf16_in(v: &[u16], bump: &'bump Bump) -> Result<String<'bump>, FromUtf16Error>691     pub fn from_utf16_in(v: &[u16], bump: &'bump Bump) -> Result<String<'bump>, FromUtf16Error> {
692         let mut ret = String::with_capacity_in(v.len(), bump);
693         for c in decode_utf16(v.iter().cloned()) {
694             if let Ok(c) = c {
695                 ret.push(c);
696             } else {
697                 return Err(FromUtf16Error(()));
698             }
699         }
700         Ok(ret)
701     }
702 
703     /// Construct a new `String<'bump>` from an iterator of `char`s.
704     ///
705     /// # Examples
706     ///
707     /// ```
708     /// use bumpalo::{Bump, collections::String};
709     ///
710     /// let b = Bump::new();
711     ///
712     /// let s = String::from_str_in("hello", &b);
713     /// assert_eq!(s, "hello");
714     /// ```
from_str_in(s: &str, bump: &'bump Bump) -> String<'bump>715     pub fn from_str_in(s: &str, bump: &'bump Bump) -> String<'bump> {
716         let mut t = String::with_capacity_in(s.len(), bump);
717         t.push_str(s);
718         t
719     }
720 
721     /// Construct a new `String<'bump>` from an iterator of `char`s.
722     ///
723     /// # Examples
724     ///
725     /// ```
726     /// use bumpalo::{Bump, collections::String};
727     ///
728     /// let b = Bump::new();
729     ///
730     /// let s = String::from_str_in("hello", &b);
731     /// assert_eq!(s, "hello");
732     /// ```
from_iter_in<I: IntoIterator<Item = char>>(iter: I, bump: &'bump Bump) -> String<'bump>733     pub fn from_iter_in<I: IntoIterator<Item = char>>(iter: I, bump: &'bump Bump) -> String<'bump> {
734         let mut s = String::new_in(bump);
735         for c in iter {
736             s.push(c);
737         }
738         s
739     }
740 
741     /// Creates a new `String` from a length, capacity, and pointer.
742     ///
743     /// # Safety
744     ///
745     /// This is highly unsafe, due to the number of invariants that aren't
746     /// checked:
747     ///
748     /// * The memory at `ptr` needs to have been previously allocated by the
749     ///   same allocator the standard library uses.
750     /// * `length` needs to be less than or equal to `capacity`.
751     /// * `capacity` needs to be the correct value.
752     ///
753     /// Violating these may cause problems like corrupting the allocator's
754     /// internal data structures.
755     ///
756     /// The ownership of `ptr` is effectively transferred to the
757     /// `String` which may then deallocate, reallocate or change the
758     /// contents of memory pointed to by the pointer at will. Ensure
759     /// that nothing else uses the pointer after calling this
760     /// function.
761     ///
762     /// # Examples
763     ///
764     /// Basic usage:
765     ///
766     /// ```
767     /// use bumpalo::{Bump, collections::String};
768     /// use std::mem;
769     ///
770     /// let b = Bump::new();
771     ///
772     /// unsafe {
773     ///     let s = String::from_str_in("hello", &b);
774     ///     let ptr = s.as_ptr();
775     ///     let len = s.len();
776     ///     let capacity = s.capacity();
777     ///
778     ///     mem::forget(s);
779     ///
780     ///     let s = String::from_raw_parts_in(ptr as *mut _, len, capacity, &b);
781     ///
782     ///     assert_eq!(String::from_str_in("hello", &b), s);
783     /// }
784     /// ```
785     #[inline]
from_raw_parts_in( buf: *mut u8, length: usize, capacity: usize, bump: &'bump Bump, ) -> String<'bump>786     pub unsafe fn from_raw_parts_in(
787         buf: *mut u8,
788         length: usize,
789         capacity: usize,
790         bump: &'bump Bump,
791     ) -> String<'bump> {
792         String {
793             vec: Vec::from_raw_parts_in(buf, length, capacity, bump),
794         }
795     }
796 
797     /// Converts a vector of bytes to a `String` without checking that the
798     /// string contains valid UTF-8.
799     ///
800     /// See the safe version, [`from_utf8`], for more details.
801     ///
802     /// [`from_utf8`]: struct.String.html#method.from_utf8
803     ///
804     /// # Safety
805     ///
806     /// This function is unsafe because it does not check that the bytes passed
807     /// to it are valid UTF-8. If this constraint is violated, it may cause
808     /// memory unsafety issues with future users of the `String`, as the rest of
809     /// the standard library assumes that `String`s are valid UTF-8.
810     ///
811     /// # Examples
812     ///
813     /// Basic usage:
814     ///
815     /// ```
816     /// use bumpalo::{Bump, collections::String};
817     ///
818     /// let b = Bump::new();
819     ///
820     /// // some bytes, in a vector
821     /// let sparkle_heart = bumpalo::vec![in &b; 240, 159, 146, 150];
822     ///
823     /// let sparkle_heart = unsafe {
824     ///     String::from_utf8_unchecked(sparkle_heart)
825     /// };
826     ///
827     /// assert_eq!("��", sparkle_heart);
828     /// ```
829     #[inline]
from_utf8_unchecked(bytes: Vec<'bump, u8>) -> String<'bump>830     pub unsafe fn from_utf8_unchecked(bytes: Vec<'bump, u8>) -> String<'bump> {
831         String { vec: bytes }
832     }
833 
834     /// Converts a `String` into a byte vector.
835     ///
836     /// This consumes the `String`, so we do not need to copy its contents.
837     ///
838     /// # Examples
839     ///
840     /// Basic usage:
841     ///
842     /// ```
843     /// use bumpalo::{Bump, collections::String};
844     ///
845     /// let b = Bump::new();
846     ///
847     /// let s = String::from_str_in("hello", &b);
848     /// let bytes = s.into_bytes();
849     ///
850     /// assert_eq!(&[104, 101, 108, 108, 111][..], &bytes[..]);
851     /// ```
852     #[inline]
into_bytes(self) -> Vec<'bump, u8>853     pub fn into_bytes(self) -> Vec<'bump, u8> {
854         self.vec
855     }
856 
857     /// Convert this `String<'bump>` into a `&'bump str`. This is analagous to
858     /// `std::string::String::into_boxed_str`.
859     ///
860     /// # Example
861     ///
862     /// ```
863     /// use bumpalo::{Bump, collections::String};
864     ///
865     /// let b = Bump::new();
866     ///
867     /// let s = String::from_str_in("foo", &b);
868     /// let t = s.into_bump_str();
869     /// assert_eq!("foo", t);
870     /// ```
into_bump_str(self) -> &'bump str871     pub fn into_bump_str(self) -> &'bump str {
872         let s = unsafe {
873             let s = self.as_str();
874             mem::transmute(s)
875         };
876         mem::forget(self);
877         s
878     }
879 
880     /// Extracts a string slice containing the entire `String`.
881     ///
882     /// # Examples
883     ///
884     /// Basic usage:
885     ///
886     /// ```
887     /// use bumpalo::{Bump, collections::String};
888     ///
889     /// let b = Bump::new();
890     ///
891     /// let s = String::from_str_in("foo", &b);
892     ///
893     /// assert_eq!("foo", s.as_str());
894     /// ```
895     #[inline]
as_str(&self) -> &str896     pub fn as_str(&self) -> &str {
897         self
898     }
899 
900     /// Converts a `String` into a mutable string slice.
901     ///
902     /// # Examples
903     ///
904     /// Basic usage:
905     ///
906     /// ```
907     /// use bumpalo::{Bump, collections::String};
908     ///
909     /// let b = Bump::new();
910     ///
911     /// let mut s = String::from_str_in("foobar", &b);
912     /// let s_mut_str = s.as_mut_str();
913     ///
914     /// s_mut_str.make_ascii_uppercase();
915     ///
916     /// assert_eq!("FOOBAR", s_mut_str);
917     /// ```
918     #[inline]
as_mut_str(&mut self) -> &mut str919     pub fn as_mut_str(&mut self) -> &mut str {
920         self
921     }
922 
923     /// Appends a given string slice onto the end of this `String`.
924     ///
925     /// # Examples
926     ///
927     /// Basic usage:
928     ///
929     /// ```
930     /// use bumpalo::{Bump, collections::String};
931     ///
932     /// let b = Bump::new();
933     ///
934     /// let mut s = String::from_str_in("foo", &b);
935     ///
936     /// s.push_str("bar");
937     ///
938     /// assert_eq!("foobar", s);
939     /// ```
940     #[inline]
push_str(&mut self, string: &str)941     pub fn push_str(&mut self, string: &str) {
942         self.vec.extend_from_slice(string.as_bytes())
943     }
944 
945     /// Returns this `String`'s capacity, in bytes.
946     ///
947     /// # Examples
948     ///
949     /// Basic usage:
950     ///
951     /// ```
952     /// use bumpalo::{Bump, collections::String};
953     ///
954     /// let b = Bump::new();
955     ///
956     /// let s = String::with_capacity_in(10, &b);
957     ///
958     /// assert!(s.capacity() >= 10);
959     /// ```
960     #[inline]
capacity(&self) -> usize961     pub fn capacity(&self) -> usize {
962         self.vec.capacity()
963     }
964 
965     /// Ensures that this `String`'s capacity is at least `additional` bytes
966     /// larger than its length.
967     ///
968     /// The capacity may be increased by more than `additional` bytes if it
969     /// chooses, to prevent frequent reallocations.
970     ///
971     /// If you do not want this "at least" behavior, see the [`reserve_exact`]
972     /// method.
973     ///
974     /// # Panics
975     ///
976     /// Panics if the new capacity overflows [`usize`].
977     ///
978     /// [`reserve_exact`]: struct.String.html#method.reserve_exact
979     /// [`usize`]: https://doc.rust-lang.org/nightly/std/primitive.usize.html
980     ///
981     /// # Examples
982     ///
983     /// Basic usage:
984     ///
985     /// ```
986     /// use bumpalo::{Bump, collections::String};
987     ///
988     /// let b = Bump::new();
989     ///
990     /// let mut s = String::new_in(&b);
991     ///
992     /// s.reserve(10);
993     ///
994     /// assert!(s.capacity() >= 10);
995     /// ```
996     ///
997     /// This may not actually increase the capacity:
998     ///
999     /// ```
1000     /// use bumpalo::{Bump, collections::String};
1001     ///
1002     /// let b = Bump::new();
1003     ///
1004     /// let mut s = String::with_capacity_in(10, &b);
1005     /// s.push('a');
1006     /// s.push('b');
1007     ///
1008     /// // s now has a length of 2 and a capacity of 10
1009     /// assert_eq!(2, s.len());
1010     /// assert_eq!(10, s.capacity());
1011     ///
1012     /// // Since we already have an extra 8 capacity, calling this...
1013     /// s.reserve(8);
1014     ///
1015     /// // ... doesn't actually increase.
1016     /// assert_eq!(10, s.capacity());
1017     /// ```
1018     #[inline]
reserve(&mut self, additional: usize)1019     pub fn reserve(&mut self, additional: usize) {
1020         self.vec.reserve(additional)
1021     }
1022 
1023     /// Ensures that this `String`'s capacity is `additional` bytes
1024     /// larger than its length.
1025     ///
1026     /// Consider using the [`reserve`] method unless you absolutely know
1027     /// better than the allocator.
1028     ///
1029     /// [`reserve`]: #method.reserve
1030     ///
1031     /// # Panics
1032     ///
1033     /// Panics if the new capacity overflows `usize`.
1034     ///
1035     /// # Examples
1036     ///
1037     /// Basic usage:
1038     ///
1039     /// ```
1040     /// use bumpalo::{Bump, collections::String};
1041     ///
1042     /// let b = Bump::new();
1043     ///
1044     /// let mut s = String::new_in(&b);
1045     ///
1046     /// s.reserve_exact(10);
1047     ///
1048     /// assert!(s.capacity() >= 10);
1049     /// ```
1050     ///
1051     /// This may not actually increase the capacity:
1052     ///
1053     /// ```
1054     /// use bumpalo::{Bump, collections::String};
1055     ///
1056     /// let b = Bump::new();
1057     ///
1058     /// let mut s = String::with_capacity_in(10, &b);
1059     /// s.push('a');
1060     /// s.push('b');
1061     ///
1062     /// // s now has a length of 2 and a capacity of 10
1063     /// assert_eq!(2, s.len());
1064     /// assert_eq!(10, s.capacity());
1065     ///
1066     /// // Since we already have an extra 8 capacity, calling this...
1067     /// s.reserve_exact(8);
1068     ///
1069     /// // ... doesn't actually increase.
1070     /// assert_eq!(10, s.capacity());
1071     /// ```
1072     #[inline]
reserve_exact(&mut self, additional: usize)1073     pub fn reserve_exact(&mut self, additional: usize) {
1074         self.vec.reserve_exact(additional)
1075     }
1076 
1077     /// Shrinks the capacity of this `String` to match its length.
1078     ///
1079     /// # Examples
1080     ///
1081     /// Basic usage:
1082     ///
1083     /// ```
1084     /// use bumpalo::{Bump, collections::String};
1085     ///
1086     /// let b = Bump::new();
1087     ///
1088     /// let mut s = String::from_str_in("foo", &b);
1089     ///
1090     /// s.reserve(100);
1091     /// assert!(s.capacity() >= 100);
1092     ///
1093     /// s.shrink_to_fit();
1094     /// assert_eq!(3, s.capacity());
1095     /// ```
1096     #[inline]
shrink_to_fit(&mut self)1097     pub fn shrink_to_fit(&mut self) {
1098         self.vec.shrink_to_fit()
1099     }
1100 
1101     /// Appends the given [`char`] to the end of this `String`.
1102     ///
1103     /// [`char`]: https://doc.rust-lang.org/nightly/std/primitive.char.html
1104     ///
1105     /// # Examples
1106     ///
1107     /// Basic usage:
1108     ///
1109     /// ```
1110     /// use bumpalo::{Bump, collections::String};
1111     ///
1112     /// let b = Bump::new();
1113     ///
1114     /// let mut s = String::from_str_in("abc", &b);
1115     ///
1116     /// s.push('1');
1117     /// s.push('2');
1118     /// s.push('3');
1119     ///
1120     /// assert_eq!("abc123", s);
1121     /// ```
1122     #[inline]
push(&mut self, ch: char)1123     pub fn push(&mut self, ch: char) {
1124         match ch.len_utf8() {
1125             1 => self.vec.push(ch as u8),
1126             _ => self
1127                 .vec
1128                 .extend_from_slice(ch.encode_utf8(&mut [0; 4]).as_bytes()),
1129         }
1130     }
1131 
1132     /// Returns a byte slice of this `String`'s contents.
1133     ///
1134     /// The inverse of this method is [`from_utf8`].
1135     ///
1136     /// [`from_utf8`]: #method.from_utf8
1137     ///
1138     /// # Examples
1139     ///
1140     /// Basic usage:
1141     ///
1142     /// ```
1143     /// use bumpalo::{Bump, collections::String};
1144     ///
1145     /// let b = Bump::new();
1146     ///
1147     /// let s = String::from_str_in("hello", &b);
1148     ///
1149     /// assert_eq!(&[104, 101, 108, 108, 111], s.as_bytes());
1150     /// ```
1151     #[inline]
as_bytes(&self) -> &[u8]1152     pub fn as_bytes(&self) -> &[u8] {
1153         &self.vec
1154     }
1155 
1156     /// Shortens this `String` to the specified length.
1157     ///
1158     /// If `new_len` is greater than the string's current length, this has no
1159     /// effect.
1160     ///
1161     /// Note that this method has no effect on the allocated capacity
1162     /// of the string
1163     ///
1164     /// # Panics
1165     ///
1166     /// Panics if `new_len` does not lie on a [`char`] boundary.
1167     ///
1168     /// [`char`]: https://doc.rust-lang.org/nightly/std/primitive.char.html
1169     ///
1170     /// # Examples
1171     ///
1172     /// Basic usage:
1173     ///
1174     /// ```
1175     /// use bumpalo::{Bump, collections::String};
1176     ///
1177     /// let b = Bump::new();
1178     ///
1179     /// let mut s = String::from_str_in("hello", &b);
1180     ///
1181     /// s.truncate(2);
1182     ///
1183     /// assert_eq!("he", s);
1184     /// ```
1185     #[inline]
truncate(&mut self, new_len: usize)1186     pub fn truncate(&mut self, new_len: usize) {
1187         if new_len <= self.len() {
1188             assert!(self.is_char_boundary(new_len));
1189             self.vec.truncate(new_len)
1190         }
1191     }
1192 
1193     /// Removes the last character from the string buffer and returns it.
1194     ///
1195     /// Returns [`None`] if this `String` is empty.
1196     ///
1197     /// [`None`]: https://doc.rust-lang.org/nightly/std/option/enum.Option.html#variant.None
1198     ///
1199     /// # Examples
1200     ///
1201     /// Basic usage:
1202     ///
1203     /// ```
1204     /// use bumpalo::{Bump, collections::String};
1205     ///
1206     /// let b = Bump::new();
1207     ///
1208     /// let mut s = String::from_str_in("foo", &b);
1209     ///
1210     /// assert_eq!(s.pop(), Some('o'));
1211     /// assert_eq!(s.pop(), Some('o'));
1212     /// assert_eq!(s.pop(), Some('f'));
1213     ///
1214     /// assert_eq!(s.pop(), None);
1215     /// ```
1216     #[inline]
pop(&mut self) -> Option<char>1217     pub fn pop(&mut self) -> Option<char> {
1218         let ch = self.chars().rev().next()?;
1219         let newlen = self.len() - ch.len_utf8();
1220         unsafe {
1221             self.vec.set_len(newlen);
1222         }
1223         Some(ch)
1224     }
1225 
1226     /// Removes a [`char`] from this `String` at a byte position and returns it.
1227     ///
1228     /// This is an `O(n)` operation, as it requires copying every element in the
1229     /// buffer.
1230     ///
1231     /// # Panics
1232     ///
1233     /// Panics if `idx` is larger than or equal to the `String`'s length,
1234     /// or if it does not lie on a [`char`] boundary.
1235     ///
1236     /// [`char`]: https://doc.rust-lang.org/nightly/std/primitive.char.html
1237     ///
1238     /// # Examples
1239     ///
1240     /// Basic usage:
1241     ///
1242     /// ```
1243     /// use bumpalo::{Bump, collections::String};
1244     ///
1245     /// let b = Bump::new();
1246     ///
1247     /// let mut s = String::from_str_in("foo", &b);
1248     ///
1249     /// assert_eq!(s.remove(0), 'f');
1250     /// assert_eq!(s.remove(1), 'o');
1251     /// assert_eq!(s.remove(0), 'o');
1252     /// ```
1253     #[inline]
remove(&mut self, idx: usize) -> char1254     pub fn remove(&mut self, idx: usize) -> char {
1255         let ch = match self[idx..].chars().next() {
1256             Some(ch) => ch,
1257             None => panic!("cannot remove a char from the end of a string"),
1258         };
1259 
1260         let next = idx + ch.len_utf8();
1261         let len = self.len();
1262         unsafe {
1263             ptr::copy(
1264                 self.vec.as_ptr().add(next),
1265                 self.vec.as_mut_ptr().add(idx),
1266                 len - next,
1267             );
1268             self.vec.set_len(len - (next - idx));
1269         }
1270         ch
1271     }
1272 
1273     /// Retains only the characters specified by the predicate.
1274     ///
1275     /// In other words, remove all characters `c` such that `f(c)` returns `false`.
1276     /// This method operates in place and preserves the order of the retained
1277     /// characters.
1278     ///
1279     /// # Examples
1280     ///
1281     /// ```
1282     /// use bumpalo::{Bump, collections::String};
1283     ///
1284     /// let b = Bump::new();
1285     ///
1286     /// let mut s = String::from_str_in("f_o_ob_ar", &b);
1287     ///
1288     /// s.retain(|c| c != '_');
1289     ///
1290     /// assert_eq!(s, "foobar");
1291     /// ```
1292     #[inline]
retain<F>(&mut self, mut f: F) where F: FnMut(char) -> bool,1293     pub fn retain<F>(&mut self, mut f: F)
1294     where
1295         F: FnMut(char) -> bool,
1296     {
1297         let len = self.len();
1298         let mut del_bytes = 0;
1299         let mut idx = 0;
1300 
1301         while idx < len {
1302             let ch = unsafe { self.get_unchecked(idx..len).chars().next().unwrap() };
1303             let ch_len = ch.len_utf8();
1304 
1305             if !f(ch) {
1306                 del_bytes += ch_len;
1307             } else if del_bytes > 0 {
1308                 unsafe {
1309                     ptr::copy(
1310                         self.vec.as_ptr().add(idx),
1311                         self.vec.as_mut_ptr().add(idx - del_bytes),
1312                         ch_len,
1313                     );
1314                 }
1315             }
1316 
1317             // Point idx to the next char
1318             idx += ch_len;
1319         }
1320 
1321         if del_bytes > 0 {
1322             unsafe {
1323                 self.vec.set_len(len - del_bytes);
1324             }
1325         }
1326     }
1327 
1328     /// Inserts a character into this `String` at a byte position.
1329     ///
1330     /// This is an `O(n)` operation as it requires copying every element in the
1331     /// buffer.
1332     ///
1333     /// # Panics
1334     ///
1335     /// Panics if `idx` is larger than the `String`'s length, or if it does not
1336     /// lie on a [`char`] boundary.
1337     ///
1338     /// [`char`]: https://doc.rust-lang.org/nightly/std/primitive.char.html
1339     ///
1340     /// # Examples
1341     ///
1342     /// Basic usage:
1343     ///
1344     /// ```
1345     /// use bumpalo::{Bump, collections::String};
1346     ///
1347     /// let b = Bump::new();
1348     ///
1349     /// let mut s = String::with_capacity_in(3, &b);
1350     ///
1351     /// s.insert(0, 'f');
1352     /// s.insert(1, 'o');
1353     /// s.insert(2, 'o');
1354     ///
1355     /// assert_eq!("foo", s);
1356     /// ```
1357     #[inline]
insert(&mut self, idx: usize, ch: char)1358     pub fn insert(&mut self, idx: usize, ch: char) {
1359         assert!(self.is_char_boundary(idx));
1360         let mut bits = [0; 4];
1361         let bits = ch.encode_utf8(&mut bits).as_bytes();
1362 
1363         unsafe {
1364             self.insert_bytes(idx, bits);
1365         }
1366     }
1367 
insert_bytes(&mut self, idx: usize, bytes: &[u8])1368     unsafe fn insert_bytes(&mut self, idx: usize, bytes: &[u8]) {
1369         let len = self.len();
1370         let amt = bytes.len();
1371         self.vec.reserve(amt);
1372 
1373         ptr::copy(
1374             self.vec.as_ptr().add(idx),
1375             self.vec.as_mut_ptr().add(idx + amt),
1376             len - idx,
1377         );
1378         ptr::copy(bytes.as_ptr(), self.vec.as_mut_ptr().add(idx), amt);
1379         self.vec.set_len(len + amt);
1380     }
1381 
1382     /// Inserts a string slice into this `String` at a byte position.
1383     ///
1384     /// This is an `O(n)` operation as it requires copying every element in the
1385     /// buffer.
1386     ///
1387     /// # Panics
1388     ///
1389     /// Panics if `idx` is larger than the `String`'s length, or if it does not
1390     /// lie on a [`char`] boundary.
1391     ///
1392     /// [`char`]: https://doc.rust-lang.org/nightly/std/primitive.char.html
1393     ///
1394     /// # Examples
1395     ///
1396     /// Basic usage:
1397     ///
1398     /// ```
1399     /// use bumpalo::{Bump, collections::String};
1400     ///
1401     /// let b = Bump::new();
1402     ///
1403     /// let mut s = String::from_str_in("bar", &b);
1404     ///
1405     /// s.insert_str(0, "foo");
1406     ///
1407     /// assert_eq!("foobar", s);
1408     /// ```
1409     #[inline]
insert_str(&mut self, idx: usize, string: &str)1410     pub fn insert_str(&mut self, idx: usize, string: &str) {
1411         assert!(self.is_char_boundary(idx));
1412 
1413         unsafe {
1414             self.insert_bytes(idx, string.as_bytes());
1415         }
1416     }
1417 
1418     /// Returns a mutable reference to the contents of this `String`.
1419     ///
1420     /// # Safety
1421     ///
1422     /// This function is unsafe because it does not check that the bytes passed
1423     /// to it are valid UTF-8. If this constraint is violated, it may cause
1424     /// memory unsafety issues with future users of the `String`, as the rest of
1425     /// the standard library assumes that `String`s are valid UTF-8.
1426     ///
1427     /// # Examples
1428     ///
1429     /// Basic usage:
1430     ///
1431     /// ```
1432     /// use bumpalo::{Bump, collections::String};
1433     ///
1434     /// let b = Bump::new();
1435     ///
1436     /// let mut s = String::from_str_in("hello", &b);
1437     ///
1438     /// unsafe {
1439     ///     let vec = s.as_mut_vec();
1440     ///     assert_eq!(&[104, 101, 108, 108, 111][..], &vec[..]);
1441     ///
1442     ///     vec.reverse();
1443     /// }
1444     /// assert_eq!(s, "olleh");
1445     /// ```
1446     #[inline]
as_mut_vec(&mut self) -> &mut Vec<'bump, u8>1447     pub unsafe fn as_mut_vec(&mut self) -> &mut Vec<'bump, u8> {
1448         &mut self.vec
1449     }
1450 
1451     /// Returns the length of this `String`, in bytes.
1452     ///
1453     /// # Examples
1454     ///
1455     /// Basic usage:
1456     ///
1457     /// ```
1458     /// use bumpalo::{Bump, collections::String};
1459     ///
1460     /// let b = Bump::new();
1461     ///
1462     /// let a = String::from_str_in("foo", &b);
1463     ///
1464     /// assert_eq!(a.len(), 3);
1465     /// ```
1466     #[inline]
len(&self) -> usize1467     pub fn len(&self) -> usize {
1468         self.vec.len()
1469     }
1470 
1471     /// Returns `true` if this `String` has a length of zero.
1472     ///
1473     /// Returns `false` otherwise.
1474     ///
1475     /// # Examples
1476     ///
1477     /// Basic usage:
1478     ///
1479     /// ```
1480     /// use bumpalo::{Bump, collections::String};
1481     ///
1482     /// let b = Bump::new();
1483     ///
1484     /// let mut v = String::new_in(&b);
1485     /// assert!(v.is_empty());
1486     ///
1487     /// v.push('a');
1488     /// assert!(!v.is_empty());
1489     /// ```
1490     #[inline]
is_empty(&self) -> bool1491     pub fn is_empty(&self) -> bool {
1492         self.len() == 0
1493     }
1494 
1495     /// Splits the string into two at the given index.
1496     ///
1497     /// Returns a newly allocated `String`. `self` contains bytes `[0, at)`, and
1498     /// the returned `String` contains bytes `[at, len)`. `at` must be on the
1499     /// boundary of a UTF-8 code point.
1500     ///
1501     /// Note that the capacity of `self` does not change.
1502     ///
1503     /// # Panics
1504     ///
1505     /// Panics if `at` is not on a `UTF-8` code point boundary, or if it is beyond the last
1506     /// code point of the string.
1507     ///
1508     /// # Examples
1509     ///
1510     /// ```
1511     /// use bumpalo::{Bump, collections::String};
1512     ///
1513     /// let b = Bump::new();
1514     ///
1515     /// let mut hello = String::from_str_in("Hello, World!", &b);
1516     /// let world = hello.split_off(7);
1517     /// assert_eq!(hello, "Hello, ");
1518     /// assert_eq!(world, "World!");
1519     /// ```
1520     #[inline]
split_off(&mut self, at: usize) -> String<'bump>1521     pub fn split_off(&mut self, at: usize) -> String<'bump> {
1522         assert!(self.is_char_boundary(at));
1523         let other = self.vec.split_off(at);
1524         unsafe { String::from_utf8_unchecked(other) }
1525     }
1526 
1527     /// Truncates this `String`, removing all contents.
1528     ///
1529     /// While this means the `String` will have a length of zero, it does not
1530     /// touch its capacity.
1531     ///
1532     /// # Examples
1533     ///
1534     /// Basic usage:
1535     ///
1536     /// ```
1537     /// use bumpalo::{Bump, collections::String};
1538     ///
1539     /// let b = Bump::new();
1540     ///
1541     /// let mut s = String::from_str_in("foo", &b);
1542     ///
1543     /// s.clear();
1544     ///
1545     /// assert!(s.is_empty());
1546     /// assert_eq!(0, s.len());
1547     /// assert_eq!(3, s.capacity());
1548     /// ```
1549     #[inline]
clear(&mut self)1550     pub fn clear(&mut self) {
1551         self.vec.clear()
1552     }
1553 
1554     /// Creates a draining iterator that removes the specified range in the `String`
1555     /// and yields the removed `chars`.
1556     ///
1557     /// Note: The element range is removed even if the iterator is not
1558     /// consumed until the end.
1559     ///
1560     /// # Panics
1561     ///
1562     /// Panics if the starting point or end point do not lie on a [`char`]
1563     /// boundary, or if they're out of bounds.
1564     ///
1565     /// [`char`]: https://doc.rust-lang.org/nightly/std/primitive.char.html
1566     ///
1567     /// # Examples
1568     ///
1569     /// Basic usage:
1570     ///
1571     /// ```
1572     /// use bumpalo::{Bump, collections::String};
1573     ///
1574     /// let b = Bump::new();
1575     ///
1576     /// let mut s = String::from_str_in("α is alpha, β is beta", &b);
1577     /// let beta_offset = s.find('β').unwrap_or(s.len());
1578     ///
1579     /// // Remove the range up until the β from the string
1580     /// let t = String::from_iter_in(s.drain(..beta_offset), &b);
1581     /// assert_eq!(t, "α is alpha, ");
1582     /// assert_eq!(s, "β is beta");
1583     ///
1584     /// // A full range clears the string
1585     /// s.drain(..);
1586     /// assert_eq!(s, "");
1587     /// ```
drain<'a, R>(&'a mut self, range: R) -> Drain<'a, 'bump> where R: RangeBounds<usize>,1588     pub fn drain<'a, R>(&'a mut self, range: R) -> Drain<'a, 'bump>
1589     where
1590         R: RangeBounds<usize>,
1591     {
1592         // Memory safety
1593         //
1594         // The String version of Drain does not have the memory safety issues
1595         // of the vector version. The data is just plain bytes.
1596         // Because the range removal happens in Drop, if the Drain iterator is leaked,
1597         // the removal will not happen.
1598         let len = self.len();
1599         let start = match range.start_bound() {
1600             Included(&n) => n,
1601             Excluded(&n) => n + 1,
1602             Unbounded => 0,
1603         };
1604         let end = match range.end_bound() {
1605             Included(&n) => n + 1,
1606             Excluded(&n) => n,
1607             Unbounded => len,
1608         };
1609 
1610         // Take out two simultaneous borrows. The &mut String won't be accessed
1611         // until iteration is over, in Drop.
1612         let self_ptr = self as *mut _;
1613         // slicing does the appropriate bounds checks
1614         let chars_iter = self[start..end].chars();
1615 
1616         Drain {
1617             start,
1618             end,
1619             iter: chars_iter,
1620             string: self_ptr,
1621         }
1622     }
1623 
1624     /// Removes the specified range in the string,
1625     /// and replaces it with the given string.
1626     /// The given string doesn't need to be the same length as the range.
1627     ///
1628     /// # Panics
1629     ///
1630     /// Panics if the starting point or end point do not lie on a [`char`]
1631     /// boundary, or if they're out of bounds.
1632     ///
1633     /// [`char`]: https://doc.rust-lang.org/nightly/std/primitive.char.html
1634     /// [`Vec::splice`]: ../vec/struct.Vec.html#method.splice
1635     ///
1636     /// # Examples
1637     ///
1638     /// Basic usage:
1639     ///
1640     /// ```
1641     /// use bumpalo::{Bump, collections::String};
1642     ///
1643     /// let b = Bump::new();
1644     ///
1645     /// let mut s = String::from_str_in("α is alpha, β is beta", &b);
1646     /// let beta_offset = s.find('β').unwrap_or(s.len());
1647     ///
1648     /// // Replace the range up until the β from the string
1649     /// s.replace_range(..beta_offset, "Α is capital alpha; ");
1650     /// assert_eq!(s, "Α is capital alpha; β is beta");
1651     /// ```
replace_range<R>(&mut self, range: R, replace_with: &str) where R: RangeBounds<usize>,1652     pub fn replace_range<R>(&mut self, range: R, replace_with: &str)
1653     where
1654         R: RangeBounds<usize>,
1655     {
1656         // Memory safety
1657         //
1658         // Replace_range does not have the memory safety issues of a vector Splice.
1659         // of the vector version. The data is just plain bytes.
1660 
1661         match range.start_bound() {
1662             Included(&n) => assert!(self.is_char_boundary(n)),
1663             Excluded(&n) => assert!(self.is_char_boundary(n + 1)),
1664             Unbounded => {}
1665         };
1666         match range.end_bound() {
1667             Included(&n) => assert!(self.is_char_boundary(n + 1)),
1668             Excluded(&n) => assert!(self.is_char_boundary(n)),
1669             Unbounded => {}
1670         };
1671 
1672         unsafe { self.as_mut_vec() }.splice(range, replace_with.bytes());
1673     }
1674 }
1675 
1676 impl<'bump> FromUtf8Error<'bump> {
1677     /// Returns a slice of [`u8`]s bytes that were attempted to convert to a `String`.
1678     ///
1679     /// # Examples
1680     ///
1681     /// Basic usage:
1682     ///
1683     /// ```
1684     /// use bumpalo::{Bump, collections::String};
1685     ///
1686     /// let b = Bump::new();
1687     ///
1688     /// // some invalid bytes, in a vector
1689     /// let bytes = bumpalo::vec![in &b; 0, 159];
1690     ///
1691     /// let value = String::from_utf8(bytes);
1692     ///
1693     /// assert_eq!(&[0, 159], value.unwrap_err().as_bytes());
1694     /// ```
as_bytes(&self) -> &[u8]1695     pub fn as_bytes(&self) -> &[u8] {
1696         &self.bytes[..]
1697     }
1698 
1699     /// Returns the bytes that were attempted to convert to a `String`.
1700     ///
1701     /// This method is carefully constructed to avoid allocation. It will
1702     /// consume the error, moving out the bytes, so that a copy of the bytes
1703     /// does not need to be made.
1704     ///
1705     /// # Examples
1706     ///
1707     /// Basic usage:
1708     ///
1709     /// ```
1710     /// use bumpalo::{Bump, collections::String};
1711     ///
1712     /// let b = Bump::new();
1713     ///
1714     /// // some invalid bytes, in a vector
1715     /// let bytes = bumpalo::vec![in &b; 0, 159];
1716     ///
1717     /// let value = String::from_utf8(bytes);
1718     ///
1719     /// assert_eq!(bumpalo::vec![in &b; 0, 159], value.unwrap_err().into_bytes());
1720     /// ```
into_bytes(self) -> Vec<'bump, u8>1721     pub fn into_bytes(self) -> Vec<'bump, u8> {
1722         self.bytes
1723     }
1724 
1725     /// Fetch a `Utf8Error` to get more details about the conversion failure.
1726     ///
1727     /// The [`Utf8Error`] type provided by [`std::str`] represents an error that may
1728     /// occur when converting a slice of [`u8`]s to a [`&str`]. In this sense, it's
1729     /// an analogue to `FromUtf8Error`. See its documentation for more details
1730     /// on using it.
1731     ///
1732     /// [`Utf8Error`]: https://doc.rust-lang.org/nightly/std/str/struct.Utf8Error.html
1733     /// [`std::str`]: https://doc.rust-lang.org/nightly/std/str/index.html
1734     /// [`u8`]: https://doc.rust-lang.org/nightly/std/primitive.u8.html
1735     /// [`&str`]: https://doc.rust-lang.org/nightly/std/primitive.str.html
1736     ///
1737     /// # Examples
1738     ///
1739     /// Basic usage:
1740     ///
1741     /// ```
1742     /// use bumpalo::{Bump, collections::String};
1743     ///
1744     /// let b = Bump::new();
1745     ///
1746     /// // some invalid bytes, in a vector
1747     /// let bytes = bumpalo::vec![in &b; 0, 159];
1748     ///
1749     /// let error = String::from_utf8(bytes).unwrap_err().utf8_error();
1750     ///
1751     /// // the first byte is invalid here
1752     /// assert_eq!(1, error.valid_up_to());
1753     /// ```
utf8_error(&self) -> Utf8Error1754     pub fn utf8_error(&self) -> Utf8Error {
1755         self.error
1756     }
1757 }
1758 
1759 impl<'bump> fmt::Display for FromUtf8Error<'bump> {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result1760     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1761         fmt::Display::fmt(&self.error, f)
1762     }
1763 }
1764 
1765 impl fmt::Display for FromUtf16Error {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result1766     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1767         fmt::Display::fmt("invalid utf-16: lone surrogate found", f)
1768     }
1769 }
1770 
1771 impl<'bump> Clone for String<'bump> {
clone(&self) -> Self1772     fn clone(&self) -> Self {
1773         String {
1774             vec: self.vec.clone(),
1775         }
1776     }
1777 
clone_from(&mut self, source: &Self)1778     fn clone_from(&mut self, source: &Self) {
1779         self.vec.clone_from(&source.vec);
1780     }
1781 }
1782 
1783 impl<'bump> Extend<char> for String<'bump> {
extend<I: IntoIterator<Item = char>>(&mut self, iter: I)1784     fn extend<I: IntoIterator<Item = char>>(&mut self, iter: I) {
1785         let iterator = iter.into_iter();
1786         let (lower_bound, _) = iterator.size_hint();
1787         self.reserve(lower_bound);
1788         for ch in iterator {
1789             self.push(ch)
1790         }
1791     }
1792 }
1793 
1794 impl<'a, 'bump> Extend<&'a char> for String<'bump> {
extend<I: IntoIterator<Item = &'a char>>(&mut self, iter: I)1795     fn extend<I: IntoIterator<Item = &'a char>>(&mut self, iter: I) {
1796         self.extend(iter.into_iter().cloned());
1797     }
1798 }
1799 
1800 impl<'a, 'bump> Extend<&'a str> for String<'bump> {
extend<I: IntoIterator<Item = &'a str>>(&mut self, iter: I)1801     fn extend<I: IntoIterator<Item = &'a str>>(&mut self, iter: I) {
1802         for s in iter {
1803             self.push_str(s)
1804         }
1805     }
1806 }
1807 
1808 impl<'bump> Extend<String<'bump>> for String<'bump> {
extend<I: IntoIterator<Item = String<'bump>>>(&mut self, iter: I)1809     fn extend<I: IntoIterator<Item = String<'bump>>>(&mut self, iter: I) {
1810         for s in iter {
1811             self.push_str(&s)
1812         }
1813     }
1814 }
1815 
1816 impl<'bump> Extend<core_alloc::string::String> for String<'bump> {
extend<I: IntoIterator<Item = core_alloc::string::String>>(&mut self, iter: I)1817     fn extend<I: IntoIterator<Item = core_alloc::string::String>>(&mut self, iter: I) {
1818         for s in iter {
1819             self.push_str(&s)
1820         }
1821     }
1822 }
1823 
1824 impl<'a, 'bump> Extend<Cow<'a, str>> for String<'bump> {
extend<I: IntoIterator<Item = Cow<'a, str>>>(&mut self, iter: I)1825     fn extend<I: IntoIterator<Item = Cow<'a, str>>>(&mut self, iter: I) {
1826         for s in iter {
1827             self.push_str(&s)
1828         }
1829     }
1830 }
1831 
1832 impl<'bump> PartialEq for String<'bump> {
1833     #[inline]
eq(&self, other: &String) -> bool1834     fn eq(&self, other: &String) -> bool {
1835         PartialEq::eq(&self[..], &other[..])
1836     }
1837 }
1838 
1839 macro_rules! impl_eq {
1840     ($lhs:ty, $rhs: ty) => {
1841         impl<'a, 'bump> PartialEq<$rhs> for $lhs {
1842             #[inline]
1843             fn eq(&self, other: &$rhs) -> bool {
1844                 PartialEq::eq(&self[..], &other[..])
1845             }
1846         }
1847 
1848         impl<'a, 'b, 'bump> PartialEq<$lhs> for $rhs {
1849             #[inline]
1850             fn eq(&self, other: &$lhs) -> bool {
1851                 PartialEq::eq(&self[..], &other[..])
1852             }
1853         }
1854     };
1855 }
1856 
1857 impl_eq! { String<'bump>, str }
1858 impl_eq! { String<'bump>, &'a str }
1859 impl_eq! { Cow<'a, str>, String<'bump> }
1860 impl_eq! { core_alloc::string::String, String<'bump> }
1861 
1862 impl<'bump> fmt::Display for String<'bump> {
1863     #[inline]
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result1864     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1865         fmt::Display::fmt(&**self, f)
1866     }
1867 }
1868 
1869 impl<'bump> fmt::Debug for String<'bump> {
1870     #[inline]
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result1871     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1872         fmt::Debug::fmt(&**self, f)
1873     }
1874 }
1875 
1876 impl<'bump> hash::Hash for String<'bump> {
1877     #[inline]
hash<H: hash::Hasher>(&self, hasher: &mut H)1878     fn hash<H: hash::Hasher>(&self, hasher: &mut H) {
1879         (**self).hash(hasher)
1880     }
1881 }
1882 
1883 /// Implements the `+` operator for concatenating two strings.
1884 ///
1885 /// This consumes the `String<'bump>` on the left-hand side and re-uses its buffer (growing it if
1886 /// necessary). This is done to avoid allocating a new `String<'bump>` and copying the entire contents on
1887 /// every operation, which would lead to `O(n^2)` running time when building an `n`-byte string by
1888 /// repeated concatenation.
1889 ///
1890 /// The string on the right-hand side is only borrowed; its contents are copied into the returned
1891 /// `String<'bump>`.
1892 ///
1893 /// # Examples
1894 ///
1895 /// Concatenating two `String<'bump>`s takes the first by value and borrows the second:
1896 ///
1897 /// ```
1898 /// use bumpalo::{Bump, collections::String};
1899 ///
1900 /// let bump = Bump::new();
1901 ///
1902 /// let a = String::from_str_in("hello", &bump);
1903 /// let b = String::from_str_in(" world", &bump);
1904 /// let c = a + &b;
1905 /// // `a` is moved and can no longer be used here.
1906 /// ```
1907 ///
1908 /// If you want to keep using the first `String`, you can clone it and append to the clone instead:
1909 ///
1910 /// ```
1911 /// use bumpalo::{Bump, collections::String};
1912 ///
1913 /// let bump = Bump::new();
1914 ///
1915 /// let a = String::from_str_in("hello", &bump);
1916 /// let b = String::from_str_in(" world", &bump);
1917 /// let c = a.clone() + &b;
1918 /// // `a` is still valid here.
1919 /// ```
1920 ///
1921 /// Concatenating `&str` slices can be done by converting the first to a `String`:
1922 ///
1923 /// ```
1924 /// use bumpalo::{Bump, collections::String};
1925 ///
1926 /// let b = Bump::new();
1927 ///
1928 /// let a = "hello";
1929 /// let b = " world";
1930 /// let c = a.to_string() + b;
1931 /// ```
1932 impl<'a, 'bump> Add<&'a str> for String<'bump> {
1933     type Output = String<'bump>;
1934 
1935     #[inline]
add(mut self, other: &str) -> String<'bump>1936     fn add(mut self, other: &str) -> String<'bump> {
1937         self.push_str(other);
1938         self
1939     }
1940 }
1941 
1942 /// Implements the `+=` operator for appending to a `String<'bump>`.
1943 ///
1944 /// This has the same behavior as the [`push_str`][String::push_str] method.
1945 impl<'a, 'bump> AddAssign<&'a str> for String<'bump> {
1946     #[inline]
add_assign(&mut self, other: &str)1947     fn add_assign(&mut self, other: &str) {
1948         self.push_str(other);
1949     }
1950 }
1951 
1952 impl<'bump> ops::Index<ops::Range<usize>> for String<'bump> {
1953     type Output = str;
1954 
1955     #[inline]
index(&self, index: ops::Range<usize>) -> &str1956     fn index(&self, index: ops::Range<usize>) -> &str {
1957         &self[..][index]
1958     }
1959 }
1960 impl<'bump> ops::Index<ops::RangeTo<usize>> for String<'bump> {
1961     type Output = str;
1962 
1963     #[inline]
index(&self, index: ops::RangeTo<usize>) -> &str1964     fn index(&self, index: ops::RangeTo<usize>) -> &str {
1965         &self[..][index]
1966     }
1967 }
1968 impl<'bump> ops::Index<ops::RangeFrom<usize>> for String<'bump> {
1969     type Output = str;
1970 
1971     #[inline]
index(&self, index: ops::RangeFrom<usize>) -> &str1972     fn index(&self, index: ops::RangeFrom<usize>) -> &str {
1973         &self[..][index]
1974     }
1975 }
1976 impl<'bump> ops::Index<ops::RangeFull> for String<'bump> {
1977     type Output = str;
1978 
1979     #[inline]
index(&self, _index: ops::RangeFull) -> &str1980     fn index(&self, _index: ops::RangeFull) -> &str {
1981         unsafe { str::from_utf8_unchecked(&self.vec) }
1982     }
1983 }
1984 impl<'bump> ops::Index<ops::RangeInclusive<usize>> for String<'bump> {
1985     type Output = str;
1986 
1987     #[inline]
index(&self, index: ops::RangeInclusive<usize>) -> &str1988     fn index(&self, index: ops::RangeInclusive<usize>) -> &str {
1989         Index::index(&**self, index)
1990     }
1991 }
1992 impl<'bump> ops::Index<ops::RangeToInclusive<usize>> for String<'bump> {
1993     type Output = str;
1994 
1995     #[inline]
index(&self, index: ops::RangeToInclusive<usize>) -> &str1996     fn index(&self, index: ops::RangeToInclusive<usize>) -> &str {
1997         Index::index(&**self, index)
1998     }
1999 }
2000 
2001 impl<'bump> ops::IndexMut<ops::Range<usize>> for String<'bump> {
2002     #[inline]
index_mut(&mut self, index: ops::Range<usize>) -> &mut str2003     fn index_mut(&mut self, index: ops::Range<usize>) -> &mut str {
2004         &mut self[..][index]
2005     }
2006 }
2007 impl<'bump> ops::IndexMut<ops::RangeTo<usize>> for String<'bump> {
2008     #[inline]
index_mut(&mut self, index: ops::RangeTo<usize>) -> &mut str2009     fn index_mut(&mut self, index: ops::RangeTo<usize>) -> &mut str {
2010         &mut self[..][index]
2011     }
2012 }
2013 impl<'bump> ops::IndexMut<ops::RangeFrom<usize>> for String<'bump> {
2014     #[inline]
index_mut(&mut self, index: ops::RangeFrom<usize>) -> &mut str2015     fn index_mut(&mut self, index: ops::RangeFrom<usize>) -> &mut str {
2016         &mut self[..][index]
2017     }
2018 }
2019 impl<'bump> ops::IndexMut<ops::RangeFull> for String<'bump> {
2020     #[inline]
index_mut(&mut self, _index: ops::RangeFull) -> &mut str2021     fn index_mut(&mut self, _index: ops::RangeFull) -> &mut str {
2022         unsafe { str::from_utf8_unchecked_mut(&mut *self.vec) }
2023     }
2024 }
2025 impl<'bump> ops::IndexMut<ops::RangeInclusive<usize>> for String<'bump> {
2026     #[inline]
index_mut(&mut self, index: ops::RangeInclusive<usize>) -> &mut str2027     fn index_mut(&mut self, index: ops::RangeInclusive<usize>) -> &mut str {
2028         IndexMut::index_mut(&mut **self, index)
2029     }
2030 }
2031 impl<'bump> ops::IndexMut<ops::RangeToInclusive<usize>> for String<'bump> {
2032     #[inline]
index_mut(&mut self, index: ops::RangeToInclusive<usize>) -> &mut str2033     fn index_mut(&mut self, index: ops::RangeToInclusive<usize>) -> &mut str {
2034         IndexMut::index_mut(&mut **self, index)
2035     }
2036 }
2037 
2038 impl<'bump> ops::Deref for String<'bump> {
2039     type Target = str;
2040 
2041     #[inline]
deref(&self) -> &str2042     fn deref(&self) -> &str {
2043         unsafe { str::from_utf8_unchecked(&self.vec) }
2044     }
2045 }
2046 
2047 impl<'bump> ops::DerefMut for String<'bump> {
2048     #[inline]
deref_mut(&mut self) -> &mut str2049     fn deref_mut(&mut self) -> &mut str {
2050         unsafe { str::from_utf8_unchecked_mut(&mut *self.vec) }
2051     }
2052 }
2053 
2054 impl<'bump> AsRef<str> for String<'bump> {
2055     #[inline]
as_ref(&self) -> &str2056     fn as_ref(&self) -> &str {
2057         self
2058     }
2059 }
2060 
2061 impl<'bump> AsRef<[u8]> for String<'bump> {
2062     #[inline]
as_ref(&self) -> &[u8]2063     fn as_ref(&self) -> &[u8] {
2064         self.as_bytes()
2065     }
2066 }
2067 
2068 impl<'bump> fmt::Write for String<'bump> {
2069     #[inline]
write_str(&mut self, s: &str) -> fmt::Result2070     fn write_str(&mut self, s: &str) -> fmt::Result {
2071         self.push_str(s);
2072         Ok(())
2073     }
2074 
2075     #[inline]
write_char(&mut self, c: char) -> fmt::Result2076     fn write_char(&mut self, c: char) -> fmt::Result {
2077         self.push(c);
2078         Ok(())
2079     }
2080 }
2081 
2082 /// A draining iterator for `String`.
2083 ///
2084 /// This struct is created by the [`drain`] method on [`String`]. See its
2085 /// documentation for more.
2086 ///
2087 /// [`drain`]: struct.String.html#method.drain
2088 /// [`String`]: struct.String.html
2089 pub struct Drain<'a, 'bump> {
2090     /// Will be used as &'a mut String in the destructor
2091     string: *mut String<'bump>,
2092     /// Start of part to remove
2093     start: usize,
2094     /// End of part to remove
2095     end: usize,
2096     /// Current remaining range to remove
2097     iter: Chars<'a>,
2098 }
2099 
2100 impl<'a, 'bump> fmt::Debug for Drain<'a, 'bump> {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result2101     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2102         f.pad("Drain { .. }")
2103     }
2104 }
2105 
2106 unsafe impl<'a, 'bump> Sync for Drain<'a, 'bump> {}
2107 unsafe impl<'a, 'bump> Send for Drain<'a, 'bump> {}
2108 
2109 impl<'a, 'bump> Drop for Drain<'a, 'bump> {
drop(&mut self)2110     fn drop(&mut self) {
2111         unsafe {
2112             // Use Vec::drain. "Reaffirm" the bounds checks to avoid
2113             // panic code being inserted again.
2114             let self_vec = (*self.string).as_mut_vec();
2115             if self.start <= self.end && self.end <= self_vec.len() {
2116                 self_vec.drain(self.start..self.end);
2117             }
2118         }
2119     }
2120 }
2121 
2122 impl<'a, 'bump> Iterator for Drain<'a, 'bump> {
2123     type Item = char;
2124 
2125     #[inline]
next(&mut self) -> Option<char>2126     fn next(&mut self) -> Option<char> {
2127         self.iter.next()
2128     }
2129 
size_hint(&self) -> (usize, Option<usize>)2130     fn size_hint(&self) -> (usize, Option<usize>) {
2131         self.iter.size_hint()
2132     }
2133 }
2134 
2135 impl<'a, 'bump> DoubleEndedIterator for Drain<'a, 'bump> {
2136     #[inline]
next_back(&mut self) -> Option<char>2137     fn next_back(&mut self) -> Option<char> {
2138         self.iter.next_back()
2139     }
2140 }
2141 
2142 impl<'a, 'bump> FusedIterator for Drain<'a, 'bump> {}
2143