From f1a2ac5108d03b3be78c44ee8d86fbc887e210dc Mon Sep 17 00:00:00 2001 From: Ivan Fefer Date: Wed, 26 Aug 2020 15:56:51 +0300 Subject: [PATCH] Avoid copying of content provider if possible (#627) --- httplib.h | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/httplib.h b/httplib.h index 7e9f2a5..ba5700f 100644 --- a/httplib.h +++ b/httplib.h @@ -428,6 +428,19 @@ struct Response { ContentProvider content_provider_; std::function content_provider_resource_releaser_; bool is_chunked_content_provider = false; + + class ContentProviderAdapter { + public: + explicit ContentProviderAdapter(ContentProviderWithoutLength&& content_provider): + content_provider_(content_provider) {} + + bool operator()(size_t offset, size_t, DataSink& sink) { + return content_provider_(offset, sink); + } + + private: + ContentProviderWithoutLength content_provider_; + }; }; class Stream { @@ -3574,9 +3587,7 @@ Response::set_content_provider(size_t in_length, const char *content_type, assert(in_length > 0); set_header("Content-Type", content_type); content_length_ = in_length; - content_provider_ = [provider](size_t offset, size_t length, DataSink &sink) { - return provider(offset, length, sink); - }; + content_provider_ = std::move(provider); content_provider_resource_releaser_ = resource_releaser; is_chunked_content_provider = false; } @@ -3587,9 +3598,7 @@ Response::set_content_provider(const char *content_type, const std::function &resource_releaser) { set_header("Content-Type", content_type); content_length_ = 0; - content_provider_ = [provider](size_t offset, size_t, DataSink &sink) { - return provider(offset, sink); - }; + content_provider_ = ContentProviderAdapter(std::move(provider)); content_provider_resource_releaser_ = resource_releaser; is_chunked_content_provider = false; } @@ -3599,9 +3608,7 @@ inline void Response::set_chunked_content_provider( const std::function &resource_releaser) { set_header("Content-Type", content_type); content_length_ = 0; - content_provider_ = [provider](size_t offset, size_t, DataSink &sink) { - return provider(offset, sink); - }; + content_provider_ = ContentProviderAdapter(std::move(provider)); content_provider_resource_releaser_ = resource_releaser; is_chunked_content_provider = true; }