From 8d1a431f68821fe0ed69f078c8b8e6078fcc3783 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Sun, 22 Mar 2020 22:29:15 +0100 Subject: [PATCH] allow custom deleters with write requests (close #182) --- src/uvw/stream.cpp | 17 ---------------- src/uvw/stream.h | 51 +++++++++++++++++++++------------------------- 2 files changed, 23 insertions(+), 45 deletions(-) diff --git a/src/uvw/stream.cpp b/src/uvw/stream.cpp index 75cadf94..38f91e59 100644 --- a/src/uvw/stream.cpp +++ b/src/uvw/stream.cpp @@ -15,21 +15,4 @@ UVW_INLINE void details::ShutdownReq::shutdown(uv_stream_t *handle) { } -UVW_INLINE details::WriteReq::WriteReq(ConstructorAccess ca, std::shared_ptr loop, std::unique_ptr dt, unsigned int len) - : Request{ca, std::move(loop)}, - data{std::move(dt)}, - buf{uv_buf_init(data.get(), len)} -{} - - -UVW_INLINE void details::WriteReq::write(uv_stream_t *handle) { - invoke(&uv_write, get(), handle, &buf, 1, &defaultCallback); -} - - -UVW_INLINE void details::WriteReq::write(uv_stream_t *handle, uv_stream_t *send) { - invoke(&uv_write2, get(), handle, &buf, 1, send, &defaultCallback); -} - - } diff --git a/src/uvw/stream.h b/src/uvw/stream.h index c11dccca..8cfbc002 100644 --- a/src/uvw/stream.h +++ b/src/uvw/stream.h @@ -88,14 +88,24 @@ struct ShutdownReq final: public Request { }; -class WriteReq final: public Request { +template +class WriteReq final: public Request, uv_write_t> { + using ConstructorAccess = typename Request, uv_write_t>::ConstructorAccess; + public: - using Deleter = void(*)(char *); + WriteReq(ConstructorAccess ca, std::shared_ptr loop, std::unique_ptr dt, unsigned int len) + : Request, uv_write_t>{ca, std::move(loop)}, + data{std::move(dt)}, + buf{uv_buf_init(data.get(), len)} + {} - WriteReq(ConstructorAccess ca, std::shared_ptr loop, std::unique_ptr dt, unsigned int len); + void write(uv_stream_t *handle) { + this->invoke(&uv_write, this->get(), handle, &buf, 1, &this->template defaultCallback); + } - void write(uv_stream_t *handle); - void write(uv_stream_t *handle, uv_stream_t *send); + void write(uv_stream_t *handle, uv_stream_t *send) { + this->invoke(&uv_write2, this->get(), handle, &buf, 1, send, &this->template defaultCallback); + } private: std::unique_ptr data; @@ -241,12 +251,9 @@ public: * @param data The data to be written to the stream. * @param len The lenght of the submitted data. */ - void write(std::unique_ptr data, unsigned int len) { - auto req = this->loop().template resource( - std::unique_ptr{ - data.release(), [](char *ptr) { delete[] ptr; } - }, len); - + template + void write(std::unique_ptr data, unsigned int len) { + auto req = this->loop().template resource>(std::move(data), len); auto listener = [ptr = this->shared_from_this()](const auto &event, const auto &) { ptr->publish(event); }; @@ -269,11 +276,7 @@ public: * @param len The lenght of the submitted data. */ void write(char *data, unsigned int len) { - auto req = this->loop().template resource( - std::unique_ptr{ - data, [](char *) {} - }, len); - + auto req = this->loop().template resource>(std::unique_ptr{data, [](char *) {}}, len); auto listener = [ptr = this->shared_from_this()](const auto &event, const auto &) { ptr->publish(event); }; @@ -302,13 +305,9 @@ public: * @param data The data to be written to the stream. * @param len The lenght of the submitted data. */ - template - void write(S &send, std::unique_ptr data, unsigned int len) { - auto req = this->loop().template resource( - std::unique_ptr{ - data.release(), [](char *ptr) { delete[] ptr; } - }, len); - + template + void write(S &send, std::unique_ptr data, unsigned int len) { + auto req = this->loop().template resource>(std::move(data), len); auto listener = [ptr = this->shared_from_this()](const auto &event, const auto &) { ptr->publish(event); }; @@ -339,11 +338,7 @@ public: */ template void write(S &send, char *data, unsigned int len) { - auto req = this->loop().template resource( - std::unique_ptr{ - data, [](char *) {} - }, len); - + auto req = this->loop().template resource>(std::unique_ptr{data, [](char *) {}}, len); auto listener = [ptr = this->shared_from_this()](const auto &event, const auto &) { ptr->publish(event); };