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