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