From c91c1e39e81ce4faf51508c22c191d70ffbc4eb2 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sat, 30 Sep 2017 19:11:09 -0700 Subject: [PATCH] ircd::buffer: de-template required conversions; cleanup. --- include/ircd/buffer.h | 90 ++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 57 deletions(-) diff --git a/include/ircd/buffer.h b/include/ircd/buffer.h index 2b9554f6c..1bcd041ff 100644 --- a/include/ircd/buffer.h +++ b/include/ircd/buffer.h @@ -62,6 +62,10 @@ namespace ircd::buffer template class I> using const_raw_buffers = I; template class I> using mutable_raw_buffers = I; + // Preconstructed null buffers + extern const mutable_buffer null_buffer; + extern const ilist null_buffers; + // Single buffer iteration of contents template const it &begin(const buffer &buffer); template const it &end(const buffer &buffer); @@ -74,22 +78,18 @@ namespace ircd::buffer template size_t size(const buffer &buffer); template const it &data(const buffer &buffer); template size_t consume(buffer &buffer, const size_t &bytes); - template char *copy(char *&dest, char *const &stop, const buffer &buffer); - template size_t copy(char *const &dest, const size_t &max, const buffer &buffer); - template size_t copy(const mutable_buffer &dst, const buffer &src); - size_t copy(const mutable_buffer &dst, const string_view &src); - template std::ostream &operator<<(std::ostream &s, const buffer &buffer); + template it copy(it &dest, const it &stop, const const_raw_buffer &); + template size_t copy(const it &dest, const size_t &max, const const_raw_buffer &buffer); + size_t copy(const mutable_raw_buffer &dst, const const_raw_buffer &src); // Iterable of buffers tools template class I, class T> size_t size(const I &buffers); - template class I, class T> char *copy(char *&dest, char *const &stop, const I &buffer); - template class I, class T> size_t copy(char *const &dest, const size_t &max, const I &buffer); + template class I, class T> size_t copy(const mutable_raw_buffer &, const I &buffer); template class I, class T> size_t consume(I &buffers, const size_t &bytes); - template class I, class T> std::ostream &operator<<(std::ostream &s, const I &buffers); - // Preconstructed null buffers - extern const mutable_buffer null_buffer; - extern const ilist null_buffers; + // Convenience copy to stream + template std::ostream &operator<<(std::ostream &s, const buffer &buffer); + template class I, class T> std::ostream &operator<<(std::ostream &s, const I &buffers); } // Export these important aliases down to main ircd namespace @@ -377,28 +377,12 @@ template class buffers, class T> size_t -ircd::buffer::copy(char *const &dest, - const size_t &max, +ircd::buffer::copy(const mutable_raw_buffer &dest, const buffers &b) { size_t ret(0); for(const T &b : b) - ret += copy(dest + ret, max - ret, b); - - return ret; -} - -template - class buffers, - class T> -char * -ircd::buffer::copy(char *&dest, - char *const &stop, - const buffers &b) -{ - char *const ret(dest); - for(const T &b : b) - copy(dest, stop, b); + ret += copy(data(dest) + ret, size(dest) - ret, b); return ret; } @@ -425,48 +409,40 @@ ircd::buffer::operator<<(std::ostream &s, const buffer &buffer) } inline size_t -ircd::buffer::copy(const mutable_buffer &dst, - const string_view &s) +ircd::buffer::copy(const mutable_raw_buffer &dst, + const const_raw_buffer &src) { - return copy(dst, const_buffer{s}); + auto e{begin(dst)}; + copy(e, end(dst), src); + return std::distance(begin(dst), e); } template size_t -ircd::buffer::copy(const mutable_buffer &dst, - const buffer &src) -{ - auto e(begin(dst)); - auto b(copy(e, end(dst), src)); - return std::distance(b, e); -} - -template -size_t -ircd::buffer::copy(char *const &dest, +ircd::buffer::copy(const it &dest, const size_t &max, - const buffer &buffer) + const const_raw_buffer &src) { if(!max) return 0; - char *out(dest); - char *const stop(dest + max - 1); - copy(out, stop, buffer); + it out{dest}; + const it stop{dest + max - 1}; + copy(out, stop, const_raw_buffer{src}); *out = '\0'; return std::distance(dest, out); } template -char * -ircd::buffer::copy(char *&dest, - char *const &stop, - const buffer &buffer) +it +ircd::buffer::copy(it &dest, + const it &stop, + const const_raw_buffer &src) { - char *const ret(dest); + const it ret{dest}; const size_t remain(stop - dest); - dest += std::min(size(buffer), remain); - memcpy(ret, data(buffer), dest - ret); + dest += std::min(size(src), remain); + memcpy(ret, data(src), dest - ret); return ret; } @@ -540,19 +516,19 @@ template ircd::buffer::buffer::operator std::string() const { - return { get<0>(*this), size(*this) }; + return { reinterpret_cast(data(*this)), size(*this) }; } template ircd::buffer::buffer::operator std::string_view() const { - return { get<0>(*this), size(*this) }; + return { reinterpret_cast(data(*this)), size(*this) }; } template ircd::buffer::buffer::operator string_view() const { - return { get<0>(*this), get<1>(*this) }; + return { reinterpret_cast(data(*this)), size(*this) }; }