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.
This commit is contained in:
Stephen Kelly 2015-01-07 08:21:29 +01:00
parent b5813ceeb5
commit 8dc8d756bc
1 changed files with 27 additions and 0 deletions

View File

@ -358,6 +358,33 @@ static thisClass* SafeDownCast(cmObject *c) \
} \ } \
class cmTypeMacro_UseTrailingSemicolon class cmTypeMacro_UseTrailingSemicolon
template<typename Range>
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<ValueType>(os, delimiter));
os << *last;
return os.str();
}
template<typename Range>
std::string cmJoin(Range const& r, std::string delimiter)
{
return cmJoin(r, delimiter.c_str());
};
inline bool cmHasLiteralPrefixImpl(const std::string &str1, inline bool cmHasLiteralPrefixImpl(const std::string &str1,
const char *str2, const char *str2,
size_t N) size_t N)