Optimize Download::and_visit_tar: Use trait object to avoid monomorphization (#644)

by removing method `TarEntriesVisitor::finish` and associated type
`TarEntriesVisitor::Target`.

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2023-01-04 11:11:10 +11:00 committed by GitHub
parent 1ab979cde8
commit 959b465d81
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 37 deletions

View file

@ -84,21 +84,17 @@ pub enum TarEntryType {
/// Entires can be in arbitary order.
#[async_trait::async_trait]
pub trait TarEntriesVisitor: Send + Sync {
type Target;
/// Will be called once per entry
async fn visit(&mut self, entry: &mut dyn TarEntry) -> Result<(), DownloadError>;
fn finish(self) -> Result<Self::Target, DownloadError>;
}
pub(crate) async fn extract_tar_based_stream_and_visit<S, V>(
pub(crate) async fn extract_tar_based_stream_and_visit<S>(
stream: S,
fmt: TarBasedFmt,
mut visitor: V,
) -> Result<V::Target, DownloadError>
visitor: &mut dyn TarEntriesVisitor,
) -> Result<(), DownloadError>
where
S: Stream<Item = Result<Bytes, DownloadError>> + Send + Sync,
V: TarEntriesVisitor,
{
debug!("Extracting from {fmt} archive to process it in memory");
@ -125,5 +121,5 @@ where
copy(&mut entry, &mut sink).await?;
}
visitor.finish()
Ok(())
}