| 267 | |
| 268 | template <class TChar, class TWhitespaceFunc> |
| 269 | size_t CollapseImpl(TChar* s, size_t n, const TWhitespaceFunc& isWhitespace) { |
| 270 | size_t newLen = 0; |
| 271 | for (size_t i = 0; i < n; ++i, ++newLen) { |
| 272 | size_t nextNonSpace = i; |
| 273 | while (nextNonSpace < n && isWhitespace(s[nextNonSpace])) { |
| 274 | ++nextNonSpace; |
| 275 | } |
| 276 | size_t numSpaces = nextNonSpace - i; |
| 277 | if (numSpaces > 1 || (numSpaces == 1 && s[i] != ' ')) { |
| 278 | s[newLen] = ' '; |
| 279 | i = nextNonSpace - 1; |
| 280 | } else { |
| 281 | s[newLen] = s[i]; |
| 282 | } |
| 283 | } |
| 284 | return newLen; |
| 285 | } |
| 286 | |
| 287 | template <class TStringType, class TWhitespaceFunc> |
| 288 | bool CollapseImpl(const TStringType& from, TStringType& to, size_t maxLen, const TWhitespaceFunc& isWhitespace) { |