/// Creates a vector by repeating a slice `n` times.
///
+ /// # Panics
+ ///
+ /// This function will panic if the capacity would overflow.
+ ///
/// # Examples
///
/// Basic usage:
/// assert_eq!([1, 2].repeat(3), vec![1, 2, 1, 2, 1, 2]);
/// }
/// ```
+ ///
+ /// A panic upon overflow:
+ ///
+ /// ```should_panic
+ /// #![feature(repeat_generic_slice)]
+ /// fn main() {
+ /// // this will panic at runtime
+ /// b"0123456789abcdef".repeat(usize::max_value());
+ /// }
+ /// ```
#[unstable(feature = "repeat_generic_slice",
reason = "it's on str, why not on slice?",
issue = "48784")]
// and `rem` is the remaining part of `n`.
// Using `Vec` to access `set_len()`.
- let mut buf = Vec::with_capacity(self.len() * n);
+ let mut buf = Vec::with_capacity(self.len().checked_mul(n).expect("capacity overflow"));
// `2^expn` repetition is done by doubling `buf` `expn`-times.
buf.extend(self);
/// Creates a new [`String`] by repeating a string `n` times.
///
+ /// # Panics
+ ///
+ /// This function will panic if the capacity would overflow.
+ ///
/// [`String`]: string/struct.String.html
///
/// # Examples
/// ```
/// assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
/// ```
+ ///
+ /// A panic upon overflow:
+ ///
+ /// ```should_panic
+ /// fn main() {
+ /// // this will panic at runtime
+ /// "0123456789abcdef".repeat(usize::max_value());
+ /// }
+ /// ```
#[stable(feature = "repeat_str", since = "1.16.0")]
pub fn repeat(&self, n: usize) -> String {
unsafe { String::from_utf8_unchecked(self.as_bytes().repeat(n)) }