|  | // Copyright 2015 The Weave Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef LIBWEAVE_SRC_STRING_UTILS_H_ | 
|  | #define LIBWEAVE_SRC_STRING_UTILS_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <utility> | 
|  | #include <vector> | 
|  |  | 
|  | namespace weave { | 
|  |  | 
|  | // Treats the string as a delimited list of substrings and returns the array | 
|  | // of original elements of the list. | 
|  | // |trim_whitespaces| causes each element to have all whitespaces trimmed off. | 
|  | // |purge_empty_strings| specifies whether empty elements from the original | 
|  | // string should be omitted. | 
|  | std::vector<std::string> Split(const std::string& str, | 
|  | const std::string& delimiter, | 
|  | bool trim_whitespaces, | 
|  | bool purge_empty_strings); | 
|  |  | 
|  | // Splits the string into two pieces at the first position of the specified | 
|  | // delimiter. | 
|  | std::pair<std::string, std::string> SplitAtFirst(const std::string& str, | 
|  | const std::string& delimiter, | 
|  | bool trim_whitespaces); | 
|  |  | 
|  | // Joins strings into a single string separated by |delimiter|. | 
|  | template <class InputIterator> | 
|  | std::string JoinRange(const std::string& delimiter, | 
|  | InputIterator first, | 
|  | InputIterator last) { | 
|  | std::string result; | 
|  | if (first == last) | 
|  | return result; | 
|  | result = *first; | 
|  | for (++first; first != last; ++first) { | 
|  | result += delimiter; | 
|  | result += *first; | 
|  | } | 
|  | return result; | 
|  | } | 
|  |  | 
|  | template <class Container> | 
|  | std::string Join(const std::string& delimiter, const Container& strings) { | 
|  | using std::begin; | 
|  | using std::end; | 
|  | return JoinRange(delimiter, begin(strings), end(strings)); | 
|  | } | 
|  |  | 
|  | inline std::string Join(const std::string& delimiter, | 
|  | const std::string& str1, | 
|  | const std::string& str2) { | 
|  | return str1 + delimiter + str2; | 
|  | } | 
|  |  | 
|  | }  // namespace weave | 
|  |  | 
|  | #endif  // LIBWEAVE_SRC_STRING_UTILS_H_ |