15a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Protocol Buffers - Google's data interchange format
25a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Copyright 2008 Google Inc.  All rights reserved.
35a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// https://developers.google.com/protocol-buffers/
45a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
55a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Redistribution and use in source and binary forms, with or without
65a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// modification, are permitted provided that the following conditions are
75a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// met:
85a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
95a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions of source code must retain the above copyright
105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// notice, this list of conditions and the following disclaimer.
115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions in binary form must reproduce the above
125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// copyright notice, this list of conditions and the following disclaimer
135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// in the documentation and/or other materials provided with the
145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// distribution.
155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Neither the name of Google Inc. nor the names of its
165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// contributors may be used to endorse or promote products derived from
175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// this software without specific prior written permission.
185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A StringPiece points to part or all of a string, Cord, double-quoted string
325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// literal, or other string-like object.  A StringPiece does *not* own the
335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// string to which it points.  A StringPiece is not null-terminated.
345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// You can use StringPiece as a function or method parameter.  A StringPiece
365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// parameter can receive a double-quoted string literal argument, a "const
375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// char*" argument, a string argument, or a StringPiece argument with no data
385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// copying.  Systematic use of StringPiece for arguments reduces data
395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// copies and strlen() calls.
405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Prefer passing StringPieces by value:
425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   void MyFunction(StringPiece arg);
435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// If circumstances require, you may also pass by const reference:
445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   void MyFunction(const StringPiece& arg);  // not preferred
455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Both of these have the same lifetime semantics.  Passing by value
465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// generates slightly smaller code.  For more discussion, see the thread
475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// go/stringpiecebyvalue on c-users.
485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// StringPiece is also suitable for local variables if you know that
505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// the lifetime of the underlying object is longer than the lifetime
515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// of your StringPiece variable.
525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Beware of binding a StringPiece to a temporary:
545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece sp = obj.MethodReturningString();  // BAD: lifetime problem
555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This code is okay:
575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   string str = obj.MethodReturningString();  // str owns its contents
585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece sp(str);  // GOOD, because str outlives sp
595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// StringPiece is sometimes a poor choice for a return value and usually a poor
615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// choice for a data member.  If you do use a StringPiece this way, it is your
625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// responsibility to ensure that the object pointed to by the StringPiece
635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// outlives the StringPiece.
645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A StringPiece may represent just part of a string; thus the name "Piece".
665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For example, when splitting a string, vector<StringPiece> is a natural data
675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// type for the output.  For another example, a Cord is a non-contiguous,
685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// potentially very long string-like object.  The Cord class has an interface
695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// that iteratively provides StringPiece objects that point to the
705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// successive pieces of a Cord object.
715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A StringPiece is not null-terminated.  If you write code that scans a
735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// StringPiece, you must check its length before reading any characters.
745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Common idioms that work on null-terminated strings do not work on
755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// StringPiece objects.
765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// There are several ways to create a null StringPiece:
785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece()
795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece(NULL)
805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece(NULL, 0)
815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For all of the above, sp.data() == NULL, sp.length() == 0,
825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// and sp.empty() == true.  Also, if you create a StringPiece with
835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// a non-NULL pointer then sp.data() != NULL.  Once created,
845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// sp.data() will stay either NULL or not-NULL, except if you call
855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// sp.clear() or sp.set().
865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Thus, you can use StringPiece(NULL) to signal an out-of-band value
885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// that is different from other StringPiece values.  This is similar
895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// to the way that const char* p1 = NULL; is different from
905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// const char* p2 = "";.
915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// There are many ways to create an empty StringPiece:
935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece()
945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece(NULL)
955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece(NULL, 0)
965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece("")
975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece("", 0)
985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece("abcdef", 0)
995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece("abcdef"+6, 0)
1005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For all of the above, sp.length() will be 0 and sp.empty() will be true.
1015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For some empty StringPiece values, sp.data() will be NULL.
1025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For some empty StringPiece values, sp.data() will not be NULL.
1035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
1045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Be careful not to confuse: null StringPiece and empty StringPiece.
1055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// The set of empty StringPieces properly includes the set of null StringPieces.
1065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// That is, every null StringPiece is an empty StringPiece,
1075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// but some non-null StringPieces are empty Stringpieces too.
1085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
1095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// All empty StringPiece values compare equal to each other.
1105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Even a null StringPieces compares equal to a non-null empty StringPiece:
1115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  StringPiece() == StringPiece("", 0)
1125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  StringPiece(NULL) == StringPiece("abc", 0)
1135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//  StringPiece(NULL, 0) == StringPiece("abcdef"+6, 0)
1145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
1155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Look carefully at this example:
1165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   StringPiece("") == NULL
1175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// True or false?  TRUE, because StringPiece::operator== converts
1185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// the right-hand side from NULL to StringPiece(NULL),
1195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// and then compares two zero-length spans of characters.
1205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// However, we are working to make this example produce a compile error.
1215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
1225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Suppose you want to write:
1235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   bool TestWhat?(StringPiece sp) { return sp == NULL; }  // BAD
1245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Do not do that.  Write one of these instead:
1255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   bool TestNull(StringPiece sp) { return sp.data() == NULL; }
1265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   bool TestEmpty(StringPiece sp) { return sp.empty(); }
1275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// The intent of TestWhat? is unclear.  Did you mean TestNull or TestEmpty?
1285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Right now, TestWhat? behaves likes TestEmpty.
1295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// We are working to make TestWhat? produce a compile error.
1305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// TestNull is good to test for an out-of-band signal.
1315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// TestEmpty is good to test for an empty StringPiece.
1325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
1335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Caveats (again):
1345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (1) The lifetime of the pointed-to string (or piece of a string)
1355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     must be longer than the lifetime of the StringPiece.
1365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (2) There may or may not be a '\0' character after the end of
1375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     StringPiece data.
1385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (3) A null StringPiece is empty.
1395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     An empty StringPiece may or may not be a null StringPiece.
1405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef GOOGLE_PROTOBUF_STUBS_STRINGPIECE_H_
1425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define GOOGLE_PROTOBUF_STUBS_STRINGPIECE_H_
1435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <assert.h>
1455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <stddef.h>
1465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <string.h>
1475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <iosfwd>
1485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <limits>
1495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <string>
1505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/common.h>
1525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/hash.h>
1535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace google {
1555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace protobuf {
1565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// StringPiece has *two* size types.
1575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// StringPiece::size_type
1585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   is unsigned
1595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   is 32 bits in LP32, 64 bits in LP64, 64 bits in LLP64
1605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   no future changes intended
1615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// stringpiece_ssize_type
1625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   is signed
1635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   is 32 bits in LP32, 64 bits in LP64, 64 bits in LLP64
1645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   future changes intended: http://go/64BitStringPiece
1655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
1665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottypedef string::difference_type stringpiece_ssize_type;
1675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// STRINGPIECE_CHECK_SIZE protects us from 32-bit overflows.
1695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// TODO(mec): delete this after stringpiece_ssize_type goes 64 bit.
1705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if !defined(NDEBUG)
1715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define STRINGPIECE_CHECK_SIZE 1
1725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#elif defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0
1735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define STRINGPIECE_CHECK_SIZE 1
1745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else
1755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define STRINGPIECE_CHECK_SIZE 0
1765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif
1775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT StringPiece {
1795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
1805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const char* ptr_;
1815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type length_;
1825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Prevent overflow in debug mode or fortified mode.
1845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // sizeof(stringpiece_ssize_type) may be smaller than sizeof(size_t).
1855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static stringpiece_ssize_type CheckedSsizeTFromSizeT(size_t size) {
1865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if STRINGPIECE_CHECK_SIZE > 0
1875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifdef max
1885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef max
1895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif
1905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (size > static_cast<size_t>(
1915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        std::numeric_limits<stringpiece_ssize_type>::max())) {
1925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      // Some people grep for this message in logs
1935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      // so take care if you ever change it.
1945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      LogFatalSizeTooBig(size, "size_t to int conversion");
1955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
1965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif
1975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<stringpiece_ssize_type>(size);
1985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Out-of-line error path.
2015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static void LogFatalSizeTooBig(size_t size, const char* details);
2025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
2045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // We provide non-explicit singleton constructors so users can pass
2055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // in a "const char*" or a "string" wherever a "StringPiece" is
2065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // expected.
2075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
2085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Style guide exception granted:
2095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // http://goto/style-guide-exception-20978288
2105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  StringPiece() : ptr_(NULL), length_(0) {}
2115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  StringPiece(const char* str)  // NOLINT(runtime/explicit)
2135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : ptr_(str), length_(0) {
2145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (str != NULL) {
2155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      length_ = CheckedSsizeTFromSizeT(strlen(str));
2165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
2175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <class Allocator>
2205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  StringPiece(  // NOLINT(runtime/explicit)
2215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const std::basic_string<char, std::char_traits<char>, Allocator>& str)
2225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : ptr_(str.data()), length_(0) {
2235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    length_ = CheckedSsizeTFromSizeT(str.size());
2245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(HAS_GLOBAL_STRING)
2265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template <class Allocator>
2275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  StringPiece(  // NOLINT(runtime/explicit)
2285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const basic_string<char, std::char_traits<char>, Allocator>& str)
2295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : ptr_(str.data()), length_(0) {
2305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    length_ = CheckedSsizeTFromSizeT(str.size());
2315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif
2335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  StringPiece(const char* offset, stringpiece_ssize_type len)
2355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : ptr_(offset), length_(len) {
2365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(len >= 0);
2375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Substring of another StringPiece.
2405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // pos must be non-negative and <= x.length().
2415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  StringPiece(StringPiece x, stringpiece_ssize_type pos);
2425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Substring of another StringPiece.
2435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // pos must be non-negative and <= x.length().
2445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // len must be non-negative and will be pinned to at most x.length() - pos.
2455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  StringPiece(StringPiece x,
2465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot              stringpiece_ssize_type pos,
2475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot              stringpiece_ssize_type len);
2485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // data() may return a pointer to a buffer with embedded NULs, and the
2505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // returned buffer may or may not be null terminated.  Therefore it is
2515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // typically a mistake to pass data() to a routine that expects a NUL
2525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // terminated string.
2535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const char* data() const { return ptr_; }
2545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type size() const { return length_; }
2555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type length() const { return length_; }
2565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool empty() const { return length_ == 0; }
2575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void clear() {
2595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ptr_ = NULL;
2605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    length_ = 0;
2615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void set(const char* data, stringpiece_ssize_type len) {
2645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(len >= 0);
2655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ptr_ = data;
2665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    length_ = len;
2675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void set(const char* str) {
2705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ptr_ = str;
2715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (str != NULL)
2725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      length_ = CheckedSsizeTFromSizeT(strlen(str));
2735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    else
2745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      length_ = 0;
2755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void set(const void* data, stringpiece_ssize_type len) {
2785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ptr_ = reinterpret_cast<const char*>(data);
2795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    length_ = len;
2805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  char operator[](stringpiece_ssize_type i) const {
2835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(0 <= i);
2845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(i < length_);
2855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return ptr_[i];
2865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void remove_prefix(stringpiece_ssize_type n) {
2895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(length_ >= n);
2905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ptr_ += n;
2915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    length_ -= n;
2925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void remove_suffix(stringpiece_ssize_type n) {
2955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(length_ >= n);
2965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    length_ -= n;
2975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // returns {-1, 0, 1}
3005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int compare(StringPiece x) const {
3015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const stringpiece_ssize_type min_size =
3025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        length_ < x.length_ ? length_ : x.length_;
3035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    int r = memcmp(ptr_, x.ptr_, min_size);
3045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (r < 0) return -1;
3055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (r > 0) return 1;
3065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (length_ < x.length_) return -1;
3075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (length_ > x.length_) return 1;
3085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return 0;
3095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string as_string() const {
3125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return ToString();
3135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // We also define ToString() here, since many other string-like
3155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // interfaces name the routine that converts to a C++ string
3165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // "ToString", and it's confusing to have the method that does that
3175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // for a StringPiece be called "as_string()".  We also leave the
3185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // "as_string()" method defined here for existing code.
3195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  string ToString() const {
3205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (ptr_ == NULL) return string();
3215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return string(data(), size());
3225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  operator string() const {
3255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return ToString();
3265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyToString(string* target) const;
3295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void AppendToString(string* target) const;
3305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool starts_with(StringPiece x) const {
3325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return (length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0);
3335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ends_with(StringPiece x) const {
3365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return ((length_ >= x.length_) &&
3375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            (memcmp(ptr_ + (length_-x.length_), x.ptr_, x.length_) == 0));
3385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Checks whether StringPiece starts with x and if so advances the beginning
3415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // of it to past the match.  It's basically a shortcut for starts_with
3425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // followed by remove_prefix.
3435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool Consume(StringPiece x);
3445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like above but for the end of the string.
3455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool ConsumeFromEnd(StringPiece x);
3465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // standard STL container boilerplate
3485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef char value_type;
3495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const char* pointer;
3505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const char& reference;
3515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const char& const_reference;
3525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef size_t size_type;
3535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef ptrdiff_t difference_type;
3545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const size_type npos;
3555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const char* const_iterator;
3565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const char* iterator;
3575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
3585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef std::reverse_iterator<iterator> reverse_iterator;
3595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  iterator begin() const { return ptr_; }
3605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  iterator end() const { return ptr_ + length_; }
3615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const_reverse_iterator rbegin() const {
3625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return const_reverse_iterator(ptr_ + length_);
3635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const_reverse_iterator rend() const {
3655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return const_reverse_iterator(ptr_);
3665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type max_size() const { return length_; }
3685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type capacity() const { return length_; }
3695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // cpplint.py emits a false positive [build/include_what_you_use]
3715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type copy(char* buf, size_type n, size_type pos = 0) const;  // NOLINT
3725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool contains(StringPiece s) const;
3745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find(StringPiece s, size_type pos = 0) const;
3765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find(char c, size_type pos = 0) const;
3775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type rfind(StringPiece s, size_type pos = npos) const;
3785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type rfind(char c, size_type pos = npos) const;
3795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find_first_of(StringPiece s, size_type pos = 0) const;
3815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find_first_of(char c, size_type pos = 0) const {
3825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return find(c, pos);
3835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find_first_not_of(StringPiece s,
3855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                           size_type pos = 0) const;
3865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find_first_not_of(char c, size_type pos = 0) const;
3875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find_last_of(StringPiece s,
3885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                      size_type pos = npos) const;
3895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find_last_of(char c, size_type pos = npos) const {
3905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return rfind(c, pos);
3915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find_last_not_of(StringPiece s,
3935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                          size_type pos = npos) const;
3945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type find_last_not_of(char c, size_type pos = npos) const;
3955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  StringPiece substr(size_type pos, size_type n = npos) const;
3975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
3985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This large function is defined inline so that in a fairly common case where
4005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// one of the arguments is a literal, the compiler can elide a lot of the
4015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// following comparisons.
4025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool operator==(StringPiece x, StringPiece y) {
4035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type len = x.size();
4045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  if (len != y.size()) {
4055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return false;
4065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return x.data() == y.data() || len <= 0 ||
4095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      memcmp(x.data(), y.data(), len) == 0;
4105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
4115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool operator!=(StringPiece x, StringPiece y) {
4135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return !(x == y);
4145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
4155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool operator<(StringPiece x, StringPiece y) {
4175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const stringpiece_ssize_type min_size =
4185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      x.size() < y.size() ? x.size() : y.size();
4195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const int r = memcmp(x.data(), y.data(), min_size);
4205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return (r < 0) || (r == 0 && x.size() < y.size());
4215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
4225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool operator>(StringPiece x, StringPiece y) {
4245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return y < x;
4255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
4265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool operator<=(StringPiece x, StringPiece y) {
4285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return !(x > y);
4295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
4305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool operator>=(StringPiece x, StringPiece y) {
4325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return !(x < y);
4335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
4345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// allow StringPiece to be logged
4365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotextern std::ostream& operator<<(std::ostream& o, StringPiece piece);
4375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace internal {
4395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// StringPiece is not a POD and can not be used in an union (pre C++11). We
4405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// need a POD version of it.
4415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct StringPiecePod {
4425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Create from a StringPiece.
4435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static StringPiecePod CreateFromStringPiece(StringPiece str) {
4445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    StringPiecePod pod;
4455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    pod.data_ = str.data();
4465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    pod.size_ = str.size();
4475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return pod;
4485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Cast to StringPiece.
4515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  operator StringPiece() const { return StringPiece(data_, size_); }
4525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool operator==(const char* value) const {
4545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return StringPiece(data_, size_) == StringPiece(value);
4555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  char operator[](stringpiece_ssize_type i) const {
4585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(0 <= i);
4595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(i < size_);
4605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return data_[i];
4615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const char* data() const { return data_; }
4645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type size() const {
4665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return size_;
4675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  std::string ToString() const { return std::string(data_, size_); }
4705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
4715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const char* data_;
4725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  stringpiece_ssize_type size_;
4735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
4745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace internal
4765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace protobuf
4775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace google
4785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotGOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_START
4805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<> struct hash<StringPiece> {
4815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  size_t operator()(const StringPiece& s) const {
4825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    size_t result = 0;
4835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    for (const char *str = s.data(), *end = str + s.size(); str < end; str++) {
4845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      result = 5 * result + *str;
4855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
4865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return result;
4875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
4895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotGOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_END
4905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif  // STRINGS_STRINGPIECE_H_
492