aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/include
diff options
context:
space:
mode:
authorAlexander Karatarakis <alkarata@microsoft.com>2017-01-27 20:09:40 -0800
committerAlexander Karatarakis <alkarata@microsoft.com>2017-01-30 21:52:42 -0800
commit0f0698dc18ec162666ed92b4ac181e512b439b83 (patch)
treeab19e1de3c1a9291a2db4f0fe6db517f91cfaf3f /toolsrc/include
parent4059d4a6b9f9467ff5c58594f7304eef7ba79664 (diff)
downloadvcpkg-0f0698dc18ec162666ed92b4ac181e512b439b83.tar.gz
vcpkg-0f0698dc18ec162666ed92b4ac181e512b439b83.zip
Introduce Strings::Joiner
Diffstat (limited to 'toolsrc/include')
-rw-r--r--toolsrc/include/vcpkg_Strings.h50
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);