| 148 | */ |
| 149 | template <typename StringT, typename OutIt, typename Sep = char> |
| 150 | void cmTokenize(OutIt outIt, cm::string_view str, Sep sep, |
| 151 | cmTokenizerMode mode) |
| 152 | { |
| 153 | auto hasTokens = false; |
| 154 | // clang-format off |
| 155 | for (auto start = str.find_first_not_of(sep) |
| 156 | , end = str.find_first_of(sep, start) |
| 157 | ; start != cm::string_view::npos |
| 158 | ; start = str.find_first_not_of(sep, end) |
| 159 | , end = str.find_first_of(sep, start) |
| 160 | , hasTokens = true |
| 161 | ) { |
| 162 | *outIt++ = StringT{ str.substr(start, end - start) }; |
| 163 | } |
| 164 | // clang-format on |
| 165 | if (!hasTokens && mode == cmTokenizerMode::Legacy) { |
| 166 | *outIt = StringT{}; |
| 167 | } |
| 168 | } |
| 169 | |
| 170 | /** |
| 171 | * \brief Extract tokens that are separated by any of the |
searching dependent graphs…