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// Author: kenton@google.com (Kenton Varda) 325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Based on original Protocol Buffers design by 335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Sanjay Ghemawat, Jeff Dean, and others. 345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This file contains the CodedInputStream and CodedOutputStream classes, 365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// which wrap a ZeroCopyInputStream or ZeroCopyOutputStream, respectively, 375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// and allow you to read or write individual pieces of data in various 385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// formats. In particular, these implement the varint encoding for 395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// integers, a simple variable-length encoding in which smaller numbers 405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// take fewer bytes. 415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Typically these classes will only be used internally by the protocol 435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer library in order to encode and decode protocol buffers. Clients 445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// of the library only need to know about this class if they wish to write 455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// custom message parsing or serialization procedures. 465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream example: 485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // Write some data to "myfile". First we write a 4-byte "magic number" 495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // to identify the file type, then write a length-delimited string. The 505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // string is composed of a varint giving the length followed by the raw 515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // bytes. 525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int fd = open("myfile", O_CREAT | O_WRONLY); 535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ZeroCopyOutputStream* raw_output = new FileOutputStream(fd); 545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream* coded_output = new CodedOutputStream(raw_output); 555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int magic_number = 1234; 575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// char text[] = "Hello world!"; 585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteLittleEndian32(magic_number); 595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteVarint32(strlen(text)); 605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteRaw(text, strlen(text)); 615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete coded_output; 635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete raw_output; 645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// close(fd); 655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedInputStream example: 675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // Read a file created by the above code. 685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int fd = open("myfile", O_RDONLY); 695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// ZeroCopyInputStream* raw_input = new FileInputStream(fd); 705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedInputStream coded_input = new CodedInputStream(raw_input); 715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_input->ReadLittleEndian32(&magic_number); 735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// if (magic_number != 1234) { 745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// cerr << "File not in expected format." << endl; 755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// return; 765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// } 775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// uint32 size; 795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_input->ReadVarint32(&size); 805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// char* text = new char[size + 1]; 825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_input->ReadRaw(buffer, size); 835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// text[size] = '\0'; 845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete coded_input; 865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete raw_input; 875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// close(fd); 885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// cout << "Text is: " << text << endl; 905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete [] text; 915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// For those who are interested, varint encoding is defined as follows: 935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// The encoding operates on unsigned integers of up to 64 bits in length. 955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Each byte of the encoded value has the format: 965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// * bits 0-6: Seven bits of the number being encoded. 975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// * bit 7: Zero if this is the last byte in the encoding (in which 985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// case all remaining bits of the number are zero) or 1 if 995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// more bytes follow. 1005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// The first byte contains the least-significant 7 bits of the number, the 1015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// second byte (if present) contains the next-least-significant 7 bits, 1025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// and so on. So, the binary number 1011000101011 would be encoded in two 1035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// bytes as "10101011 00101100". 1045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 1055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// In theory, varint could be used to encode integers of any length. 1065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// However, for practicality we set a limit at 64 bits. The maximum encoded 1075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// length of a number is thus 10 bytes. 1085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 1105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 1115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <assert.h> 1135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <string> 1145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <utility> 1155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifdef _MSC_VER 1165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Assuming windows is always little-endian. 1175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #if !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) 1185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #define PROTOBUF_LITTLE_ENDIAN 1 1195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #endif 1205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER) 1215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If MSVC has "/RTCc" set, it will complain about truncating casts at 1225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // runtime. This file contains some intentional truncating casts. 1235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #pragma runtime_checks("c", off) 1245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #endif 1255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 1265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #include <sys/param.h> // __BYTE_ORDER 1275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #if ((defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \ 1285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN)) && \ 1295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) 1305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #define PROTOBUF_LITTLE_ENDIAN 1 1315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #endif 1325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 1335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/common.h> 1345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace google { 1365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace protobuf { 1385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass DescriptorPool; 1405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MessageFactory; 1415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace io { 1435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in this file. 1455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass CodedInputStream; 1465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass CodedOutputStream; 1475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Defined in other files. 1495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass ZeroCopyInputStream; // zero_copy_stream.h 1505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass ZeroCopyOutputStream; // zero_copy_stream.h 1515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Class which reads and decodes binary data which is composed of varint- 1535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// encoded integers and fixed-width pieces. Wraps a ZeroCopyInputStream. 1545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most users will not need to deal with CodedInputStream. 1555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 1565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most methods of CodedInputStream that return a bool return false if an 1575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// underlying I/O error occurs or if the data is malformed. Once such a 1585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// failure occurs, the CodedInputStream is broken and is no longer useful. 1595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT CodedInputStream { 1605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public: 1615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Create a CodedInputStream that reads from the given ZeroCopyInputStream. 1625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot explicit CodedInputStream(ZeroCopyInputStream* input); 1635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Create a CodedInputStream that reads from the given flat array. This is 1655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // faster than using an ArrayInputStream. PushLimit(size) is implied by 1665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // this constructor. 1675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot explicit CodedInputStream(const uint8* buffer, int size); 1685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Destroy the CodedInputStream and position the underlying 1705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ZeroCopyInputStream at the first unread byte. If an error occurred while 1715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // reading (causing a method to return false), then the exact position of 1725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the input stream may be anywhere between the last value that was read 1735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // successfully and the stream's byte limit. 1745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ~CodedInputStream(); 1755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Return true if this CodedInputStream reads from a flat array instead of 1775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // a ZeroCopyInputStream. 1785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot inline bool IsFlat() const; 1795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Skips a number of bytes. Returns false if an underlying read error 1815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // occurs. 1825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool Skip(int count); 1835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Sets *data to point directly at the unread part of the CodedInputStream's 1855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // underlying buffer, and *size to the size of that buffer, but does not 1865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // advance the stream's current position. This will always either produce 1875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // a non-empty buffer or return false. If the caller consumes any of 1885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // this data, it should then call Skip() to skip over the consumed bytes. 1895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This may be useful for implementing external fast parsing routines for 1905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // types of data not covered by the CodedInputStream interface. 1915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool GetDirectBufferPointer(const void** data, int* size); 1925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like GetDirectBufferPointer, but this method is inlined, and does not 1945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // attempt to Refresh() if the buffer is currently empty. 1955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE void GetDirectBufferPointerInline(const void** data, 1965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int* size); 1975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 1985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read raw bytes, copying them into the given buffer. 1995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadRaw(void* buffer, int size); 2005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like the above, with inlined optimizations. This should only be used 2025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // by the protobuf implementation. 2035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InternalReadRawInline(void* buffer, int size); 2045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like ReadRaw, but reads into a string. 2065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 2075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Implementation Note: ReadString() grows the string gradually as it 2085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // reads in the data, rather than allocating the entire requested size 2095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // upfront. This prevents denial-of-service attacks in which a client 2105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // could claim that a string is going to be MAX_INT bytes long in order to 2115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // crash the server because it can't allocate this much space at once. 2125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadString(string* buffer, int size); 2135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like the above, with inlined optimizations. This should only be used 2145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // by the protobuf implementation. 2155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool InternalReadStringInline(string* buffer, 2165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int size); 2175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a 32-bit little-endian integer. 2205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadLittleEndian32(uint32* value); 2215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a 64-bit little-endian integer. 2225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadLittleEndian64(uint64* value); 2235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // These methods read from an externally provided buffer. The caller is 2255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // responsible for ensuring that the buffer has sufficient space. 2265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a 32-bit little-endian integer. 2275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const uint8* ReadLittleEndian32FromArray(const uint8* buffer, 2285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32* value); 2295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a 64-bit little-endian integer. 2305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const uint8* ReadLittleEndian64FromArray(const uint8* buffer, 2315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint64* value); 2325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read an unsigned integer with Varint encoding, truncating to 32 bits. 2345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Reading a 32-bit value is equivalent to reading a 64-bit one and casting 2355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // it to uint32, but may be more efficient. 2365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint32(uint32* value); 2375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read an unsigned integer with Varint encoding. 2385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint64(uint64* value); 2395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Read a tag. This calls ReadVarint32() and returns the result, or returns 2415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // zero (which is not a valid tag) if ReadVarint32() fails. Also, it updates 2425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the last tag value, which can be checked with LastTagWas(). 2435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Always inline because this is only called in one place per parse loop 2445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // but it is called for every iteration of said loop, so it should be fast. 2455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // GCC doesn't want to inline this by default. 2465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE uint32 ReadTag(); 2475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This usually a faster alternative to ReadTag() when cutoff is a manifest 2495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // constant. It does particularly well for cutoff >= 127. The first part 2505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // of the return value is the tag that was read, though it can also be 0 in 2515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the cases where ReadTag() would return 0. If the second part is true 2525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // then the tag is known to be in [0, cutoff]. If not, the tag either is 2535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // above cutoff or is 0. (There's intentional wiggle room when tag is 0, 2545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // because that can arise in several ways, and for best performance we want 2555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // to avoid an extra "is tag == 0?" check here.) 2565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE std::pair<uint32, bool> ReadTagWithCutoff( 2575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 cutoff); 2585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Usually returns true if calling ReadVarint32() now would produce the given 2605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // value. Will always return false if ReadVarint32() would not return the 2615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // given value. If ExpectTag() returns true, it also advances past 2625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the varint. For best performance, use a compile-time constant as the 2635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // parameter. 2645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Always inline because this collapses to a small number of instructions 2655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // when given a constant parameter, but GCC doesn't want to inline by default. 2665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE bool ExpectTag(uint32 expected); 2675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like above, except this reads from the specified buffer. The caller is 2695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // responsible for ensuring that the buffer is large enough to read a varint 2705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // of the expected size. For best performance, use a compile-time constant as 2715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the expected tag parameter. 2725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 2735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns a pointer beyond the expected tag if it was found, or NULL if it 2745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // was not. 2755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE static const uint8* ExpectTagFromArray( 2765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer, 2775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 expected); 2785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Usually returns true if no more bytes can be read. Always returns false 2805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // if more bytes can be read. If ExpectAtEnd() returns true, a subsequent 2815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // call to LastTagWas() will act as if ReadTag() had been called and returned 2825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // zero, and ConsumedEntireMessage() will return true. 2835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ExpectAtEnd(); 2845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If the last call to ReadTag() or ReadTagWithCutoff() returned the 2865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // given value, returns true. Otherwise, returns false; 2875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 2885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is needed because parsers for some types of embedded messages 2895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // (with field type TYPE_GROUP) don't actually know that they've reached the 2905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // end of a message until they see an ENDGROUP tag, which was actually part 2915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // of the enclosing message. The enclosing message would like to check that 2925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // tag to make sure it had the right number, so it calls LastTagWas() on 2935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // return from the embedded parser to check. 2945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool LastTagWas(uint32 expected); 2955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 2965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // When parsing message (but NOT a group), this method must be called 2975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // immediately after MergeFromCodedStream() returns (if it returns true) 2985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // to further verify that the message ended in a legitimate way. For 2995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // example, this verifies that parsing did not end on an end-group tag. 3005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // It also checks for some cases where, due to optimizations, 3015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // MergeFromCodedStream() can incorrectly return true. 3025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ConsumedEntireMessage(); 3035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Limits ---------------------------------------------------------- 3055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Limits are used when parsing length-delimited embedded messages. 3065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // After the message's length is read, PushLimit() is used to prevent 3075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the CodedInputStream from reading beyond that length. Once the 3085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // embedded message has been parsed, PopLimit() is called to undo the 3095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // limit. 3105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Opaque type used with PushLimit() and PopLimit(). Do not modify 3125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // values of this type yourself. The only reason that this isn't a 3135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // struct with private internals is for efficiency. 3145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot typedef int Limit; 3155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Places a limit on the number of bytes that the stream may read, 3175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // starting from the current position. Once the stream hits this limit, 3185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // it will act like the end of the input has been reached until PopLimit() 3195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is called. 3205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // As the names imply, the stream conceptually has a stack of limits. The 3225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // shortest limit on the stack is always enforced, even if it is not the 3235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // top limit. 3245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The value returned by PushLimit() is opaque to the caller, and must 3265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // be passed unchanged to the corresponding call to PopLimit(). 3275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Limit PushLimit(int byte_limit); 3285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Pops the last limit pushed by PushLimit(). The input must be the value 3305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // returned by that call to PushLimit(). 3315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void PopLimit(Limit limit); 3325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns the number of bytes left until the nearest limit on the 3345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // stack is hit, or -1 if no limits are in place. 3355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int BytesUntilLimit() const; 3365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns current position relative to the beginning of the input stream. 3385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int CurrentPosition() const; 3395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Total Bytes Limit ----------------------------------------------- 3415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // To prevent malicious users from sending excessively large messages 3425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // and causing integer overflows or memory exhaustion, CodedInputStream 3435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // imposes a hard limit on the total number of bytes it will read. 3445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Sets the maximum number of bytes that this CodedInputStream will read 3465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // before refusing to continue. To prevent integer overflows in the 3475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // protocol buffers implementation, as well as to prevent servers from 3485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // allocating enormous amounts of memory to hold parsed messages, the 3495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // maximum message length should be limited to the shortest length that 3505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // will not harm usability. The theoretical shortest message that could 3515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // cause integer overflows is 512MB. The default limit is 64MB. Apps 3525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // should set shorter limits if possible. If warning_threshold is not -1, 3535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // a warning will be printed to stderr after warning_threshold bytes are 3545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // read. For backwards compatibility all negative values get squashed to -1, 3555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // as other negative values might have special internal meanings. 3565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // An error will always be printed to stderr if the limit is reached. 3575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is unrelated to PushLimit()/PopLimit(). 3595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 3605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Hint: If you are reading this because your program is printing a 3615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // warning about dangerously large protocol messages, you may be 3625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // confused about what to do next. The best option is to change your 3635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // design such that excessively large messages are not necessary. 3645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // For example, try to design file formats to consist of many small 3655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // messages rather than a single large one. If this is infeasible, 3665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // you will need to increase the limit. Chances are, though, that 3675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // your code never constructs a CodedInputStream on which the limit 3685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // can be set. You probably parse messages by calling things like 3695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Message::ParseFromString(). In this case, you will need to change 3705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // your code to instead construct some sort of ZeroCopyInputStream 3715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // (e.g. an ArrayInputStream), construct a CodedInputStream around 3725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // that, then call Message::ParseFromCodedStream() instead. Then 3735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // you can adjust the limit. Yes, it's more work, but you're doing 3745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // something unusual. 3755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold); 3765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The Total Bytes Limit minus the Current Position, or -1 if there 3785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is no Total Bytes Limit. 3795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int BytesUntilTotalBytesLimit() const; 3805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Recursion Limit ------------------------------------------------- 3825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // To prevent corrupt or malicious messages from causing stack overflows, 3835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // we must keep track of the depth of recursion when parsing embedded 3845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // messages and groups. CodedInputStream keeps track of this because it 3855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is the only object that is passed down the stack during parsing. 3865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Sets the maximum recursion depth. The default is 100. 3885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void SetRecursionLimit(int limit); 3895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Increments the current recursion depth. Returns true if the depth is 3925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // under the limit, false if it has gone over. 3935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool IncrementRecursionDepth(); 3945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Decrements the recursion depth if possible. 3965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void DecrementRecursionDepth(); 3975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 3985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Decrements the recursion depth blindly. This is faster than 3995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // DecrementRecursionDepth(). It should be used only if all previous 4005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // increments to recursion depth were successful. 4015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void UnsafeDecrementRecursionDepth(); 4025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Shorthand for make_pair(PushLimit(byte_limit), --recursion_budget_). 4045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Using this can reduce code size and complexity in some cases. The caller 4055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is expected to check that the second part of the result is non-negative (to 4065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // bail out if the depth of recursion is too high) and, if all is well, to 4075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // later pass the first part of the result to PopLimit() or similar. 4085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot std::pair<CodedInputStream::Limit, int> IncrementRecursionDepthAndPushLimit( 4095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int byte_limit); 4105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Shorthand for PushLimit(ReadVarint32(&length) ? length : 0). 4125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Limit ReadLengthAndPushLimit(); 4135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Helper that is equivalent to: { 4155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // bool result = ConsumedEntireMessage(); 4165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // PopLimit(limit); 4175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // UnsafeDecrementRecursionDepth(); 4185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // return result; } 4195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Using this can reduce code size and complexity in some cases. 4205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Do not use unless the current recursion depth is greater than zero. 4215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool DecrementRecursionDepthAndPopLimit(Limit limit); 4225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Helper that is equivalent to: { 4245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // bool result = ConsumedEntireMessage(); 4255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // PopLimit(limit); 4265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // return result; } 4275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Using this can reduce code size and complexity in some cases. 4285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool CheckEntireMessageConsumedAndPopLimit(Limit limit); 4295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Extension Registry ---------------------------------------------- 4315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ADVANCED USAGE: 99.9% of people can ignore this section. 4325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // By default, when parsing extensions, the parser looks for extension 4345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // definitions in the pool which owns the outer message's Descriptor. 4355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // However, you may call SetExtensionRegistry() to provide an alternative 4365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // pool instead. This makes it possible, for example, to parse a message 4375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // using a generated class, but represent some extensions using 4385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // DynamicMessage. 4395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 4405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Set the pool used to look up extensions. Most users do not need to call 4415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // this as the correct pool will be chosen automatically. 4425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // WARNING: It is very easy to misuse this. Carefully read the requirements 4445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // below. Do not use this unless you are sure you need it. Almost no one 4455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // does. 4465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Let's say you are parsing a message into message object m, and you want 4485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // to take advantage of SetExtensionRegistry(). You must follow these 4495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // requirements: 4505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The given DescriptorPool must contain m->GetDescriptor(). It is not 4525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // sufficient for it to simply contain a descriptor that has the same name 4535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // and content -- it must be the *exact object*. In other words: 4545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // assert(pool->FindMessageTypeByName(m->GetDescriptor()->full_name()) == 4555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // m->GetDescriptor()); 4565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // There are two ways to satisfy this requirement: 4575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 1) Use m->GetDescriptor()->pool() as the pool. This is generally useless 4585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // because this is the pool that would be used anyway if you didn't call 4595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // SetExtensionRegistry() at all. 4605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 2) Use a DescriptorPool which has m->GetDescriptor()->pool() as an 4615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // "underlay". Read the documentation for DescriptorPool for more 4625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // information about underlays. 4635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // You must also provide a MessageFactory. This factory will be used to 4655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // construct Message objects representing extensions. The factory's 4665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // GetPrototype() MUST return non-NULL for any Descriptor which can be found 4675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // through the provided pool. 4685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If the provided factory might return instances of protocol-compiler- 4705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // generated (i.e. compiled-in) types, or if the outer message object m is 4715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // a generated type, then the given factory MUST have this property: If 4725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // GetPrototype() is given a Descriptor which resides in 4735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // DescriptorPool::generated_pool(), the factory MUST return the same 4745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // prototype which MessageFactory::generated_factory() would return. That 4755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is, given a descriptor for a generated type, the factory must return an 4765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // instance of the generated class (NOT DynamicMessage). However, when 4775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // given a descriptor for a type that is NOT in generated_pool, the factory 4785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is free to return any implementation. 4795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The reason for this requirement is that generated sub-objects may be 4815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // accessed via the standard (non-reflection) extension accessor methods, 4825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // and these methods will down-cast the object to the generated class type. 4835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If the object is not actually of that type, the results would be undefined. 4845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // On the other hand, if an extension is not compiled in, then there is no 4855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // way the code could end up accessing it via the standard accessors -- the 4865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // only way to access the extension is via reflection. When using reflection, 4875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // DynamicMessage and generated messages are indistinguishable, so it's fine 4885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // if these objects are represented using DynamicMessage. 4895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Using DynamicMessageFactory on which you have called 4915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // SetDelegateToGeneratedFactory(true) should be sufficient to satisfy the 4925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // above requirement. 4935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If either pool or factory is NULL, both must be NULL. 4955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 4965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Note that this feature is ignored when parsing "lite" messages as they do 4975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // not have descriptors. 4985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void SetExtensionRegistry(const DescriptorPool* pool, 4995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot MessageFactory* factory); 5005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool 5025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // has been provided. 5035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const DescriptorPool* GetExtensionPool(); 5045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Get the MessageFactory set via SetExtensionRegistry(), or NULL if no 5065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // factory has been provided. 5075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot MessageFactory* GetExtensionFactory(); 5085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private: 5105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedInputStream); 5115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer_; 5135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer_end_; // pointer to the end of the buffer. 5145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ZeroCopyInputStream* input_; 5155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int total_bytes_read_; // total bytes read from input_, including 5165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the current buffer 5175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If total_bytes_read_ surpasses INT_MAX, we record the extra bytes here 5195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // so that we can BackUp() on destruction. 5205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int overflow_bytes_; 5215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // LastTagWas() stuff. 5235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 last_tag_; // result of last ReadTag() or ReadTagWithCutoff(). 5245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is set true by ReadTag{Fallback/Slow}() if it is called when exactly 5265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // at EOF, or by ExpectAtEnd() when it returns true. This happens when we 5275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // reach the end of a message and attempt to read another tag. 5285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool legitimate_message_end_; 5295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // See EnableAliasing(). 5315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool aliasing_enabled_; 5325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Limits 5345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Limit current_limit_; // if position = -1, no limit is applied 5355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // For simplicity, if the current buffer crosses a limit (either a normal 5375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // limit created by PushLimit() or the total bytes limit), buffer_size_ 5385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // only tracks the number of bytes before that limit. This field 5395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // contains the number of bytes after it. Note that this implies that if 5405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // buffer_size_ == 0 and buffer_size_after_limit_ > 0, we know we've 5415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // hit a limit. However, if both are zero, it doesn't necessarily mean 5425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // we aren't at a limit -- the buffer may have ended exactly at the limit. 5435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int buffer_size_after_limit_; 5445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Maximum number of bytes to read, period. This is unrelated to 5465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // current_limit_. Set using SetTotalBytesLimit(). 5475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int total_bytes_limit_; 5485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If positive/0: Limit for bytes read after which a warning due to size 5505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // should be logged. 5515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If -1: Printing of warning disabled. Can be set by client. 5525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If -2: Internal: Limit has been reached, print full size when destructing. 5535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int total_bytes_warning_threshold_; 5545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Current recursion budget, controlled by IncrementRecursionDepth() and 5565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // similar. Starts at recursion_limit_ and goes down: if this reaches 5575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // -1 we are over budget. 5585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int recursion_budget_; 5595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Recursion depth limit, set by SetRecursionLimit(). 5605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int recursion_limit_; 5615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // See SetExtensionRegistry(). 5635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const DescriptorPool* extension_pool_; 5645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot MessageFactory* extension_factory_; 5655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Private member functions. 5675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Advance the buffer by a given number of bytes. 5695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void Advance(int amount); 5705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Back up input_ to the current buffer position. 5725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void BackUpInputToCurrentPosition(); 5735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Recomputes the value of buffer_size_after_limit_. Must be called after 5755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // current_limit_ or total_bytes_limit_ changes. 5765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void RecomputeBufferLimits(); 5775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Writes an error message saying that we hit total_bytes_limit_. 5795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void PrintTotalBytesLimitError(); 5805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Called when the buffer runs out to request more data. Implies an 5825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Advance(BufferSize()). 5835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool Refresh(); 5845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 5855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // When parsing varints, we optimize for the common case of small values, and 5865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // then optimize for the case when the varint fits within the current buffer 5875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // piece. The Fallback method is used when we can't use the one-byte 5885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // optimization. The Slow method is yet another fallback when the buffer is 5895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // not large enough. Making the slow path out-of-line speeds up the common 5905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // case by 10-15%. The slow path is fairly uncommon: it only triggers when a 5915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // message crosses multiple buffers. Note: ReadVarint32Fallback() and 5925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ReadVarint64Fallback() are called frequently and generally not inlined, so 5935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // they have been optimized to avoid "out" parameters. The former returns -1 5945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // if it fails and the uint32 it read otherwise. The latter has a bool 5955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // indicating success or failure as part of its return type. 5965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int64 ReadVarint32Fallback(uint32 first_byte_or_zero); 5975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot std::pair<uint64, bool> ReadVarint64Fallback(); 5985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint32Slow(uint32* value); 5995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadVarint64Slow(uint64* value); 6005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadLittleEndian32Fallback(uint32* value); 6015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadLittleEndian64Fallback(uint64* value); 6025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Fallback/slow methods for reading tags. These do not update last_tag_, 6035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // but will set legitimate_message_end_ if we are at the end of the input 6045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // stream. 6055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 ReadTagFallback(uint32 first_byte_or_zero); 6065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 ReadTagSlow(); 6075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool ReadStringFallback(string* buffer, int size); 6085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Return the size of the buffer. 6105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int BufferSize() const; 6115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const int kDefaultTotalBytesLimit = 64 << 20; // 64MB 6135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const int kDefaultTotalBytesWarningThreshold = 32 << 20; // 32MB 6155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int default_recursion_limit_; // 100 by default. 6175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}; 6185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Class which encodes and writes binary data which is composed of varint- 6205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// encoded integers and fixed-width pieces. Wraps a ZeroCopyOutputStream. 6215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most users will not need to deal with CodedOutputStream. 6225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 6235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Most methods of CodedOutputStream which return a bool return false if an 6245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// underlying I/O error occurs. Once such a failure occurs, the 6255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream is broken and is no longer useful. The Write* methods do 6265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// not return the stream status, but will invalidate the stream if an error 6275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// occurs. The client can probe HadError() to determine the status. 6285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 6295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Note that every method of CodedOutputStream which writes some data has 6305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// a corresponding static "ToArray" version. These versions write directly 6315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// to the provided buffer, returning a pointer past the last written byte. 6325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// They require that the buffer has sufficient capacity for the encoded data. 6335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This allows an optimization where we check if an output stream has enough 6345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// space for an entire message before we start writing and, if there is, we 6355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// call only the ToArray methods to avoid doing bound checks for each 6365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// individual value. 6375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// i.e., in the example above: 6385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 6395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream coded_output = new CodedOutputStream(raw_output); 6405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int magic_number = 1234; 6415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// char text[] = "Hello world!"; 6425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 6435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// int coded_size = sizeof(magic_number) + 6445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// CodedOutputStream::VarintSize32(strlen(text)) + 6455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// strlen(text); 6465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 6475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// uint8* buffer = 6485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->GetDirectBufferForNBytesAndAdvance(coded_size); 6495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// if (buffer != NULL) { 6505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // The output stream has enough space in the buffer: write directly to 6515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // the array. 6525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer = CodedOutputStream::WriteLittleEndian32ToArray(magic_number, 6535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer); 6545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer = CodedOutputStream::WriteVarint32ToArray(strlen(text), buffer); 6555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// buffer = CodedOutputStream::WriteRawToArray(text, strlen(text), buffer); 6565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// } else { 6575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // Make bound-checked writes, which will ask the underlying stream for 6585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// // more space as needed. 6595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteLittleEndian32(magic_number); 6605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteVarint32(strlen(text)); 6615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// coded_output->WriteRaw(text, strlen(text)); 6625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// } 6635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// 6645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// delete coded_output; 6655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT CodedOutputStream { 6665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public: 6675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Create an CodedOutputStream that writes to the given ZeroCopyOutputStream. 6685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot explicit CodedOutputStream(ZeroCopyOutputStream* output); 6695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot CodedOutputStream(ZeroCopyOutputStream* output, bool do_eager_refresh); 6705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Destroy the CodedOutputStream and position the underlying 6725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ZeroCopyOutputStream immediately after the last byte written. 6735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ~CodedOutputStream(); 6745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Trims any unused space in the underlying buffer so that its size matches 6765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the number of bytes written by this stream. The underlying buffer will 6775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // automatically be trimmed when this stream is destroyed; this call is only 6785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // necessary if the underlying buffer is accessed *before* the stream is 6795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // destroyed. 6805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void Trim(); 6815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Skips a number of bytes, leaving the bytes unmodified in the underlying 6835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // buffer. Returns false if an underlying write error occurs. This is 6845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // mainly useful with GetDirectBufferPointer(). 6855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool Skip(int count); 6865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Sets *data to point directly at the unwritten part of the 6885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // CodedOutputStream's underlying buffer, and *size to the size of that 6895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // buffer, but does not advance the stream's current position. This will 6905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // always either produce a non-empty buffer or return false. If the caller 6915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // writes any data to this buffer, it should then call Skip() to skip over 6925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the consumed bytes. This may be useful for implementing external fast 6935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // serialization routines for types of data not covered by the 6945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // CodedOutputStream interface. 6955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool GetDirectBufferPointer(void** data, int* size); 6965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 6975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If there are at least "size" bytes available in the current buffer, 6985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // returns a pointer directly into the buffer and advances over these bytes. 6995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // The caller may then write directly into this buffer (e.g. using the 7005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // *ToArray static methods) rather than go through CodedOutputStream. If 7015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // there are not enough bytes available, returns NULL. The return pointer is 7025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // invalidated as soon as any other non-const method of CodedOutputStream 7035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is called. 7045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot inline uint8* GetDirectBufferForNBytesAndAdvance(int size); 7055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write raw bytes, copying them from the given buffer. 7075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteRaw(const void* buffer, int size); 7085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteRaw() but will try to write aliased data if aliasing is 7095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // turned on. 7105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteRawMaybeAliased(const void* data, int size); 7115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteRaw() but writing directly to the target array. 7125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is _not_ inlined, as the compiler often optimizes memcpy into inline 7135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // copy loops. Since this gets called by every field with string or bytes 7145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // type, inlining may lead to a significant amount of code bloat, with only a 7155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // minor performance gain. 7165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteRawToArray(const void* buffer, int size, uint8* target); 7175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Equivalent to WriteRaw(str.data(), str.size()). 7195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteString(const string& str); 7205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteString() but writing directly to the target array. 7215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteStringToArray(const string& str, uint8* target); 7225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write the varint-encoded size of str followed by str. 7235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteStringWithSizeToArray(const string& str, uint8* target); 7245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Instructs the CodedOutputStream to allow the underlying 7275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ZeroCopyOutputStream to hold pointers to the original structure instead of 7285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // copying, if it supports it (i.e. output->AllowsAliasing() is true). If the 7295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // underlying stream does not support aliasing, then enabling it has no 7305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // affect. For now, this only affects the behavior of 7315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // WriteRawMaybeAliased(). 7325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // 7335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // NOTE: It is caller's responsibility to ensure that the chunk of memory 7345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // remains live until all of the data has been consumed from the stream. 7355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void EnableAliasing(bool enabled); 7365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write a 32-bit little-endian integer. 7385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteLittleEndian32(uint32 value); 7395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteLittleEndian32() but writing directly to the target array. 7405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteLittleEndian32ToArray(uint32 value, uint8* target); 7415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write a 64-bit little-endian integer. 7425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteLittleEndian64(uint64 value); 7435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteLittleEndian64() but writing directly to the target array. 7445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteLittleEndian64ToArray(uint64 value, uint8* target); 7455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write an unsigned integer with Varint encoding. Writing a 32-bit value 7475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is equivalent to casting it to uint64 and writing it as a 64-bit value, 7485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // but may be more efficient. 7495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteVarint32(uint32 value); 7505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteVarint32() but writing directly to the target array. 7515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint32ToArray(uint32 value, uint8* target); 7525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Write an unsigned integer with Varint encoding. 7535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteVarint64(uint64 value); 7545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteVarint64() but writing directly to the target array. 7555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint64ToArray(uint64 value, uint8* target); 7565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Equivalent to WriteVarint32() except when the value is negative, 7585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // in which case it must be sign-extended to a full 10 bytes. 7595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteVarint32SignExtended(int32 value); 7605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteVarint32SignExtended() but writing directly to the target array. 7615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static uint8* WriteVarint32SignExtendedToArray(int32 value, uint8* target); 7625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // This is identical to WriteVarint32(), but optimized for writing tags. 7645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // In particular, if the input is a compile-time constant, this method 7655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // compiles down to a couple instructions. 7665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Always inline because otherwise the aformentioned optimization can't work, 7675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // but GCC by default doesn't want to inline this. 7685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteTag(uint32 value); 7695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteTag() but writing directly to the target array. 7705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE static uint8* WriteTagToArray(uint32 value, 7715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* target); 7725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns the number of bytes needed to encode the given value as a varint. 7745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int VarintSize32(uint32 value); 7755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns the number of bytes needed to encode the given value as a varint. 7765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int VarintSize64(uint64 value); 7775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If negative, 10 bytes. Otheriwse, same as VarintSize32(). 7795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int VarintSize32SignExtended(int32 value); 7805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Compile-time equivalent of VarintSize32(). 7825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot template <uint32 Value> 7835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot struct StaticVarintSize32 { 7845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static const int value = 7855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (Value < (1 << 7)) 7865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ? 1 7875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : (Value < (1 << 14)) 7885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ? 2 7895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : (Value < (1 << 21)) 7905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ? 3 7915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : (Value < (1 << 28)) 7925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ? 4 7935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : 5; 7945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot }; 7955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns the total number of bytes written since this object was created. 7975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot inline int ByteCount() const; 7985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 7995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Returns true if there was an underlying I/O error since this object was 8005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // created. 8015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool HadError() const { return had_error_; } 8025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private: 8045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream); 8055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ZeroCopyOutputStream* output_; 8075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* buffer_; 8085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int buffer_size_; 8095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int total_bytes_; // Sum of sizes of all buffers seen so far. 8105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool had_error_; // Whether an error occurred during output. 8115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool aliasing_enabled_; // See EnableAliasing(). 8125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Advance the buffer by a given number of bytes. 8145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void Advance(int amount); 8155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Called when the buffer runs out to request more data. Implies an 8175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Advance(buffer_size_). 8185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool Refresh(); 8195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Like WriteRaw() but may avoid copying if the underlying 8215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // ZeroCopyOutputStream supports it. 8225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteAliasedRaw(const void* buffer, int size); 8235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If this write might cross the end of the buffer, we compose the bytes first 8255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // then use WriteRaw(). 8265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot void WriteVarint32SlowPath(uint32 value); 8275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Always-inlined versions of WriteVarint* functions so that code can be 8295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // reused, while still controlling size. For instance, WriteVarint32ToArray() 8305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // should not directly call this: since it is inlined itself, doing so 8315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // would greatly increase the size of generated code. Instead, it should call 8325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // WriteVarint32FallbackToArray. Meanwhile, WriteVarint32() is already 8335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // out-of-line, so it should just invoke this directly to avoid any extra 8345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // function call overhead. 8355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_ATTRIBUTE_ALWAYS_INLINE static uint8* WriteVarint64ToArrayInline( 8365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint64 value, uint8* target); 8375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot static int VarintSize32Fallback(uint32 value); 8395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}; 8405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// inline methods ==================================================== 8425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// The vast majority of varints are only one byte. These inline 8435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// methods optimize for that case. 8445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ReadVarint32(uint32* value) { 8465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 v = 0; 8475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) { 8485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot v = *buffer_; 8495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (v < 0x80) { 8505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = v; 8515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 8525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 8535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int64 result = ReadVarint32Fallback(v); 8565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = static_cast<uint32>(result); 8575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return result >= 0; 8585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ReadVarint64(uint64* value) { 8615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) { 8625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = *buffer_; 8635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 8645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 8655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 8665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot std::pair<uint64, bool> p = ReadVarint64Fallback(); 8675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = p.first; 8685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return p.second; 8695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 8715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// static 8725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const uint8* CodedInputStream::ReadLittleEndian32FromArray( 8735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer, 8745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32* value) { 8755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 8765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(value, buffer, sizeof(*value)); 8775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + sizeof(*value); 8785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 8795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = (static_cast<uint32>(buffer[0]) ) | 8805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[1]) << 8) | 8815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[2]) << 16) | 8825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[3]) << 24); 8835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + sizeof(*value); 8845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 8855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 8865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// static 8875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const uint8* CodedInputStream::ReadLittleEndian64FromArray( 8885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer, 8895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint64* value) { 8905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 8915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(value, buffer, sizeof(*value)); 8925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + sizeof(*value); 8935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 8945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 part0 = (static_cast<uint32>(buffer[0]) ) | 8955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[1]) << 8) | 8965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[2]) << 16) | 8975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[3]) << 24); 8985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 part1 = (static_cast<uint32>(buffer[4]) ) | 8995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[5]) << 8) | 9005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[6]) << 16) | 9015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint32>(buffer[7]) << 24); 9025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *value = static_cast<uint64>(part0) | 9035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (static_cast<uint64>(part1) << 32); 9045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + sizeof(*value); 9055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 9065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ReadLittleEndian32(uint32* value) { 9095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 9105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) { 9115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(value, buffer_, sizeof(*value)); 9125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(sizeof(*value)); 9135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 9145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 9155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadLittleEndian32Fallback(value); 9165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 9185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadLittleEndian32Fallback(value); 9195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 9205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ReadLittleEndian64(uint64* value) { 9235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 9245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) { 9255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(value, buffer_, sizeof(*value)); 9265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(sizeof(*value)); 9275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 9285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 9295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadLittleEndian64Fallback(value); 9305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 9325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return ReadLittleEndian64Fallback(value); 9335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 9345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint32 CodedInputStream::ReadTag() { 9375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 v = 0; 9385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) { 9395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot v = *buffer_; 9405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (v < 0x80) { 9415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_ = v; 9425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 9435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return v; 9445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_ = ReadTagFallback(v); 9475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return last_tag_; 9485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline std::pair<uint32, bool> CodedInputStream::ReadTagWithCutoff( 9515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 cutoff) { 9525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // In performance-sensitive code we can expect cutoff to be a compile-time 9535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // constant, and things like "cutoff >= kMax1ByteVarint" to be evaluated at 9545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // compile time. 9555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 first_byte_or_zero = 0; 9565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) { 9575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Hot case: buffer_ non_empty, buffer_[0] in [1, 128). 9585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // TODO(gpike): Is it worth rearranging this? E.g., if the number of fields 9595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // is large enough then is it better to check for the two-byte case first? 9605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot first_byte_or_zero = buffer_[0]; 9615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (static_cast<int8>(buffer_[0]) > 0) { 9625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint32 kMax1ByteVarint = 0x7f; 9635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 tag = last_tag_ = buffer_[0]; 9645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 9655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return std::make_pair(tag, cutoff >= kMax1ByteVarint || tag <= cutoff); 9665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Other hot case: cutoff >= 0x80, buffer_ has at least two bytes available, 9685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // and tag is two bytes. The latter is tested by bitwise-and-not of the 9695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // first byte and the second byte. 9705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (cutoff >= 0x80 && 9715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_PREDICT_TRUE(buffer_ + 1 < buffer_end_) && 9725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot GOOGLE_PREDICT_TRUE((buffer_[0] & ~buffer_[1]) >= 0x80)) { 9735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint32 kMax2ByteVarint = (0x7f << 7) + 0x7f; 9745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 tag = last_tag_ = (1u << 7) * buffer_[1] + (buffer_[0] - 0x80); 9755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(2); 9765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // It might make sense to test for tag == 0 now, but it is so rare that 9775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // that we don't bother. A varint-encoded 0 should be one byte unless 9785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // the encoder lost its mind. The second part of the return value of 9795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // this function is allowed to be either true or false if the tag is 0, 9805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // so we don't have to check for tag == 0. We may need to check whether 9815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // it exceeds cutoff. 9825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot bool at_or_below_cutoff = cutoff >= kMax2ByteVarint || tag <= cutoff; 9835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return std::make_pair(tag, at_or_below_cutoff); 9845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 9865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Slow path 9875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_ = ReadTagFallback(first_byte_or_zero); 9885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return std::make_pair(last_tag_, static_cast<uint32>(last_tag_ - 1) < cutoff); 9895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::LastTagWas(uint32 expected) { 9925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return last_tag_ == expected; 9935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ConsumedEntireMessage() { 9965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return legitimate_message_end_; 9975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 9985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 9995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ExpectTag(uint32 expected) { 10005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (expected < (1 << 7)) { 10015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] == expected) { 10025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(1); 10035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 10045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return false; 10065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else if (expected < (1 << 14)) { 10085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (GOOGLE_PREDICT_TRUE(BufferSize() >= 2) && 10095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_[0] == static_cast<uint8>(expected | 0x80) && 10105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_[1] == static_cast<uint8>(expected >> 7)) { 10115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(2); 10125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 10135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return false; 10155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Don't bother optimizing for larger values. 10185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return false; 10195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const uint8* CodedInputStream::ExpectTagFromArray( 10235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const uint8* buffer, uint32 expected) { 10245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (expected < (1 << 7)) { 10255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer[0] == expected) { 10265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + 1; 10275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else if (expected < (1 << 14)) { 10295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer[0] == static_cast<uint8>(expected | 0x80) && 10305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer[1] == static_cast<uint8>(expected >> 7)) { 10315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return buffer + 2; 10325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return NULL; 10355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::GetDirectBufferPointerInline(const void** data, 10385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int* size) { 10395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *data = buffer_; 10405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *size = static_cast<int>(buffer_end_ - buffer_); 10415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::ExpectAtEnd() { 10445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // If we are at a limit we know no more bytes can be read. Otherwise, it's 10455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // hard to say without calling Refresh(), and we'd rather not do that. 10465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer_ == buffer_end_ && 10485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ((buffer_size_after_limit_ != 0) || 10495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot (total_bytes_read_ == current_limit_))) { 10505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_ = 0; // Pretend we called ReadTag()... 10515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot legitimate_message_end_ = true; // ... and it hit EOF. 10525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return true; 10535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return false; 10555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedInputStream::CurrentPosition() const { 10595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return total_bytes_read_ - (BufferSize() + buffer_size_after_limit_); 10605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) { 10635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer_size_ < size) { 10645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return NULL; 10655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* result = buffer_; 10675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(size); 10685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return result; 10695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteVarint32ToArray(uint32 value, 10735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* target) { 10745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot while (value >= 0x80) { 10755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *target = static_cast<uint8>(value | 0x80); 10765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot value >>= 7; 10775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ++target; 10785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot *target = static_cast<uint8>(value); 10805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return target + 1; 10815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::WriteVarint32SignExtended(int32 value) { 10845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < 0) { 10855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteVarint64(static_cast<uint64>(value)); 10865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteVarint32(static_cast<uint32>(value)); 10885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 10915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteVarint32SignExtendedToArray( 10925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int32 value, uint8* target) { 10935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < 0) { 10945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteVarint64ToArray(static_cast<uint64>(value), target); 10955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 10965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteVarint32ToArray(static_cast<uint32>(value), target); 10975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 10985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 10995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32 value, 11015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* target) { 11025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 11035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(target, &value, sizeof(value)); 11045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 11055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[0] = static_cast<uint8>(value); 11065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[1] = static_cast<uint8>(value >> 8); 11075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[2] = static_cast<uint8>(value >> 16); 11085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[3] = static_cast<uint8>(value >> 24); 11095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 11105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return target + sizeof(value); 11115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteLittleEndian64ToArray(uint64 value, 11145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* target) { 11155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if defined(PROTOBUF_LITTLE_ENDIAN) 11165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot memcpy(target, &value, sizeof(value)); 11175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#else 11185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 part0 = static_cast<uint32>(value); 11195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 part1 = static_cast<uint32>(value >> 32); 11205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[0] = static_cast<uint8>(part0); 11225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[1] = static_cast<uint8>(part0 >> 8); 11235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[2] = static_cast<uint8>(part0 >> 16); 11245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[3] = static_cast<uint8>(part0 >> 24); 11255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[4] = static_cast<uint8>(part1); 11265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[5] = static_cast<uint8>(part1 >> 8); 11275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[6] = static_cast<uint8>(part1 >> 16); 11285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot target[7] = static_cast<uint8>(part1 >> 24); 11295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif 11305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return target + sizeof(value); 11315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::WriteVarint32(uint32 value) { 11345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (buffer_size_ >= 5) { 11355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Fast path: We have enough bytes left in the buffer to guarantee that 11365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // this write won't cross the end, so we can skip the checks. 11375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* target = buffer_; 11385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint8* end = WriteVarint32ToArray(value, target); 11395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot int size = static_cast<int>(end - target); 11405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Advance(size); 11415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 11425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteVarint32SlowPath(value); 11435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 11445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::WriteTag(uint32 value) { 11475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteVarint32(value); 11485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteTagToArray( 11515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot uint32 value, uint8* target) { 11525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteVarint32ToArray(value, target); 11535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedOutputStream::VarintSize32(uint32 value) { 11565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < (1 << 7)) { 11575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return 1; 11585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 11595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return VarintSize32Fallback(value); 11605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 11615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedOutputStream::VarintSize32SignExtended(int32 value) { 11645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (value < 0) { 11655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return 10; // TODO(kenton): Make this a symbolic constant. 11665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 11675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return VarintSize32(static_cast<uint32>(value)); 11685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 11695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::WriteString(const string& str) { 11725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteRaw(str.data(), static_cast<int>(str.size())); 11735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::WriteRawMaybeAliased( 11765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const void* data, int size) { 11775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (aliasing_enabled_) { 11785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteAliasedRaw(data, size); 11795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } else { 11805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot WriteRaw(data, size); 11815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot } 11825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline uint8* CodedOutputStream::WriteStringToArray( 11855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot const string& str, uint8* target) { 11865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return WriteRawToArray(str.data(), static_cast<int>(str.size()), target); 11875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedOutputStream::ByteCount() const { 11905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return total_bytes_ - buffer_size_; 11915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::Advance(int amount) { 11945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_ += amount; 11955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 11965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 11975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedOutputStream::Advance(int amount) { 11985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_ += amount; 11995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_size_ -= amount; 12005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::SetRecursionLimit(int limit) { 12035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_budget_ += limit - recursion_limit_; 12045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_limit_ = limit; 12055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::IncrementRecursionDepth() { 12085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot --recursion_budget_; 12095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return recursion_budget_ >= 0; 12105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::DecrementRecursionDepth() { 12135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot if (recursion_budget_ < recursion_limit_) ++recursion_budget_; 12145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::UnsafeDecrementRecursionDepth() { 12175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot assert(recursion_budget_ < recursion_limit_); 12185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot ++recursion_budget_; 12195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline void CodedInputStream::SetExtensionRegistry(const DescriptorPool* pool, 12225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot MessageFactory* factory) { 12235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_pool_ = pool; 12245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_factory_ = factory; 12255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline const DescriptorPool* CodedInputStream::GetExtensionPool() { 12285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return extension_pool_; 12295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline MessageFactory* CodedInputStream::GetExtensionFactory() { 12325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return extension_factory_; 12335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline int CodedInputStream::BufferSize() const { 12365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return static_cast<int>(buffer_end_ - buffer_); 12375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline CodedInputStream::CodedInputStream(ZeroCopyInputStream* input) 12405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : buffer_(NULL), 12415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_end_(NULL), 12425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot input_(input), 12435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_read_(0), 12445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot overflow_bytes_(0), 12455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_(0), 12465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot legitimate_message_end_(false), 12475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot aliasing_enabled_(false), 12485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot current_limit_(kint32max), 12495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_size_after_limit_(0), 12505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_limit_(kDefaultTotalBytesLimit), 12515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), 12525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_budget_(default_recursion_limit_), 12535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_limit_(default_recursion_limit_), 12545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_pool_(NULL), 12555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_factory_(NULL) { 12565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Eagerly Refresh() so buffer space is immediately available. 12575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot Refresh(); 12585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline CodedInputStream::CodedInputStream(const uint8* buffer, int size) 12615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot : buffer_(buffer), 12625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_end_(buffer + size), 12635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot input_(NULL), 12645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_read_(size), 12655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot overflow_bytes_(0), 12665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot last_tag_(0), 12675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot legitimate_message_end_(false), 12685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot aliasing_enabled_(false), 12695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot current_limit_(size), 12705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot buffer_size_after_limit_(0), 12715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_limit_(kDefaultTotalBytesLimit), 12725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), 12735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_budget_(default_recursion_limit_), 12745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot recursion_limit_(default_recursion_limit_), 12755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_pool_(NULL), 12765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot extension_factory_(NULL) { 12775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // Note that setting current_limit_ == size is important to prevent some 12785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot // code paths from trying to access input_ and segfaulting. 12795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotinline bool CodedInputStream::IsFlat() const { 12825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot return input_ == NULL; 12835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} 12845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} // namespace io 12865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} // namespace protobuf 12875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER) 12905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot #pragma runtime_checks("c", restore) 12915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif // _MSC_VER && !defined(__INTEL_COMPILER) 12925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot 12935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot} // namespace google 12945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ 1295