Skip to content

Commit

Permalink
alloc: add ToString specialization for &&str
Browse files Browse the repository at this point in the history
  • Loading branch information
notriddle committed Aug 6, 2024
1 parent 5674d1c commit bc13c6c
Showing 1 changed file with 35 additions and 8 deletions.
43 changes: 35 additions & 8 deletions alloc/src/string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2643,14 +2643,41 @@ impl ToString for i8 {
}
}

#[doc(hidden)]
#[cfg(not(no_global_oom_handling))]
#[stable(feature = "str_to_string_specialization", since = "1.9.0")]
impl ToString for str {
#[inline]
fn to_string(&self) -> String {
String::from(self)
}
// Generic/generated code can sometimes have multiple, nested references
// for strings, including `&&&str`s that would never be written
// by hand. This macro generates twelve layers of nested `&`-impl
// for primitive strings.
macro_rules! to_string_str {
{type ; x $($x:ident)*} => {
&to_string_str! { type ; $($x)* }
};
{type ;} => { str };
{impl ; x $($x:ident)*} => {
to_string_str! { $($x)* }
};
{impl ;} => { };
{$self:expr ; x $($x:ident)*} => {
*(to_string_str! { $self ; $($x)* })
};
{$self:expr ;} => { $self };
{$($x:ident)*} => {
#[doc(hidden)]
#[cfg(not(no_global_oom_handling))]
#[stable(feature = "str_to_string_specialization", since = "1.9.0")]
impl ToString for to_string_str!(type ; $($x)*) {
#[inline]
fn to_string(&self) -> String {
String::from(to_string_str!(self ; $($x)*))
}
}
to_string_str! { impl ; $($x)* }
};
}

to_string_str! {
x x x x
x x x x
x x x x
}

#[doc(hidden)]
Expand Down

0 comments on commit bc13c6c

Please sign in to comment.