1af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// Copyright (c) 2011 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.h with modifications 5af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 6af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// A string-like object that points to a sized piece of memory. 7af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 8af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// Functions or methods may use const StringPiece& parameters to accept either 9af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// a "const char*" or a "string" value that will be implicitly converted to 10af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// a StringPiece. The implicit conversion means that it is often appropriate 11af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// to include this .h file in other files rather than forward-declaring 12af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// StringPiece as would be appropriate for most other Google classes. 13af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 14af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// Systematic usage of StringPiece is encouraged as it will reduce unnecessary 15af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// conversions from "const char*" to "string" and back again. 16af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 17af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 18af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#ifndef I18N_PHONENUMBERS_BASE_STRINGS_STRING_PIECE_H_ 19af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#define I18N_PHONENUMBERS_BASE_STRINGS_STRING_PIECE_H_ 20af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#pragma once 21af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 22af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include <string> 23af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 24af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "phonenumbers/base/basictypes.h" 25af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 2694f3dc686d5f369ee596aa3e22344683f6773494philip.liard@gmail.comnamespace i18n { 2794f3dc686d5f369ee596aa3e22344683f6773494philip.liard@gmail.comnamespace phonenumbers { 28af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 29af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comclass StringPiece { 30af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com public: 31af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // standard STL container boilerplate 32af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef size_t size_type; 33af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef char value_type; 34af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef const char* pointer; 35af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef const char& reference; 36af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef const char& const_reference; 37af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef ptrdiff_t difference_type; 38af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef const char* const_iterator; 39af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef const char* iterator; 40af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 41af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com typedef std::reverse_iterator<iterator> reverse_iterator; 42af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 43af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com static const size_type npos; 44af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 45af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com public: 46af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // We provide non-explicit singleton constructors so users can pass 47af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // in a "const char*" or a "string" wherever a "StringPiece" is 48af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // expected. 49af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com StringPiece() : ptr_(NULL), length_(0) { } 50af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com StringPiece(const char* str) 51af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com : ptr_(str), length_((str == NULL) ? 0 : strlen(str)) { } 52af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com StringPiece(const std::string& str) 53af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com : ptr_(str.data()), length_(str.size()) { } 54af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com StringPiece(const char* offset, size_type len) 55af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com : ptr_(offset), length_(len) { } 56af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 57af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // data() may return a pointer to a buffer with embedded NULs, and the 58af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // returned buffer may or may not be null terminated. Therefore it is 59af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // typically a mistake to pass data() to a routine that expects a NUL 60af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // terminated string. 61af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com const char* data() const { return ptr_; } 62af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type size() const { return length_; } 63af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type length() const { return length_; } 64af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com bool empty() const { return length_ == 0; } 65af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 66af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com void clear() { 67af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com ptr_ = NULL; 68af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com length_ = 0; 69af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 70af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com void set(const char* data, size_type len) { 71af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com ptr_ = data; 72af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com length_ = len; 73af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 74af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com void set(const char* str) { 75af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com ptr_ = str; 76af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com length_ = str ? strlen(str) : 0; 77af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 78af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com void set(const void* data, size_type len) { 79af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com ptr_ = reinterpret_cast<const char*>(data); 80af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com length_ = len; 81af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 82af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 83af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com char operator[](size_type i) const { return ptr_[i]; } 84af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 85af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com void remove_prefix(size_type n) { 86af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com ptr_ += n; 87af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com length_ -= n; 88af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 89af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 90af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com void remove_suffix(size_type n) { 91af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com length_ -= n; 92af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 93af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 94af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com int compare(const StringPiece& x) const { 95af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com int r = wordmemcmp( 96af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com ptr_, x.ptr_, (length_ < x.length_ ? length_ : x.length_)); 97af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com if (r == 0) { 98af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com if (length_ < x.length_) r = -1; 99af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com else if (length_ > x.length_) r = +1; 100af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 101af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return r; 102af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 103af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 104af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com std::string as_string() const { 105af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // std::string doesn't like to take a NULL pointer even with a 0 size. 106af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return std::string(!empty() ? data() : "", size()); 107af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 108af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 109af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com void CopyToString(std::string* target) const; 110af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com void AppendToString(std::string* target) const; 111af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 112af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // Does "this" start with "x" 113af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com bool starts_with(const StringPiece& x) const { 114af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return ((length_ >= x.length_) && 115af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com (wordmemcmp(ptr_, x.ptr_, x.length_) == 0)); 116af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 117af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 118af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // Does "this" end with "x" 119af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com bool ends_with(const StringPiece& x) const { 120af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return ((length_ >= x.length_) && 121af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com (wordmemcmp(ptr_ + (length_-x.length_), x.ptr_, x.length_) == 0)); 122af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 123af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 124af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com iterator begin() const { return ptr_; } 125af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com iterator end() const { return ptr_ + length_; } 126af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com const_reverse_iterator rbegin() const { 127af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return const_reverse_iterator(ptr_ + length_); 128af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 129af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com const_reverse_iterator rend() const { 130af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return const_reverse_iterator(ptr_); 131af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 132af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 133af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type max_size() const { return length_; } 134af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type capacity() const { return length_; } 135af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 136af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type copy(char* buf, size_type n, size_type pos = 0) const; 137af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 138af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find(const StringPiece& s, size_type pos = 0) const; 139af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find(char c, size_type pos = 0) const; 140af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type rfind(const StringPiece& s, size_type pos = npos) const; 141af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type rfind(char c, size_type pos = npos) const; 142af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 143af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find_first_of(const StringPiece& s, size_type pos = 0) const; 144af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find_first_of(char c, size_type pos = 0) const { 145af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return find(c, pos); 146af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 147af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find_first_not_of(const StringPiece& s, size_type pos = 0) const; 148af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find_first_not_of(char c, size_type pos = 0) const; 149af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find_last_of(const StringPiece& s, size_type pos = npos) const; 150af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find_last_of(char c, size_type pos = npos) const { 151af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return rfind(c, pos); 152af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 153af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find_last_not_of(const StringPiece& s, size_type pos = npos) const; 154af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type find_last_not_of(char c, size_type pos = npos) const; 155af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 156af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com StringPiece substr(size_type pos, size_type n = npos) const; 157af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 158af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com static int wordmemcmp(const char* p, const char* p2, size_type N) { 159af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return memcmp(p, p2, N); 160af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com } 161af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 162af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com private: 163af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com const char* ptr_; 164af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com size_type length_; 165af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com}; 166af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 167af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.combool operator==(const StringPiece& x, const StringPiece& y); 168af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 169af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.cominline bool operator!=(const StringPiece& x, const StringPiece& y) { 170af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return !(x == y); 171af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 172af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 173af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.cominline bool operator<(const StringPiece& x, const StringPiece& y) { 174af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com const int r = StringPiece::wordmemcmp( 175af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com x.data(), y.data(), (x.size() < y.size() ? x.size() : y.size())); 176af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return ((r < 0) || ((r == 0) && (x.size() < y.size()))); 177af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 178af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 179af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.cominline bool operator>(const StringPiece& x, const StringPiece& y) { 180af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return y < x; 181af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 182af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 183af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.cominline bool operator<=(const StringPiece& x, const StringPiece& y) { 184af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return !(x > y); 185af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 186af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 187af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.cominline bool operator>=(const StringPiece& x, const StringPiece& y) { 188af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return !(x < y); 189af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 190af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 19194f3dc686d5f369ee596aa3e22344683f6773494philip.liard@gmail.com} // namespace phonenumbers 19294f3dc686d5f369ee596aa3e22344683f6773494philip.liard@gmail.com} // namespace i18n 193af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 194af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#endif // I18N_PHONENUMBERS_BASE_STRINGS_STRING_PIECE_H_ 195