Merge pull request #649 from serde-rs/fused

Implement FusedIterator where possible
This commit is contained in:
David Tolnay 2020-04-04 16:35:08 -07:00 committed by GitHub
commit 8e76584c20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 16 additions and 1 deletions

View File

@ -4,7 +4,7 @@ use crate::error::{Error, ErrorCode, Result};
use crate::lib::str::FromStr;
use crate::lib::*;
use crate::number::Number;
use crate::read::{self, Reference};
use crate::read::{self, Fused, Reference};
use serde::de::{self, Expected, Unexpected};
use serde::{forward_to_deserialize_any, serde_if_integer128};
@ -2181,6 +2181,13 @@ where
}
}
impl<'de, R, T> FusedIterator for StreamDeserializer<'de, R, T>
where
R: Read<'de> + Fused,
T: de::Deserialize<'de>,
{
}
//////////////////////////////////////////////////////////////////////////////
fn from_trait<'de, R, T>(read: R) -> Result<T>

View File

@ -363,6 +363,7 @@ mod lib {
pub use self::core::default::{self, Default};
pub use self::core::fmt::{self, Debug, Display};
pub use self::core::hash::{self, Hash};
pub use self::core::iter::FusedIterator;
pub use self::core::marker::{self, PhantomData};
pub use self::core::result::{self, Result};
pub use self::core::{borrow, char, cmp, iter, mem, num, ops, slice, str};

View File

@ -397,6 +397,8 @@ macro_rules! delegate_iterator {
self.iter.len()
}
}
impl $($generics)* FusedIterator for $name $($generics)* {}
}
}

View File

@ -718,6 +718,11 @@ impl<'a> Read<'a> for StrRead<'a> {
//////////////////////////////////////////////////////////////////////////////
/// Marker for whether StreamDeserializer can implement FusedIterator.
pub trait Fused: private::Sealed {}
impl<'a> Fused for SliceRead<'a> {}
impl<'a> Fused for StrRead<'a> {}
// Lookup table of bytes that must be escaped. A value of true at index i means
// that byte i requires an escape sequence in the input.
static ESCAPE: [bool; 256] = {