From c9fa6304d585b533c9bfff0811a3b2b26669498c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Sun, 3 Oct 2021 21:05:12 -0400 Subject: [PATCH] string utils: add concat Change-Id: I3b0fd2a34289545dbf06b85c2e825fbf87bb42ad --- src/string_utils.h | 103 +++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 51 deletions(-) diff --git a/src/string_utils.h b/src/string_utils.h index 56d0af4ba7..4e2768cccb 100644 --- a/src/string_utils.h +++ b/src/string_utils.h @@ -32,57 +32,6 @@ #include <WTypes.h> #endif -// Add string operators crucially missing from standard -// see https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/1RcShRhrmRc -namespace std { -inline string -operator+(const string& s, const string_view& sv) -{ - string ret; - ret.reserve(s.size() + sv.size()); - ret.append(s); - ret.append(sv); - return ret; -} -inline string -operator+(const string_view& sv, const string& s) -{ - string ret; - ret.reserve(s.size() + sv.size()); - ret.append(sv); - ret.append(s); - return ret; -} -using svmatch = match_results<string_view::const_iterator>; -using svsub_match = sub_match<string_view::const_iterator>; -constexpr string_view svsub_match_view(const svsub_match& submatch) noexcept { - return string_view(&*submatch.first, submatch.second - submatch.first); -} -inline bool -regex_match(string_view sv, - svmatch& m, - const regex& e, - regex_constants::match_flag_type flags = regex_constants::match_default) -{ - return regex_match(sv.begin(), sv.end(), m, e, flags); -} -inline bool -regex_match(string_view sv, - const regex& e, - regex_constants::match_flag_type flags = regex_constants::match_default) -{ - return regex_match(sv.begin(), sv.end(), e, flags); -} -inline bool -regex_search(string_view sv, - svmatch& m, - const regex& e, - regex_constants::match_flag_type flags = regex_constants::match_default) -{ - return regex_search(sv.begin(), sv.end(), m, e, flags); -} -} // namespace std - namespace jami { constexpr static const char TRUE_STR[] = "true"; @@ -116,6 +65,15 @@ stod(const std::string& str) return std::stod(str); } +template<typename... Args> +std::string concat(Args &&... args){ + static_assert((std::is_constructible_v<std::string_view, Args&&> && ...)); + std::string s; + s.reserve((std::string_view{ args }.size() + ...)); + (s.append(std::forward<Args>(args)), ...); + return s; +} + std::string_view trim(std::string_view s); /** @@ -188,3 +146,46 @@ std::string string_join(const std::set<std::string>& set, std::string_view separ std::set<std::string> string_split_set(std::string& str, std::string_view separator = "/"); } // namespace jami + +// Add string operators crucially missing from standard +// see https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/1RcShRhrmRc +namespace std { +inline string +operator+(const string& s, const string_view& sv) +{ + return jami::concat(s, sv); +} +inline string +operator+(const string_view& sv, const string& s) +{ + return jami::concat(sv, s); +} +using svmatch = match_results<string_view::const_iterator>; +using svsub_match = sub_match<string_view::const_iterator>; +constexpr string_view svsub_match_view(const svsub_match& submatch) noexcept { + return string_view(&*submatch.first, submatch.second - submatch.first); +} +inline bool +regex_match(string_view sv, + svmatch& m, + const regex& e, + regex_constants::match_flag_type flags = regex_constants::match_default) +{ + return regex_match(sv.begin(), sv.end(), m, e, flags); +} +inline bool +regex_match(string_view sv, + const regex& e, + regex_constants::match_flag_type flags = regex_constants::match_default) +{ + return regex_match(sv.begin(), sv.end(), e, flags); +} +inline bool +regex_search(string_view sv, + svmatch& m, + const regex& e, + regex_constants::match_flag_type flags = regex_constants::match_default) +{ + return regex_search(sv.begin(), sv.end(), m, e, flags); +} +} // namespace std -- GitLab