1af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// Use of this source code is governed by a BSD-style license that can be
3af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// found in the LICENSE file.
4af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// Copied from strings/stringpiece.cc with modifications
5af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
6af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include <algorithm>
7af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include <ostream>
8af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
9af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "phonenumbers/base/strings/string_piece.h"
10af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
1194f3dc686d5f369ee596aa3e22344683f6773494philip.liard@gmail.comnamespace i18n {
1294f3dc686d5f369ee596aa3e22344683f6773494philip.liard@gmail.comnamespace phonenumbers {
13af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
14af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comtypedef StringPiece::size_type size_type;
15af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
16af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comstd::ostream& operator<<(std::ostream& o, const StringPiece& piece) {
17af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  o.write(piece.data(), static_cast<std::streamsize>(piece.size()));
18af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return o;
19af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
20af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
21af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.combool operator==(const StringPiece& x, const StringPiece& y) {
22af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (x.size() != y.size())
23af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return false;
24af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
25af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return StringPiece::wordmemcmp(x.data(), y.data(), x.size()) == 0;
26af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
27af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
28af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comvoid StringPiece::CopyToString(std::string* target) const {
29af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  target->assign(!empty() ? data() : "", size());
30af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
31af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
32af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comvoid StringPiece::AppendToString(std::string* target) const {
33af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (!empty())
34af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    target->append(data(), size());
35af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
36af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
37af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::copy(char* buf, size_type n, size_type pos) const {
38af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  size_type ret = std::min(length_ - pos, n);
39af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  memcpy(buf, ptr_ + pos, ret);
40af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return ret;
41af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
42af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
43af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::find(const StringPiece& s, size_type pos) const {
44af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (pos > length_)
45af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
46af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
47af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  const char* result = std::search(ptr_ + pos, ptr_ + length_,
48af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com                                   s.ptr_, s.ptr_ + s.length_);
49af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  const size_type xpos = result - ptr_;
50af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return xpos + s.length_ <= length_ ? xpos : npos;
51af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
52af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
53af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::find(char c, size_type pos) const {
54af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (pos >= length_)
55af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
56af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
57af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  const char* result = std::find(ptr_ + pos, ptr_ + length_, c);
58af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return result != ptr_ + length_ ? static_cast<size_t>(result - ptr_) : npos;
59af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
60af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
61af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::rfind(const StringPiece& s, size_type pos) const {
62af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (length_ < s.length_)
63af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
64af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
65af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (s.empty())
66af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return std::min(length_, pos);
67af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
68af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  const char* last = ptr_ + std::min(length_ - s.length_, pos) + s.length_;
69af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  const char* result = std::find_end(ptr_, last, s.ptr_, s.ptr_ + s.length_);
70af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return result != last ? static_cast<size_t>(result - ptr_) : npos;
71af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
72af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
73af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::rfind(char c, size_type pos) const {
74af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (length_ == 0)
75af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
76af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
77af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  for (size_type i = std::min(pos, length_ - 1); ; --i) {
78af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (ptr_[i] == c)
79af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      return i;
80af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (i == 0)
81af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      break;
82af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  }
83af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return npos;
84af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
85af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
86af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// For each character in characters_wanted, sets the index corresponding
87af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// to the ASCII code of that character to 1 in table.  This is used by
88af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// the find_.*_of methods below to tell whether or not a character is in
89af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// the lookup table in constant time.
90af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// The argument `table' must be an array that is large enough to hold all
91af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// the possible values of an unsigned char.  Thus it should be be declared
92af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// as follows:
93af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com//   bool table[UCHAR_MAX + 1]
94af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comstatic inline void BuildLookupTable(const StringPiece& characters_wanted,
95af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com                                    bool* table) {
96af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  const size_type length = characters_wanted.length();
97af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  const char* const data = characters_wanted.data();
98af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  for (size_type i = 0; i < length; ++i) {
99af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    table[static_cast<unsigned char>(data[i])] = true;
100af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  }
101af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
102af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
103af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::find_first_of(const StringPiece& s,
104af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com                                     size_type pos) const {
105af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (length_ == 0 || s.length_ == 0)
106af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
107af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
108af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  // Avoid the cost of BuildLookupTable() for a single-character search.
109af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (s.length_ == 1)
110af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return find_first_of(s.ptr_[0], pos);
111af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
112af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  bool lookup[UCHAR_MAX + 1] = { false };
113af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  BuildLookupTable(s, lookup);
114af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  for (size_type i = pos; i < length_; ++i) {
115af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (lookup[static_cast<unsigned char>(ptr_[i])]) {
116af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      return i;
117af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    }
118af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  }
119af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return npos;
120af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
121af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
122af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::find_first_not_of(const StringPiece& s,
123af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com                                         size_type pos) const {
124af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (length_ == 0)
125af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
126af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
127af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (s.length_ == 0)
128af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return 0;
129af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
130af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  // Avoid the cost of BuildLookupTable() for a single-character search.
131af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (s.length_ == 1)
132af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return find_first_not_of(s.ptr_[0], pos);
133af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
134af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  bool lookup[UCHAR_MAX + 1] = { false };
135af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  BuildLookupTable(s, lookup);
136af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  for (size_type i = pos; i < length_; ++i) {
137af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (!lookup[static_cast<unsigned char>(ptr_[i])]) {
138af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      return i;
139af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    }
140af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  }
141af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return npos;
142af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
143af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
144af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::find_first_not_of(char c, size_type pos) const {
145af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (length_ == 0)
146af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
147af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
148af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  for (; pos < length_; ++pos) {
149af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (ptr_[pos] != c) {
150af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      return pos;
151af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    }
152af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  }
153af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return npos;
154af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
155af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
156af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::find_last_of(const StringPiece& s, size_type pos) const {
157af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (length_ == 0 || s.length_ == 0)
158af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
159af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
160af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  // Avoid the cost of BuildLookupTable() for a single-character search.
161af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (s.length_ == 1)
162af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return find_last_of(s.ptr_[0], pos);
163af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
164af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  bool lookup[UCHAR_MAX + 1] = { false };
165af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  BuildLookupTable(s, lookup);
166af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  for (size_type i = std::min(pos, length_ - 1); ; --i) {
167af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (lookup[static_cast<unsigned char>(ptr_[i])])
168af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      return i;
169af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (i == 0)
170af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      break;
171af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  }
172af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return npos;
173af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
174af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
175af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::find_last_not_of(const StringPiece& s,
176af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com                                        size_type pos) const {
177af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (length_ == 0)
178af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
179af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
180af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  size_type i = std::min(pos, length_ - 1);
181af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (s.length_ == 0)
182af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return i;
183af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
184af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  // Avoid the cost of BuildLookupTable() for a single-character search.
185af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (s.length_ == 1)
186af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return find_last_not_of(s.ptr_[0], pos);
187af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
188af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  bool lookup[UCHAR_MAX + 1] = { false };
189af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  BuildLookupTable(s, lookup);
190af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  for (; ; --i) {
191af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (!lookup[static_cast<unsigned char>(ptr_[i])])
192af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      return i;
193af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (i == 0)
194af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      break;
195af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  }
196af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return npos;
197af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
198af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
199af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comsize_type StringPiece::find_last_not_of(char c, size_type pos) const {
200af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (length_ == 0)
201af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    return npos;
202af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
203af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  for (size_type i = std::min(pos, length_ - 1); ; --i) {
204af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (ptr_[i] != c)
205af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      return i;
206af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com    if (i == 0)
207af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com      break;
208af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  }
209af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return npos;
210af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
211af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
212af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comStringPiece StringPiece::substr(size_type pos, size_type n) const {
213af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (pos > length_) pos = length_;
214af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  if (n > length_ - pos) n = length_ - pos;
215af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com  return StringPiece(ptr_ + pos, n);
216af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}
217af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
218af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comconst StringPiece::size_type StringPiece::npos = size_type(-1);
219af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com
22094f3dc686d5f369ee596aa3e22344683f6773494philip.liard@gmail.com}  // namespace phonenumbers
22194f3dc686d5f369ee596aa3e22344683f6773494philip.liard@gmail.com}  // namespace i18n
222