diff --git a/include/ircd/buffer/shared_buffer.h b/include/ircd/buffer/shared_buffer.h index 4980d6e63..50dc2269e 100644 --- a/include/ircd/buffer/shared_buffer.h +++ b/include/ircd/buffer/shared_buffer.h @@ -19,6 +19,7 @@ struct ircd::buffer::shared_buffer ,buffer { shared_buffer(const size_t &size); + shared_buffer(unique_buffer &&); explicit shared_buffer(const const_buffer &); shared_buffer() = default; shared_buffer(shared_buffer &&) = default; @@ -27,19 +28,6 @@ struct ircd::buffer::shared_buffer shared_buffer &operator=(const shared_buffer &) = default; }; -template -ircd::buffer::shared_buffer::shared_buffer(const size_t &size) -:std::shared_ptr -{ - new __attribute__((aligned(16))) char[size], - std::default_delete() -} -,buffer -{ - this->std::shared_ptr::get(), size -} -{} - template ircd::buffer::shared_buffer::shared_buffer(const const_buffer &src) :shared_buffer @@ -51,3 +39,33 @@ ircd::buffer::shared_buffer::shared_buffer(const const_buffer &src) assert(size(dst) == size(src)); copy(dst, src); } + +template +ircd::buffer::shared_buffer::shared_buffer(unique_buffer &&buf) +:std::shared_ptr +{ + data(buf), + std::default_delete() +} +,buffer +{ + this->std::shared_ptr::get(), + size(buf) +} +{ + buf.release(); +} + +template +ircd::buffer::shared_buffer::shared_buffer(const size_t &size) +:std::shared_ptr +{ + new __attribute__((aligned(16))) char[size], + std::default_delete() +} +,buffer +{ + this->std::shared_ptr::get(), + size +} +{}