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