From 8dc8d756bc278cd02f329b31218c2459908dc0bb Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 7 Jan 2015 08:21:29 +0100 Subject: cmStandardIncludes: Add a join algorithm for string containers. This requires the input range to supply BidirectionalIterators, which is not a problem for where it is currently useful to us. The alternative would be to not invoke --last;, and instead create an output iterator similar to std::ostream_iterator, but which puts the delimiter before the item to output. --- Source/cmStandardIncludes.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Source/cmStandardIncludes.h b/Source/cmStandardIncludes.h index e4f5760..d7c6a65 100644 --- a/Source/cmStandardIncludes.h +++ b/Source/cmStandardIncludes.h @@ -358,6 +358,33 @@ static thisClass* SafeDownCast(cmObject *c) \ } \ class cmTypeMacro_UseTrailingSemicolon +template +std::string cmJoin(Range const& r, const char* delimiter) +{ + if (r.empty()) + { + return std::string(); + } + std::ostringstream os; + typedef typename Range::value_type ValueType; + typedef typename Range::const_iterator InputIt; + InputIt first = r.begin(); + InputIt last = r.end(); + --last; + std::copy(first, last, + std::ostream_iterator(os, delimiter)); + + os << *last; + + return os.str(); +} + +template +std::string cmJoin(Range const& r, std::string delimiter) +{ + return cmJoin(r, delimiter.c_str()); +}; + inline bool cmHasLiteralPrefixImpl(const std::string &str1, const char *str2, size_t N) -- cgit v0.12