1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepackage com.google.protobuf; 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.OutputStream; 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.IOException; 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.UnsupportedEncodingException; 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville/** 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Encodes and writes protocol message fields. 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * <p>This class contains two kinds of methods: methods that write specific 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * protocol message constructs and field types (e.g. {@link #writeTag} and 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@link #writeInt32}) and methods that write low-level values (e.g. 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@link #writeRawVarint32} and {@link #writeRawBytes}). If you are 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * writing encoded protocol messages, you should use the former methods, but if 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * you are writing some other format of your own design, use the latter. 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * <p>This class is totally unsynchronized. 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @author kneton@google.com Kenton Varda 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepublic final class CodedOutputStream { 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private final byte[] buffer; 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private final int limit; 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private int position; 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private final OutputStream output; 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * The buffer size used in {@link #newInstance(OutputStream)}. 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static final int DEFAULT_BUFFER_SIZE = 4096; 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 63d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville /** 64d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville * Returns the buffer size to efficiently write dataLength bytes to this 65d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville * CodedOutputStream. Used by AbstractMessageLite. 66d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville * 67d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville * @return the buffer size to efficiently write dataLength bytes to this 68d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville * CodedOutputStream. 69d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville */ 70d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static int computePreferredBufferSize(int dataLength) { 71d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if (dataLength > DEFAULT_BUFFER_SIZE) return DEFAULT_BUFFER_SIZE; 72d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return dataLength; 73d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 74d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private CodedOutputStream(final byte[] buffer, final int offset, 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int length) { 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = null; 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville this.buffer = buffer; 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville position = offset; 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville limit = offset + length; 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private CodedOutputStream(final OutputStream output, final byte[] buffer) { 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville this.output = output; 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville this.buffer = buffer; 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville position = 0; 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville limit = buffer.length; 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Create a new {@code CodedOutputStream} wrapping the given 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code OutputStream}. 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static CodedOutputStream newInstance(final OutputStream output) { 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return newInstance(output, DEFAULT_BUFFER_SIZE); 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Create a new {@code CodedOutputStream} wrapping the given 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code OutputStream} with a given buffer size. 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static CodedOutputStream newInstance(final OutputStream output, 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int bufferSize) { 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return new CodedOutputStream(output, new byte[bufferSize]); 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Create a new {@code CodedOutputStream} that writes directly to the given 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * byte array. If more bytes are written than fit in the array, 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@link OutOfSpaceException} will be thrown. Writing directly to a flat 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * array is faster than writing to an {@code OutputStream}. See also 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@link ByteString#newCodedBuilder}. 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static CodedOutputStream newInstance(final byte[] flatArray) { 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return newInstance(flatArray, 0, flatArray.length); 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Create a new {@code CodedOutputStream} that writes directly to the given 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * byte array slice. If more bytes are written than fit in the slice, 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@link OutOfSpaceException} will be thrown. Writing directly to a flat 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * array is faster than writing to an {@code OutputStream}. See also 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@link ByteString#newCodedBuilder}. 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static CodedOutputStream newInstance(final byte[] flatArray, 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int offset, 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int length) { 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return new CodedOutputStream(flatArray, offset, length); 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ----------------------------------------------------------------- 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code double} field, including tag, to the stream. */ 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeDouble(final int fieldNumber, final double value) 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64); 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeDoubleNoTag(value); 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code float} field, including tag, to the stream. */ 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeFloat(final int fieldNumber, final float value) 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32); 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeFloatNoTag(value); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code uint64} field, including tag, to the stream. */ 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeUInt64(final int fieldNumber, final long value) 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeUInt64NoTag(value); 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code int64} field, including tag, to the stream. */ 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeInt64(final int fieldNumber, final long value) 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeInt64NoTag(value); 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code int32} field, including tag, to the stream. */ 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeInt32(final int fieldNumber, final int value) 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeInt32NoTag(value); 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code fixed64} field, including tag, to the stream. */ 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeFixed64(final int fieldNumber, final long value) 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64); 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeFixed64NoTag(value); 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code fixed32} field, including tag, to the stream. */ 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeFixed32(final int fieldNumber, final int value) 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32); 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeFixed32NoTag(value); 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code bool} field, including tag, to the stream. */ 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeBool(final int fieldNumber, final boolean value) 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeBoolNoTag(value); 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code string} field, including tag, to the stream. */ 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeString(final int fieldNumber, final String value) 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED); 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeStringNoTag(value); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code group} field, including tag, to the stream. */ 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeGroup(final int fieldNumber, final MessageLite value) 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP); 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeGroupNoTag(value); 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP); 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Write a group represented by an {@link UnknownFieldSet}. 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @deprecated UnknownFieldSet now implements MessageLite, so you can just 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * call {@link #writeGroup}. 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Deprecated 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeUnknownGroup(final int fieldNumber, 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final MessageLite value) 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeGroup(fieldNumber, value); 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an embedded message field, including tag, to the stream. */ 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeMessage(final int fieldNumber, final MessageLite value) 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED); 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeMessageNoTag(value); 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code bytes} field, including tag, to the stream. */ 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeBytes(final int fieldNumber, final ByteString value) 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED); 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeBytesNoTag(value); 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code uint32} field, including tag, to the stream. */ 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeUInt32(final int fieldNumber, final int value) 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeUInt32NoTag(value); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Write an enum field, including tag, to the stream. Caller is responsible 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * for converting the enum value to its numeric value. 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeEnum(final int fieldNumber, final int value) 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeEnumNoTag(value); 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code sfixed32} field, including tag, to the stream. */ 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeSFixed32(final int fieldNumber, final int value) 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32); 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeSFixed32NoTag(value); 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code sfixed64} field, including tag, to the stream. */ 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeSFixed64(final int fieldNumber, final long value) 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64); 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeSFixed64NoTag(value); 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code sint32} field, including tag, to the stream. */ 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeSInt32(final int fieldNumber, final int value) 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeSInt32NoTag(value); 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code sint64} field, including tag, to the stream. */ 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeSInt64(final int fieldNumber, final long value) 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeSInt64NoTag(value); 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Write a MessageSet extension field to the stream. For historical reasons, 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * the wire format differs from normal fields. 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeMessageSetExtension(final int fieldNumber, 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final MessageLite value) 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP); 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber); 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeMessage(WireFormat.MESSAGE_SET_MESSAGE, value); 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP); 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Write an unparsed MessageSet extension field to the stream. For 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * historical reasons, the wire format differs from normal fields. 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawMessageSetExtension(final int fieldNumber, 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ByteString value) 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP); 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber); 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeBytes(WireFormat.MESSAGE_SET_MESSAGE, value); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP); 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ----------------------------------------------------------------- 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code double} field to the stream. */ 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeDoubleNoTag(final double value) throws IOException { 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawLittleEndian64(Double.doubleToRawLongBits(value)); 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code float} field to the stream. */ 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeFloatNoTag(final float value) throws IOException { 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawLittleEndian32(Float.floatToRawIntBits(value)); 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code uint64} field to the stream. */ 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeUInt64NoTag(final long value) throws IOException { 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint64(value); 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code int64} field to the stream. */ 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeInt64NoTag(final long value) throws IOException { 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint64(value); 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code int32} field to the stream. */ 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeInt32NoTag(final int value) throws IOException { 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (value >= 0) { 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint32(value); 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must sign-extend. 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint64(value); 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code fixed64} field to the stream. */ 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeFixed64NoTag(final long value) throws IOException { 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawLittleEndian64(value); 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code fixed32} field to the stream. */ 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeFixed32NoTag(final int value) throws IOException { 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawLittleEndian32(value); 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code bool} field to the stream. */ 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeBoolNoTag(final boolean value) throws IOException { 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte(value ? 1 : 0); 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code string} field to the stream. */ 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeStringNoTag(final String value) throws IOException { 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Unfortunately there does not appear to be any way to tell Java to encode 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // UTF-8 directly into our buffer, so we have to let it create its own byte 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // array and then copy. 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final byte[] bytes = value.getBytes("UTF-8"); 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint32(bytes.length); 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawBytes(bytes); 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code group} field to the stream. */ 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeGroupNoTag(final MessageLite value) throws IOException { 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value.writeTo(this); 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Write a group represented by an {@link UnknownFieldSet}. 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @deprecated UnknownFieldSet now implements MessageLite, so you can just 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * call {@link #writeGroupNoTag}. 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Deprecated 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeUnknownGroupNoTag(final MessageLite value) 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeGroupNoTag(value); 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an embedded message field to the stream. */ 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeMessageNoTag(final MessageLite value) throws IOException { 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint32(value.getSerializedSize()); 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value.writeTo(this); 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code bytes} field to the stream. */ 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeBytesNoTag(final ByteString value) throws IOException { 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final byte[] bytes = value.toByteArray(); 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint32(bytes.length); 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawBytes(bytes); 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a {@code uint32} field to the stream. */ 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeUInt32NoTag(final int value) throws IOException { 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint32(value); 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Write an enum field to the stream. Caller is responsible 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * for converting the enum value to its numeric value. 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeEnumNoTag(final int value) throws IOException { 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint32(value); 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code sfixed32} field to the stream. */ 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeSFixed32NoTag(final int value) throws IOException { 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawLittleEndian32(value); 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code sfixed64} field to the stream. */ 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeSFixed64NoTag(final long value) throws IOException { 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawLittleEndian64(value); 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code sint32} field to the stream. */ 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeSInt32NoTag(final int value) throws IOException { 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint32(encodeZigZag32(value)); 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an {@code sint64} field to the stream. */ 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeSInt64NoTag(final long value) throws IOException { 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint64(encodeZigZag64(value)); 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code double} field, including tag. 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeDoubleSize(final int fieldNumber, 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final double value) { 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeDoubleSizeNoTag(value); 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code float} field, including tag. 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeFloatSize(final int fieldNumber, final float value) { 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeFloatSizeNoTag(value); 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code uint64} field, including tag. 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeUInt64Size(final int fieldNumber, final long value) { 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeUInt64SizeNoTag(value); 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code int64} field, including tag. 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeInt64Size(final int fieldNumber, final long value) { 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeInt64SizeNoTag(value); 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code int32} field, including tag. 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeInt32Size(final int fieldNumber, final int value) { 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeInt32SizeNoTag(value); 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code fixed64} field, including tag. 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeFixed64Size(final int fieldNumber, 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final long value) { 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeFixed64SizeNoTag(value); 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code fixed32} field, including tag. 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeFixed32Size(final int fieldNumber, 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int value) { 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeFixed32SizeNoTag(value); 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code bool} field, including tag. 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeBoolSize(final int fieldNumber, 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final boolean value) { 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeBoolSizeNoTag(value); 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code string} field, including tag. 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeStringSize(final int fieldNumber, 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final String value) { 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeStringSizeNoTag(value); 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code group} field, including tag. 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeGroupSize(final int fieldNumber, 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final MessageLite value) { 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) * 2 + computeGroupSizeNoTag(value); 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code group} field represented by an {@code UnknownFieldSet}, including 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * tag. 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @deprecated UnknownFieldSet now implements MessageLite, so you can just 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * call {@link #computeGroupSize}. 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Deprecated 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeUnknownGroupSize(final int fieldNumber, 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final MessageLite value) { 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeGroupSize(fieldNumber, value); 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * embedded message field, including tag. 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeMessageSize(final int fieldNumber, 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final MessageLite value) { 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeMessageSizeNoTag(value); 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code bytes} field, including tag. 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeBytesSize(final int fieldNumber, 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final ByteString value) { 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeBytesSizeNoTag(value); 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code uint32} field, including tag. 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeUInt32Size(final int fieldNumber, final int value) { 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeUInt32SizeNoTag(value); 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * enum field, including tag. Caller is responsible for converting the 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * enum value to its numeric value. 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeEnumSize(final int fieldNumber, final int value) { 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeEnumSizeNoTag(value); 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code sfixed32} field, including tag. 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeSFixed32Size(final int fieldNumber, 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int value) { 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeSFixed32SizeNoTag(value); 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code sfixed64} field, including tag. 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeSFixed64Size(final int fieldNumber, 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final long value) { 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeSFixed64SizeNoTag(value); 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code sint32} field, including tag. 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeSInt32Size(final int fieldNumber, final int value) { 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeSInt32SizeNoTag(value); 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code sint64} field, including tag. 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeSInt64Size(final int fieldNumber, final long value) { 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(fieldNumber) + computeSInt64SizeNoTag(value); 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * MessageSet extension to the stream. For historical reasons, 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * the wire format differs from normal fields. 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeMessageSetExtensionSize( 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int fieldNumber, final MessageLite value) { 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(WireFormat.MESSAGE_SET_ITEM) * 2 + 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville computeUInt32Size(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber) + 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville computeMessageSize(WireFormat.MESSAGE_SET_MESSAGE, value); 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * unparsed MessageSet extension field to the stream. For 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * historical reasons, the wire format differs from normal fields. 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeRawMessageSetExtensionSize( 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int fieldNumber, final ByteString value) { 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeTagSize(WireFormat.MESSAGE_SET_ITEM) * 2 + 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville computeUInt32Size(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber) + 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville computeBytesSize(WireFormat.MESSAGE_SET_MESSAGE, value); 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ----------------------------------------------------------------- 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code double} field, including tag. 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeDoubleSizeNoTag(final double value) { 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return LITTLE_ENDIAN_64_SIZE; 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code float} field, including tag. 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeFloatSizeNoTag(final float value) { 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return LITTLE_ENDIAN_32_SIZE; 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code uint64} field, including tag. 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeUInt64SizeNoTag(final long value) { 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint64Size(value); 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code int64} field, including tag. 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeInt64SizeNoTag(final long value) { 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint64Size(value); 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code int32} field, including tag. 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeInt32SizeNoTag(final int value) { 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (value >= 0) { 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint32Size(value); 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Must sign-extend. 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return 10; 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code fixed64} field. 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeFixed64SizeNoTag(final long value) { 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return LITTLE_ENDIAN_64_SIZE; 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code fixed32} field. 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeFixed32SizeNoTag(final int value) { 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return LITTLE_ENDIAN_32_SIZE; 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code bool} field. 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeBoolSizeNoTag(final boolean value) { 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return 1; 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code string} field. 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeStringSizeNoTag(final String value) { 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try { 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final byte[] bytes = value.getBytes("UTF-8"); 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint32Size(bytes.length) + 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes.length; 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } catch (UnsupportedEncodingException e) { 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new RuntimeException("UTF-8 not supported.", e); 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code group} field. 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeGroupSizeNoTag(final MessageLite value) { 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return value.getSerializedSize(); 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code group} field represented by an {@code UnknownFieldSet}, including 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * tag. 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @deprecated UnknownFieldSet now implements MessageLite, so you can just 716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * call {@link #computeUnknownGroupSizeNoTag}. 717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville @Deprecated 719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeUnknownGroupSizeNoTag(final MessageLite value) { 720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeGroupSizeNoTag(value); 721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an embedded 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * message field. 726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeMessageSizeNoTag(final MessageLite value) { 728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int size = value.getSerializedSize(); 729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint32Size(size) + size; 730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code bytes} field. 735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeBytesSizeNoTag(final ByteString value) { 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint32Size(value.size()) + 738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value.size(); 739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code uint32} field. 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeUInt32SizeNoTag(final int value) { 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint32Size(value); 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an enum field. 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Caller is responsible for converting the enum value to its numeric value. 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeEnumSizeNoTag(final int value) { 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint32Size(value); 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code sfixed32} field. 760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeSFixed32SizeNoTag(final int value) { 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return LITTLE_ENDIAN_32_SIZE; 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code sfixed64} field. 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeSFixed64SizeNoTag(final long value) { 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return LITTLE_ENDIAN_64_SIZE; 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code sint32} field. 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeSInt32SizeNoTag(final int value) { 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint32Size(encodeZigZag32(value)); 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode an 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code sint64} field. 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeSInt64SizeNoTag(final long value) { 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint64Size(encodeZigZag64(value)); 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Internal helper that writes the current buffer to the output. The 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * buffer position is reset to its initial value when this returns. 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private void refreshBuffer() throws IOException { 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (output == null) { 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We're writing to a single buffer. 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new OutOfSpaceException(); 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Since we have an output stream, this is our buffer 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // and buffer offset == 0 803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.write(buffer, 0, position); 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville position = 0; 805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Flushes the stream and forces any buffered bytes to be written. This 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * does not flush the underlying OutputStream. 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void flush() throws IOException { 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (output != null) { 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville refreshBuffer(); 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * If writing to a flat array, return the space left in the array. 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Otherwise, throws {@code UnsupportedOperationException}. 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public int spaceLeft() { 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (output == null) { 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return limit - position; 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new UnsupportedOperationException( 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "spaceLeft() can only be called on CodedOutputStreams that are " + 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "writing to a flat array."); 828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Verifies that {@link #spaceLeft()} returns zero. It's common to create 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * a byte array that is exactly big enough to hold a message, then write to 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * it with a {@code CodedOutputStream}. Calling {@code checkNoSpaceLeft()} 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * after writing verifies that the message was actually as big as expected, 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * which can help catch bugs. 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void checkNoSpaceLeft() { 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (spaceLeft() != 0) { 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throw new IllegalStateException( 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Did not write as much data as expected."); 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * If you create a CodedOutputStream around a simple flat array, you must 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * not attempt to write more bytes than the array has space. Otherwise, 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * this exception will be thrown. 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static class OutOfSpaceException extends IOException { 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private static final long serialVersionUID = -6947486886997889499L; 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville OutOfSpaceException() { 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville super("CodedOutputStream was writing to a flat byte array and ran " + 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "out of space."); 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a single byte. */ 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawByte(final byte value) throws IOException { 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (position == limit) { 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville refreshBuffer(); 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville buffer[position++] = value; 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a single byte, represented by an integer value. */ 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawByte(final int value) throws IOException { 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((byte) value); 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write an array of bytes. */ 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawBytes(final byte[] value) throws IOException { 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawBytes(value, 0, value.length); 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write part of an array of bytes. */ 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawBytes(final byte[] value, int offset, int length) 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (limit - position >= length) { 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We have room in the current buffer. 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville System.arraycopy(value, offset, buffer, position, length); 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville position += length; 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write extends past current buffer. Fill the rest of this buffer and 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // flush. 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville final int bytesWritten = limit - position; 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville System.arraycopy(value, offset, buffer, position, bytesWritten); 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville offset += bytesWritten; 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville length -= bytesWritten; 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville position = limit; 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville refreshBuffer(); 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Now deal with the rest. 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Since we have an output stream, this is our buffer 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // and buffer offset == 0 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (length <= limit) { 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Fits in new buffer. 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville System.arraycopy(value, offset, buffer, 0, length); 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville position = length; 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write is very big. Let's do it all at once. 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output.write(value, offset, length); 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Encode and write a tag. */ 910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeTag(final int fieldNumber, final int wireType) 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville throws IOException { 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawVarint32(WireFormat.makeTag(fieldNumber, wireType)); 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Compute the number of bytes that would be needed to encode a tag. */ 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeTagSize(final int fieldNumber) { 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return computeRawVarint32Size(WireFormat.makeTag(fieldNumber, 0)); 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Encode and write a varint. {@code value} is treated as 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * unsigned, so it won't be sign-extended if negative. 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawVarint32(int value) throws IOException { 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville while (true) { 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & ~0x7F) == 0) { 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte(value); 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return; 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((value & 0x7F) | 0x80); 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value >>>= 7; 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Compute the number of bytes that would be needed to encode a varint. 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * {@code value} is treated as unsigned, so it won't be sign-extended if 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * negative. 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeRawVarint32Size(final int value) { 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffff << 7)) == 0) return 1; 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffff << 14)) == 0) return 2; 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffff << 21)) == 0) return 3; 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffff << 28)) == 0) return 4; 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return 5; 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Encode and write a varint. */ 950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawVarint64(long value) throws IOException { 951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville while (true) { 952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & ~0x7FL) == 0) { 953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)value); 954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return; 955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte(((int)value & 0x7F) | 0x80); 957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville value >>>= 7; 958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Compute the number of bytes that would be needed to encode a varint. */ 963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int computeRawVarint64Size(final long value) { 964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 7)) == 0) return 1; 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 14)) == 0) return 2; 966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 21)) == 0) return 3; 967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 28)) == 0) return 4; 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 35)) == 0) return 5; 969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 42)) == 0) return 6; 970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 49)) == 0) return 7; 971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 56)) == 0) return 8; 972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if ((value & (0xffffffffffffffffL << 63)) == 0) return 9; 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return 10; 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a little-endian 32-bit integer. */ 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawLittleEndian32(final int value) throws IOException { 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((value ) & 0xFF); 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((value >> 8) & 0xFF); 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((value >> 16) & 0xFF); 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((value >> 24) & 0xFF); 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static final int LITTLE_ENDIAN_32_SIZE = 4; 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** Write a little-endian 64-bit integer. */ 987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public void writeRawLittleEndian64(final long value) throws IOException { 988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)(value ) & 0xFF); 989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)(value >> 8) & 0xFF); 990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)(value >> 16) & 0xFF); 991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)(value >> 24) & 0xFF); 992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)(value >> 32) & 0xFF); 993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)(value >> 40) & 0xFF); 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)(value >> 48) & 0xFF); 995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville writeRawByte((int)(value >> 56) & 0xFF); 996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static final int LITTLE_ENDIAN_64_SIZE = 8; 999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Encode a ZigZag-encoded 32-bit value. ZigZag encodes signed integers 1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * into values that can be efficiently encoded with varint. (Otherwise, 1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * negative values must be sign-extended to 64 bits to be varint encoded, 1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * thus always taking 10 bytes on the wire.) 1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @param n A signed 32-bit integer. 1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @return An unsigned 32-bit integer, stored in a signed int because 1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Java has no explicit unsigned support. 1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static int encodeZigZag32(final int n) { 1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: the right-shift must be arithmetic 1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n << 1) ^ (n >> 31); 1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville /** 1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Encode a ZigZag-encoded 64-bit value. ZigZag encodes signed integers 1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * into values that can be efficiently encoded with varint. (Otherwise, 1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * negative values must be sign-extended to 64 bits to be varint encoded, 1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * thus always taking 10 bytes on the wire.) 1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @param n A signed 64-bit integer. 1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @return An unsigned 64-bit integer, stored in a signed int because 1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Java has no explicit unsigned support. 1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static long encodeZigZag64(final long n) { 1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: the right-shift must be arithmetic 1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n << 1) ^ (n >> 63); 1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1030