diff --git a/tokio/src/stream/collect.rs b/tokio/src/stream/collect.rs index 46494287cd8..a2b5169f365 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 { 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) {} + fn initialize(_: sealed::Internal, _lower: usize, _upper: Option) {} - 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> FromStream for String {} impl> sealed::FromStreamPriv for String { - type Collection = String; + type InternalCollection = String; - fn initialize(_lower: usize, _upper: Option) -> String { + fn initialize(_: sealed::Internal, _lower: usize, _upper: Option) -> 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> sealed::FromStreamPriv for String { impl FromStream for Vec {} impl sealed::FromStreamPriv for Vec { - type Collection = Vec; + type InternalCollection = Vec; - fn initialize(lower: usize, _upper: Option) -> Vec { + fn initialize(_: sealed::Internal, lower: usize, _upper: Option) -> Vec { Vec::with_capacity(lower) } - fn extend(collection: &mut Vec, item: T) -> bool { + fn extend(_: sealed::Internal, collection: &mut Vec, item: T) -> bool { collection.push(item); true } - fn finalize(collection: &mut Vec) -> Vec { + fn finalize(_: sealed::Internal, collection: &mut Vec) -> Vec { mem::replace(collection, vec![]) } } @@ -132,18 +132,19 @@ impl sealed::FromStreamPriv for Vec { impl FromStream for Box<[T]> {} impl sealed::FromStreamPriv for Box<[T]> { - type Collection = Vec; + type InternalCollection = Vec; - fn initialize(lower: usize, upper: Option) -> Vec { - as sealed::FromStreamPriv>::initialize(lower, upper) + fn initialize(_: sealed::Internal, lower: usize, upper: Option) -> Vec { + as sealed::FromStreamPriv>::initialize(sealed::Internal, lower, upper) } - fn extend(collection: &mut Vec, item: T) -> bool { - as sealed::FromStreamPriv>::extend(collection, item) + fn extend(_: sealed::Internal, collection: &mut Vec, item: T) -> bool { + as sealed::FromStreamPriv>::extend(sealed::Internal, collection, item) } - fn finalize(collection: &mut Vec) -> Box<[T]> { - as sealed::FromStreamPriv>::finalize(collection).into_boxed_slice() + fn finalize(_: sealed::Internal, collection: &mut Vec) -> Box<[T]> { + as sealed::FromStreamPriv>::finalize(sealed::Internal, collection) + .into_boxed_slice() } } @@ -153,18 +154,26 @@ impl sealed::FromStreamPriv> for Result where U: FromStream, { - type Collection = Result; - - fn initialize(lower: usize, upper: Option) -> Result { - Ok(U::initialize(lower, upper)) + type InternalCollection = Result; + + fn initialize( + _: sealed::Internal, + lower: usize, + upper: Option, + ) -> Result { + Ok(U::initialize(sealed::Internal, lower, upper)) } - fn extend(collection: &mut Self::Collection, item: Result) -> bool { + fn extend( + _: sealed::Internal, + collection: &mut Self::InternalCollection, + item: Result, + ) -> 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 { + fn finalize(_: sealed::Internal, collection: &mut Self::InternalCollection) -> Result { 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 FromStream for Bytes {} impl sealed::FromStreamPriv for Bytes { - type Collection = BytesMut; + type InternalCollection = BytesMut; - fn initialize(_lower: usize, _upper: Option) -> BytesMut { + fn initialize(_: sealed::Internal, _lower: usize, _upper: Option) -> 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 sealed::FromStreamPriv for Bytes { impl FromStream for BytesMut {} impl sealed::FromStreamPriv for BytesMut { - type Collection = BytesMut; + type InternalCollection = BytesMut; - fn initialize(_lower: usize, _upper: Option) -> BytesMut { + fn initialize(_: sealed::Internal, _lower: usize, _upper: Option) -> 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 { /// 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) -> Self::Collection; + fn initialize( + internal: Internal, + lower: usize, + upper: Option, + ) -> 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; }