From b2bf6116b8762e3957dbd0cdc00dc01063367cd8 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Fri, 22 Sep 2017 16:45:47 -0700 Subject: [PATCH] ircd::buffer: Improve conversion hierarchy. --- include/ircd/buffer.h | 67 +++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/include/ircd/buffer.h b/include/ircd/buffer.h index 5c9977a35..d9ed18232 100644 --- a/include/ircd/buffer.h +++ b/include/ircd/buffer.h @@ -144,31 +144,12 @@ struct ircd::buffer::buffer {} }; -struct ircd::buffer::const_buffer -:buffer -{ - operator boost::asio::const_buffer() const; - - using buffer::buffer; - const_buffer(const string_view &s) - :buffer{std::begin(s), std::end(s)} - {} -}; - struct ircd::buffer::mutable_buffer :buffer { operator boost::asio::mutable_buffer() const; - using buffer::buffer; -}; - -struct ircd::buffer::const_raw_buffer -:buffer -{ - operator boost::asio::const_buffer() const; - - using buffer::buffer; + using buffer::buffer; }; struct ircd::buffer::mutable_raw_buffer @@ -176,7 +157,51 @@ struct ircd::buffer::mutable_raw_buffer { operator boost::asio::mutable_buffer() const; - using buffer::buffer; + using buffer::buffer; + + mutable_raw_buffer(const mutable_buffer &b) + :buffer{reinterpret_cast(data(b)), size(b)} + {} +}; + +struct ircd::buffer::const_buffer +:buffer +{ + operator boost::asio::const_buffer() const; + + using buffer::buffer; + + const_buffer(const mutable_buffer &b) + :buffer{data(b), size(b)} + {} + + const_buffer(const string_view &s) + :buffer{std::begin(s), std::end(s)} + {} + + explicit const_buffer(const std::string &s) + :buffer{s.data(), s.size()} + {} +}; + +struct ircd::buffer::const_raw_buffer +:buffer +{ + operator boost::asio::const_buffer() const; + + using buffer::buffer; + + const_raw_buffer(const const_buffer &b) + :buffer{reinterpret_cast(data(b)), size(b)} + {} + + const_raw_buffer(const mutable_raw_buffer &b) + :buffer{data(b), size(b)} + {} + + const_raw_buffer(const mutable_buffer &b) + :const_raw_buffer{mutable_raw_buffer{b}} + {} }; template