diff options
author | Joerg Sonnenberger <joerg@bec.de> | 2013-09-03 20:43:54 +0000 |
---|---|---|
committer | Joerg Sonnenberger <joerg@bec.de> | 2013-09-03 20:43:54 +0000 |
commit | f57a80f4942dafdb56e854d42af83abaf949ff9d (patch) | |
tree | 8857468a92216001fa484ad6be1a1992fa379518 /include/llvm/ADT | |
parent | b81d7a89129ff1621fa609144b400df3500542d6 (diff) | |
download | external_llvm-f57a80f4942dafdb56e854d42af83abaf949ff9d.zip external_llvm-f57a80f4942dafdb56e854d42af83abaf949ff9d.tar.gz external_llvm-f57a80f4942dafdb56e854d42af83abaf949ff9d.tar.bz2 |
Add a Python-like join function to merge a list of strings with a
separator between each two elements.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189846 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ADT')
-rw-r--r-- | include/llvm/ADT/StringExtras.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/include/llvm/ADT/StringExtras.h b/include/llvm/ADT/StringExtras.h index d2887c5..56dbb5b 100644 --- a/include/llvm/ADT/StringExtras.h +++ b/include/llvm/ADT/StringExtras.h @@ -14,6 +14,7 @@ #ifndef LLVM_ADT_STRINGEXTRAS_H #define LLVM_ADT_STRINGEXTRAS_H +#include <iterator> #include "llvm/ADT/StringRef.h" #include "llvm/Support/DataTypes.h" @@ -159,6 +160,48 @@ static inline StringRef getOrdinalSuffix(unsigned Val) { } } +template <typename IteratorT> +inline std::string join_impl(IteratorT Begin, IteratorT End, + StringRef Separator, std::input_iterator_tag) { + std::string S; + if (Begin == End) + return S; + + S += (*Begin); + while (++Begin != End) { + S += Separator; + S += (*Begin); + } + return S; +} + +template <typename IteratorT> +inline std::string join_impl(IteratorT Begin, IteratorT End, + StringRef Separator, std::forward_iterator_tag) { + std::string S; + if (Begin == End) + return S; + + size_t Len = (std::distance(Begin, End) - 1) * Separator.size(); + for (IteratorT I = Begin; I != End; ++I) + Len += (*Begin).size(); + S.reserve(Len); + S += (*Begin); + while (++Begin != End) { + S += Separator; + S += (*Begin); + } + return S; +} + +/// Joins the strings in the range [Begin, End), adding Separator between +/// the elements. +template <typename IteratorT> +inline std::string join(IteratorT Begin, IteratorT End, StringRef Separator) { + typedef typename std::iterator_traits<IteratorT>::iterator_category tag; + return join_impl(Begin, End, Separator, tag()); +} + } // End llvm namespace #endif |