158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef LIBRARIES_SDK_UTIL_STRING_UTIL_H_
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define LIBRARIES_SDK_UTIL_STRING_UTIL_H_
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <string>
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <vector>
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace sdk_util {
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Splits |str| into a vector of strings delimited by |c|, placing the results
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// in |r|. If several instances of |c| are contiguous, or if |str| begins with
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// or ends with |c|, then an empty string is inserted. If |str| is empty, then
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// no strings are inserted.
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// NOTE: Unlike Chrome's base::SplitString, this DOES NOT trim white space.
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)inline void SplitString(const std::string& str,
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        char c,
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        std::vector<std::string>* r) {
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  r->clear();
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  size_t last = 0;
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  size_t size = str.size();
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (size_t i = 0; i <= size; ++i) {
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (i == size || str[i] == c) {
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      std::string tmp(str, last, i - last);
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Avoid converting an empty source string into a vector of one empty
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // string.
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (i != size || !r->empty() || !tmp.empty())
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        r->push_back(tmp);
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      last = i + 1;
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace sdk_util
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // LIBRARIES_SDK_UTIL_STRING_UTIL_H_
40