diff options
| author | Alexander Karatarakis <alkarata@microsoft.com> | 2017-01-27 20:09:40 -0800 |
|---|---|---|
| committer | Alexander Karatarakis <alkarata@microsoft.com> | 2017-01-30 21:52:42 -0800 |
| commit | 0f0698dc18ec162666ed92b4ac181e512b439b83 (patch) | |
| tree | ab19e1de3c1a9291a2db4f0fe6db517f91cfaf3f /toolsrc/include | |
| parent | 4059d4a6b9f9467ff5c58594f7304eef7ba79664 (diff) | |
| download | vcpkg-0f0698dc18ec162666ed92b4ac181e512b439b83.tar.gz vcpkg-0f0698dc18ec162666ed92b4ac181e512b439b83.zip | |
Introduce Strings::Joiner
Diffstat (limited to 'toolsrc/include')
| -rw-r--r-- | toolsrc/include/vcpkg_Strings.h | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/toolsrc/include/vcpkg_Strings.h b/toolsrc/include/vcpkg_Strings.h index cb5d2334c..8d5d7135b 100644 --- a/toolsrc/include/vcpkg_Strings.h +++ b/toolsrc/include/vcpkg_Strings.h @@ -68,7 +68,55 @@ namespace vcpkg::Strings std::string ascii_to_lowercase(const std::string& input); - std::string join(const std::vector<std::string>& v, const std::string& delimiter); + template <class T, class Transformer> + static std::string join(const std::vector<T>& v, const std::string& prefix, const std::string& delimiter, const std::string& suffix, Transformer transformer) + { + if (v.empty()) + { + return std::string(); + } + + std::string output; + size_t size = v.size(); + + output.append(prefix); + output.append(transformer(v.at(0))); + + for (size_t i = 1; i < size; ++i) + { + output.append(delimiter); + output.append(transformer(v.at(i))); + } + + output.append(suffix); + return output; + } + + static std::string join(const std::vector<std::string>& v, const std::string& prefix, const std::string& delimiter, const std::string& suffix); + + class Joiner + { + public: + static Joiner on(const std::string& delimiter); + + Joiner& prefix(const std::string& prefix); + Joiner& suffix(const std::string& suffix); + + std::string join(const std::vector<std::string>& v) const; + + template <class T, class Transformer> + std::string join(const std::vector<T>& v, Transformer transformer) const + { + return Strings::join(v, this->m_prefix, this->m_delimiter, this->m_suffix, transformer); + } + + private: + explicit Joiner(const std::string& delimiter); + + std::string m_prefix; + std::string m_delimiter; + std::string m_suffix; + }; void trim(std::string* s); |
