Rollup merge of #145562 - tbu-:pr_simplify_to_string_spec, r=tgross35

Simplify macro generating ToString implementations for `&…&str`

Use deref coercion to let the compiler remove any amount of references. Also use that macro for `Cow` and `String`.
This commit is contained in:
Matthias Krüger
2025-08-27 11:26:49 +02:00
committed by GitHub
+23 -50
View File
@@ -2939,68 +2939,41 @@ fn spec_to_string(&self) -> String {
}
}
// 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.
#[cfg(not(no_global_oom_handling))]
macro_rules! to_string_str_wrap_in_ref {
{x $($x:ident)*} => {
&to_string_str_wrap_in_ref! { $($x)* }
};
{} => { str };
}
#[cfg(not(no_global_oom_handling))]
macro_rules! to_string_expr_wrap_in_deref {
{$self:expr ; x $($x:ident)*} => {
*(to_string_expr_wrap_in_deref! { $self ; $($x)* })
};
{$self:expr ;} => { $self };
}
#[cfg(not(no_global_oom_handling))]
macro_rules! to_string_str {
{$($($x:ident)*),+} => {
{$($type:ty,)*} => {
$(
impl SpecToString for to_string_str_wrap_in_ref!($($x)*) {
impl SpecToString for $type {
#[inline]
fn spec_to_string(&self) -> String {
String::from(to_string_expr_wrap_in_deref!(self ; $($x)*))
let s: &str = self;
String::from(s)
}
}
)+
)*
};
}
#[cfg(not(no_global_oom_handling))]
to_string_str! {
x x x x x x x x x x x x,
x x x x x x x x x x x,
x x x x x x x x x x,
x x x x x x x x x,
x x x x x x x x,
x x x x x x x,
x x x x x x,
x x x x x,
x x x x,
x x x,
x x,
x,
}
#[cfg(not(no_global_oom_handling))]
impl SpecToString for Cow<'_, str> {
#[inline]
fn spec_to_string(&self) -> String {
self[..].to_owned()
}
}
#[cfg(not(no_global_oom_handling))]
impl SpecToString for String {
#[inline]
fn spec_to_string(&self) -> String {
self.to_owned()
}
Cow<'_, str>,
String,
// Generic/generated code can sometimes have multiple, nested references
// for strings, including `&&&str`s that would never be written
// by hand.
&&&&&&&&&&&&str,
&&&&&&&&&&&str,
&&&&&&&&&&str,
&&&&&&&&&str,
&&&&&&&&str,
&&&&&&&str,
&&&&&&str,
&&&&&str,
&&&&str,
&&&str,
&&str,
&str,
str,
}
#[cfg(not(no_global_oom_handling))]