mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
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:
+23
-50
@@ -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))]
|
||||
|
||||
Reference in New Issue
Block a user