From ad611c5aa55b9c436b47e2a96f7bfeeb63bc07e1 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 15 Aug 2017 20:35:34 -0600 Subject: [PATCH] Complete the unique_buffer semantics. --- include/ircd/buffer.h | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/include/ircd/buffer.h b/include/ircd/buffer.h index 1278292f9..35106228f 100644 --- a/include/ircd/buffer.h +++ b/include/ircd/buffer.h @@ -63,14 +63,16 @@ struct mutable_buffer using buffer::buffer; }; -template struct unique_buffer -:buffer +:buffer { - template unique_buffer(std::unique_ptr &&, const size_t &size); + unique_buffer(std::unique_ptr &&, const size_t &size); unique_buffer(const size_t &size); unique_buffer() = default; + unique_buffer(unique_buffer &&) noexcept; + unique_buffer(const unique_buffer &) = delete; ~unique_buffer() noexcept; }; @@ -278,19 +280,21 @@ ircd::buffer::rend(const buffer &buffer) return std::reverse_iterator(get<0>(buffer)); } -template -template -ircd::buffer::unique_buffer::unique_buffer(std::unique_ptr &&b, - const size_t &size) -:buffer{it(b.release()), size} +ircd::buffer::unique_buffer::unique_buffer(std::unique_ptr &&b, + const size_t &size) +:buffer +{ + typename buffer::value_type(b.release()), size +} { } -template -ircd::buffer::unique_buffer::unique_buffer(const size_t &size) -:unique_buffer +ircd::buffer::unique_buffer::unique_buffer(const size_t &size) +:unique_buffer { std::unique_ptr { @@ -301,9 +305,21 @@ ircd::buffer::unique_buffer::unique_buffer(const size_t &size) { } -template -ircd::buffer::unique_buffer::~unique_buffer() +ircd::buffer::unique_buffer::unique_buffer(unique_buffer &&other) +noexcept +:buffer +{ + std::move(other) +} +{ + get<0>(other) = nullptr; +} + +template +ircd::buffer::unique_buffer::~unique_buffer() noexcept { delete[] data(*this);