Browse Source

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.
Stephen Kelly 10 years ago
parent
commit
8dc8d756bc
1 changed files with 27 additions and 0 deletions
  1. 27 0
      Source/cmStandardIncludes.h

+ 27 - 0
Source/cmStandardIncludes.h

@@ -358,6 +358,33 @@ static thisClass* SafeDownCast(cmObject *c) \
 } \
 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,
                                  const char *str2,
                                  size_t N)