Use try_fold in default implementation of collect_seq, collect_map

This commit is contained in:
David Tolnay 2021-08-21 13:54:13 -07:00
parent 9451ea8df1
commit 75d8902371
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
2 changed files with 29 additions and 4 deletions

View File

@ -62,8 +62,11 @@ fn main() {
// Inclusive ranges methods stabilized in Rust 1.27: // Inclusive ranges methods stabilized in Rust 1.27:
// https://github.com/rust-lang/rust/pull/50758 // https://github.com/rust-lang/rust/pull/50758
// Also Iterator::try_for_each:
// https://blog.rust-lang.org/2018/06/21/Rust-1.27.html#library-stabilizations
if minor >= 27 { if minor >= 27 {
println!("cargo:rustc-cfg=range_inclusive"); println!("cargo:rustc-cfg=range_inclusive");
println!("cargo:rustc-cfg=iterator_try_fold");
} }
// Non-zero integers stabilized in Rust 1.28: // Non-zero integers stabilized in Rust 1.28:

View File

@ -1279,9 +1279,20 @@ pub trait Serializer: Sized {
{ {
let iter = iter.into_iter(); let iter = iter.into_iter();
let mut serializer = try!(self.serialize_seq(iterator_len_hint(&iter))); let mut serializer = try!(self.serialize_seq(iterator_len_hint(&iter)));
#[cfg(iterator_try_fold)]
{
let mut iter = iter;
try!(iter.try_for_each(|item| serializer.serialize_element(&item)));
}
#[cfg(not(iterator_try_fold))]
{
for item in iter { for item in iter {
try!(serializer.serialize_element(&item)); try!(serializer.serialize_element(&item));
} }
}
serializer.end() serializer.end()
} }
@ -1319,9 +1330,20 @@ pub trait Serializer: Sized {
{ {
let iter = iter.into_iter(); let iter = iter.into_iter();
let mut serializer = try!(self.serialize_map(iterator_len_hint(&iter))); let mut serializer = try!(self.serialize_map(iterator_len_hint(&iter)));
#[cfg(iterator_try_fold)]
{
let mut iter = iter;
try!(iter.try_for_each(|(key, value)| serializer.serialize_entry(&key, &value)));
}
#[cfg(not(iterator_try_fold))]
{
for (key, value) in iter { for (key, value) in iter {
try!(serializer.serialize_entry(&key, &value)); try!(serializer.serialize_entry(&key, &value));
} }
}
serializer.end() serializer.end()
} }