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