diff options
author | Sean McArthur <sean@seanmonstar.com> | 2020-09-29 07:41:20 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-29 07:41:20 -0700 |
commit | 971ed2c6df9cb3bf3543a9c780662a0b4d1a8d40 (patch) | |
tree | c736262bb89db8b09ba9196eb3c9b400e774b66a /tokio/src/stream | |
parent | dcb11118d2c7260e75c059a89b40eab3e35de53d (diff) |
Seal FromStream methods with an internal argument (#2894)
Diffstat (limited to 'tokio/src/stream')
-rw-r--r-- | tokio/src/stream/collect.rs | 108 |
1 files changed, 63 insertions, 45 deletions
diff --git a/tokio/src/stream/collect.rs b/tokio/src/stream/collect.rs index 46494287..a2b5169f 100644 --- a/tokio/src/stream/collect.rs +++ b/tokio/src/stream/collect.rs @@ -19,7 +19,7 @@ pin_project! { { #[pin] stream: T, - collection: U::Collection, + collection: U::InternalCollection, } } @@ -42,7 +42,7 @@ where { pub(super) fn new(stream: T) -> Collect<T, U> { let (lower, upper) = stream.size_hint(); - let collection = U::initialize(lower, upper); + let collection = U::initialize(sealed::Internal, lower, upper); Collect { stream, collection } } @@ -64,12 +64,12 @@ where let item = match ready!(me.stream.poll_next(cx)) { Some(item) => item, None => { - return Ready(U::finalize(&mut me.collection)); + return Ready(U::finalize(sealed::Internal, &mut me.collection)); } }; - if !U::extend(&mut me.collection, item) { - return Ready(U::finalize(&mut me.collection)); + if !U::extend(sealed::Internal, &mut me.collection, item) { + return Ready(U::finalize(sealed::Internal, &mut me.collection)); } } } @@ -80,32 +80,32 @@ where impl FromStream<()> for () {} impl sealed::FromStreamPriv<()> for () { - type Collection = (); + type InternalCollection = (); - fn initialize(_lower: usize, _upper: Option<usize>) {} + fn initialize(_: sealed::Internal, _lower: usize, _upper: Option<usize>) {} - fn extend(_collection: &mut (), _item: ()) -> bool { + fn extend(_: sealed::Internal, _collection: &mut (), _item: ()) -> bool { true } - fn finalize(_collection: &mut ()) {} + fn finalize(_: sealed::Internal, _collection: &mut ()) {} } impl<T: AsRef<str>> FromStream<T> for String {} impl<T: AsRef<str>> sealed::FromStreamPriv<T> for String { - type Collection = String; + type InternalCollection = String; - fn initialize(_lower: usize, _upper: Option<usize>) -> String { + fn initialize(_: sealed::Internal, _lower: usize, _upper: Option<usize>) -> String { String::new() } - fn extend(collection: &mut String, item: T) -> bool { + fn extend(_: sealed::Internal, collection: &mut String, item: T) -> bool { collection.push_str(item.as_ref()); true } - fn finalize(collection: &mut String) -> String { + fn finalize(_: sealed::Internal, collection: &mut String) -> String { mem::replace(collection, String::new()) } } @@ -113,18 +113,18 @@ impl<T: AsRef<str>> sealed::FromStreamPriv<T> for String { impl<T> FromStream<T> for Vec<T> {} impl<T> sealed::FromStreamPriv<T> for Vec<T> { - type Collection = Vec<T>; + type InternalCollection = Vec<T>; - fn initialize(lower: usize, _upper: Option<usize>) -> Vec<T> { + fn initialize(_: sealed::Internal, lower: usize, _upper: Option<usize>) -> Vec<T> { Vec::with_capacity(lower) } - fn extend(collection: &mut Vec<T>, item: T) -> bool { + fn extend(_: sealed::Internal, collection: &mut Vec<T>, item: T) -> bool { collection.push(item); true } - fn finalize(collection: &mut Vec<T>) -> Vec<T> { + fn finalize(_: sealed::Internal, collection: &mut Vec<T>) -> Vec<T> { mem::replace(collection, vec![]) } } @@ -132,18 +132,19 @@ impl<T> sealed::FromStreamPriv<T> for Vec<T> { impl<T> FromStream<T> for Box<[T]> {} impl<T> sealed::FromStreamPriv<T> for Box<[T]> { - type Collection = Vec<T>; + type InternalCollection = Vec<T>; - fn initialize(lower: usize, upper: Option<usize>) -> Vec<T> { - <Vec<T> as sealed::FromStreamPriv<T>>::initialize(lower, upper) + fn initialize(_: sealed::Internal, lower: usize, upper: Option<usize>) -> Vec<T> { + <Vec<T> as sealed::FromStreamPriv<T>>::initialize(sealed::Internal, lower, upper) } - fn extend(collection: &mut Vec<T>, item: T) -> bool { - <Vec<T> as sealed::FromStreamPriv<T>>::extend(collection, item) + fn extend(_: sealed::Internal, collection: &mut Vec<T>, item: T) -> bool { + <Vec<T> as sealed::FromStreamPriv<T>>::extend(sealed::Internal, collection, item) } - fn finalize(collection: &mut Vec<T>) -> Box<[T]> { - <Vec<T> as sealed::FromStreamPriv<T>>::finalize(collection).into_boxed_slice() + fn finalize(_: sealed::Internal, collection: &mut Vec<T>) -> Box<[T]> { + <Vec<T> as sealed::FromStreamPriv<T>>::finalize(sealed::Internal, collection) + .into_boxed_slice() } } @@ -153,18 +154,26 @@ impl<T, U, E> sealed::FromStreamPriv<Result<T, E>> for Result<U, E> where U: FromStream<T>, { - type Collection = Result<U::Collection, E>; - - fn initialize(lower: usize, upper: Option<usize>) -> Result<U::Collection, E> { - Ok(U::initialize(lower, upper)) + type InternalCollection = Result<U::InternalCollection, E>; + + fn initialize( + _: sealed::Internal, + lower: usize, + upper: Option<usize>, + ) -> Result<U::InternalCollection, E> { + Ok(U::initialize(sealed::Internal, lower, upper)) } - fn extend(collection: &mut Self::Collection, item: Result<T, E>) -> bool { + fn extend( + _: sealed::Internal, + collection: &mut Self::InternalCollection, + item: Result<T, E>, + ) -> bool { assert!(collection.is_ok()); match item { Ok(item) => { let collection = collection.as_mut().ok().expect("invalid state"); - U::extend(collection, item) + U::extend(sealed::Internal, collection, item) } Err(err) => { *collection = Err(err); @@ -173,11 +182,11 @@ where } } - fn finalize(collection: &mut Self::Collection) -> Result<U, E> { + fn finalize(_: sealed::Internal, collection: &mut Self::InternalCollection) -> Result<U, E> { if let Ok(collection) = collection.as_mut() { - Ok(U::finalize(collection)) + Ok(U::finalize(sealed::Internal, collection)) } else { - let res = mem::replace(collection, Ok(U::initialize(0, Some(0)))); + let res = mem::replace(collection, Ok(U::initialize(sealed::Internal, 0, Some(0)))); if let Err(err) = res { Err(err) @@ -191,18 +200,18 @@ where impl<T: Buf> FromStream<T> for Bytes {} impl<T: Buf> sealed::FromStreamPriv<T> for Bytes { - type Collection = BytesMut; + type InternalCollection = BytesMut; - fn initialize(_lower: usize, _upper: Option<usize>) -> BytesMut { + fn initialize(_: sealed::Internal, _lower: usize, _upper: Option<usize>) -> BytesMut { BytesMut::new() } - fn extend(collection: &mut BytesMut, item: T) -> bool { + fn extend(_: sealed::Internal, collection: &mut BytesMut, item: T) -> bool { collection.put(item); true } - fn finalize(collection: &mut BytesMut) -> Bytes { + fn finalize(_: sealed::Internal, collection: &mut BytesMut) -> Bytes { mem::replace(collection, BytesMut::new()).freeze() } } @@ -210,18 +219,18 @@ impl<T: Buf> sealed::FromStreamPriv<T> for Bytes { impl<T: Buf> FromStream<T> for BytesMut {} impl<T: Buf> sealed::FromStreamPriv<T> for BytesMut { - type Collection = BytesMut; + type InternalCollection = BytesMut; - fn initialize(_lower: usize, _upper: Option<usize>) -> BytesMut { + fn initialize(_: sealed::Internal, _lower: usize, _upper: Option<usize>) -> BytesMut { BytesMut::new() } - fn extend(collection: &mut BytesMut, item: T) -> bool { + fn extend(_: sealed::Internal, collection: &mut BytesMut, item: T) -> bool { collection.put(item); true } - fn finalize(collection: &mut BytesMut) -> BytesMut { + fn finalize(_: sealed::Internal, collection: &mut BytesMut) -> BytesMut { mem::replace(collection, BytesMut::new()) } } @@ -230,17 +239,26 @@ pub(crate) mod sealed { #[doc(hidden)] pub trait FromStreamPriv<T> { /// Intermediate type used during collection process - type Collection; + /// + /// The name of this type is internal and cannot be relied upon. + type InternalCollection; /// Initialize the collection - fn initialize(lower: usize, upper: Option<usize>) -> Self::Collection; + fn initialize( + internal: Internal, + lower: usize, + upper: Option<usize>, + ) -> Self::InternalCollection; /// Extend the collection with the received item /// /// Return `true` to continue streaming, `false` complete collection. - fn extend(collection: &mut Self::Collection, item: T) -> bool; + fn extend(internal: Internal, collection: &mut Self::InternalCollection, item: T) -> bool; /// Finalize collection into target type. - fn finalize(collection: &mut Self::Collection) -> Self; + fn finalize(internal: Internal, collection: &mut Self::InternalCollection) -> Self; } + + #[allow(missing_debug_implementations)] + pub struct Internal; } |