Skip to content

Commit 8e76584

Browse files
authored
Merge pull request #649 from serde-rs/fused
Implement FusedIterator where possible
2 parents 4c81923 + d133748 commit 8e76584

File tree

4 files changed

+16
-1
lines changed

4 files changed

+16
-1
lines changed

src/de.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::error::{Error, ErrorCode, Result};
44
use crate::lib::str::FromStr;
55
use crate::lib::*;
66
use crate::number::Number;
7-
use crate::read::{self, Reference};
7+
use crate::read::{self, Fused, Reference};
88
use serde::de::{self, Expected, Unexpected};
99
use serde::{forward_to_deserialize_any, serde_if_integer128};
1010

@@ -2181,6 +2181,13 @@ where
21812181
}
21822182
}
21832183

2184+
impl<'de, R, T> FusedIterator for StreamDeserializer<'de, R, T>
2185+
where
2186+
R: Read<'de> + Fused,
2187+
T: de::Deserialize<'de>,
2188+
{
2189+
}
2190+
21842191
//////////////////////////////////////////////////////////////////////////////
21852192

21862193
fn from_trait<'de, R, T>(read: R) -> Result<T>

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ mod lib {
363363
pub use self::core::default::{self, Default};
364364
pub use self::core::fmt::{self, Debug, Display};
365365
pub use self::core::hash::{self, Hash};
366+
pub use self::core::iter::FusedIterator;
366367
pub use self::core::marker::{self, PhantomData};
367368
pub use self::core::result::{self, Result};
368369
pub use self::core::{borrow, char, cmp, iter, mem, num, ops, slice, str};

src/map.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,8 @@ macro_rules! delegate_iterator {
397397
self.iter.len()
398398
}
399399
}
400+
401+
impl $($generics)* FusedIterator for $name $($generics)* {}
400402
}
401403
}
402404

src/read.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,11 @@ impl<'a> Read<'a> for StrRead<'a> {
718718

719719
//////////////////////////////////////////////////////////////////////////////
720720

721+
/// Marker for whether StreamDeserializer can implement FusedIterator.
722+
pub trait Fused: private::Sealed {}
723+
impl<'a> Fused for SliceRead<'a> {}
724+
impl<'a> Fused for StrRead<'a> {}
725+
721726
// Lookup table of bytes that must be escaped. A value of true at index i means
722727
// that byte i requires an escape sequence in the input.
723728
static ESCAPE: [bool; 256] = {

0 commit comments

Comments
 (0)