From cc636d375fdd2ae26114f4acf53a58e9ea7d483a Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 7 Feb 2019 17:52:24 -0800 Subject: [PATCH] ircd::util: Improve string() suite; add flags for shrink_to_fit(). --- include/ircd/util/string.h | 21 +++++++++++++++++++-- ircd/util.cc | 21 ++++++++++++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/include/ircd/util/string.h b/include/ircd/util/string.h index 5cc03e528..b36729197 100644 --- a/include/ircd/util/string.h +++ b/include/ircd/util/string.h @@ -17,10 +17,27 @@ namespace ircd::util { + using string_closure_size = std::function; + using string_closure_view = std::function; + + // OR this with a string size to trigger a shrink_to_fit() after closure. + constexpr const size_t SHRINK_TO_FIT + { + 1UL << (sizeof(size_t) * 8 - 1) + }; + + // Simple string generation by copy from existing buffer. std::string string(const char *const &buf, const size_t &size); std::string string(const uint8_t *const &buf, const size_t &size); - std::string string(const size_t &size, const std::function &closure); - std::string string(const size_t &size, const std::function &closure); + std::string string(const const_buffer &); + + // String generation from closure. The closure is presented a buffer of + // size for writing into. Closure returns how much it wrote via size or + // view of written portion. + std::string string(const size_t &size, const string_closure_size &); + std::string string(const size_t &size, const string_closure_view &); + + // toString()'ish template suite (see defs) template std::string string(const mutable_buffer &buf, const T &s); template std::string string(const T &s); } diff --git a/ircd/util.cc b/ircd/util.cc index 29ad0b513..32a84d9bc 100644 --- a/ircd/util.cc +++ b/ircd/util.cc @@ -299,7 +299,7 @@ ircd::util::si(const uint64_t &value) /// a view of the data actually written to the buffer. std::string ircd::util::string(const size_t &size, - const std::function &closure) + const string_closure_view &closure) { return string(size, [&closure] (const mutable_buffer &buffer) @@ -313,9 +313,14 @@ ircd::util::string(const size_t &size, /// the final size of the data written into the buffer. std::string ircd::util::string(const size_t &size, - const std::function &closure) + const string_closure_size &closure) { - std::string ret(size, char{}); + const size_t alloc_size + { + size & ~SHRINK_TO_FIT + }; + + std::string ret(alloc_size, char{}); const mutable_buffer buf { const_cast(ret.data()), ret.size() @@ -329,9 +334,19 @@ ircd::util::string(const size_t &size, assert(consumed <= buffer::size(buf)); data(buf)[consumed] = '\0'; ret.resize(consumed); + + if(size & SHRINK_TO_FIT) + ret.shrink_to_fit(); + return ret; } +std::string +ircd::util::string(const const_buffer &buf) +{ + return string(data(buf), size(buf)); +} + std::string ircd::util::string(const char *const &buf, const size_t &size)