16c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/*
26c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Copyright (C) 2012 The Android Open Source Project
36c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
46c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
56c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * you may not use this file except in compliance with the License.
66c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * You may obtain a copy of the License at
76c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
86c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
96c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Unless required by applicable law or agreed to in writing, software
116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * See the License for the specific language governing permissions and
146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * limitations under the License.
156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratopackage android.util.proto;
186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoimport android.annotation.TestApi;
206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoimport android.util.Log;
216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
22fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onoratoimport java.io.FileDescriptor;
23fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onoratoimport java.io.FileOutputStream;
24fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onoratoimport java.io.IOException;
25fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onoratoimport java.io.OutputStream;
266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoimport java.io.UnsupportedEncodingException;
276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratoimport java.util.List;
286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/**
306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Class to write to a protobuf stream.
316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Each write method takes an ID code from the protoc generated classes
336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and the value to write.  To make a nested object, call startObject
346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and then endObject when you are done.
356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The ID codes have type information embedded into them, so if you call
376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the incorrect function you will get an IllegalArgumentException.
386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * To retrieve the encoded protobuf stream, call getBytes().
406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * TODO: Add a constructor that takes an OutputStream and write to that
426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * stream as the top-level objects are finished.
436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * @hide
456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato/* IMPLEMENTATION NOTES
486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Because protobuf has inner values, and they are length prefixed, and
506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * those sizes themselves are stored with a variable length encoding, it
516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * is impossible to know how big an object will be in a single pass.
526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The traditional way is to copy the in-memory representation of an object
546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * into the generated proto Message objects, do a traversal of those to
556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * cache the size, and then write the size-prefixed buffers.
566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * We are trying to avoid too much generated code here, but this class still
586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * needs to have a somewhat sane API.  We can't have the multiple passes be
596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * done by the calling code.  In addition, we want to avoid the memory high
606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * water mark of duplicating all of the values into the traditional in-memory
616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Message objects. We need to find another way.
626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * So what we do here is to let the calling code write the data into a
646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * byte[] (actually a collection of them wrapped in the EncodedBuffer) class,
656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * but not do the varint encoding of the sub-message sizes.  Then, we do a
666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * recursive traversal of the buffer itself, calculating the sizes (which are
676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * then knowable, although still not the actual sizes in the buffer because of
686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * possible further nesting).  Then we do a third pass, compacting the
696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * buffer and varint encoding the sizes.
706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * This gets us a relatively small number number of fixed-size allocations,
726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * which is less likely to cause memory fragmentation or churn the GC, and
736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the same number of data copies as would have gotten with setting it
746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * field-by-field in generated code, and no code bloat from generated code.
756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * The final data copy is also done with System.arraycopy, which will be
766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * more efficient, in general, than doing the individual fields twice (as in
776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * the traditional way).
786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * To accomplish the multiple passes, whenever we write a
806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * WIRE_TYPE_LENGTH_DELIMITED field, we write the size occupied in our
816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * buffer as a fixed 32 bit int (called childRawSize), not variable length
826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * one. We reserve another 32 bit slot for the computed size (called
836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * childEncodedSize).  If we know the size up front, as we do for strings
846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * and byte[], then we also put that into childEncodedSize, if we don't, we
856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * write the negative of childRawSize, as a sentiel that we need to
866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * compute it during the second pass and recursively compact it during the
876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * third pass.
886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * Unsgigned size varints can be up to five bytes long, but we reserve eight
906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * bytes for overhead, so we know that when we compact the buffer, there
916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * will always be space for the encoded varint.
926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * When we can figure out the size ahead of time, we do, in order
946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * to save overhead with recalculating it, and with the later arraycopy.
956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato *
966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * During the period between when the caller has called startObject, but
976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * not yet called endObject, we maintain a linked list of the tokens
986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * returned by startObject, stored in those 8 bytes of size storage space.
996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * We use that linked list of tokens to ensure that the caller has
1006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * correctly matched pairs of startObject and endObject calls, and issue
1016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato * errors if they are not matched.
1026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato */
1036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato@TestApi
1046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onoratopublic final class ProtoOutputStream {
1056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final String TAG = "ProtoOutputStream";
1066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int FIELD_ID_SHIFT = 3;
1086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int WIRE_TYPE_MASK = (1<<FIELD_ID_SHIFT)-1;
1096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int FIELD_ID_MASK = ~WIRE_TYPE_MASK;
1106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int WIRE_TYPE_VARINT = 0;
1126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int WIRE_TYPE_FIXED64 = 1;
1136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int WIRE_TYPE_LENGTH_DELIMITED = 2;
1146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int WIRE_TYPE_START_GROUP = 3;
1156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int WIRE_TYPE_END_GROUP = 4;
1166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int WIRE_TYPE_FIXED32 = 5;
1176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
1196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Position of the field type in a (long) fieldId.
1206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
1216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int FIELD_TYPE_SHIFT = 32;
1226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
1246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Mask for the field types stored in a fieldId.  Leaves a whole
1256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * byte for future expansion, even though there are currently only 17 types.
1266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
1276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_MASK = 0x0ffL << FIELD_TYPE_SHIFT;
1286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_UNKNOWN = 0;
1306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_DOUBLE = 1L << FIELD_TYPE_SHIFT;
1326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_FLOAT = 2L << FIELD_TYPE_SHIFT;
1336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_INT32 = 3L << FIELD_TYPE_SHIFT;
1346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_INT64 = 4L << FIELD_TYPE_SHIFT;
1356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_UINT32 = 5L << FIELD_TYPE_SHIFT;
1366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_UINT64 = 6L << FIELD_TYPE_SHIFT;
1376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_SINT32 = 7L << FIELD_TYPE_SHIFT;
1386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_SINT64 = 8L << FIELD_TYPE_SHIFT;
1396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_FIXED32 = 9L << FIELD_TYPE_SHIFT;
1406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_FIXED64 = 10L << FIELD_TYPE_SHIFT;
1416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_SFIXED32 = 11L << FIELD_TYPE_SHIFT;
1426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_SFIXED64 = 12L << FIELD_TYPE_SHIFT;
1436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_BOOL = 13L << FIELD_TYPE_SHIFT;
1446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_STRING = 14L << FIELD_TYPE_SHIFT;
1456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_BYTES = 15L << FIELD_TYPE_SHIFT;
1466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_ENUM = 16L << FIELD_TYPE_SHIFT;
1476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_TYPE_OBJECT = 17L << FIELD_TYPE_SHIFT;
1486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private static final String[] FIELD_TYPE_NAMES = new String[] {
1506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Double",
1516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Float",
1526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Int32",
1536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Int64",
1546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "UInt32",
1556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "UInt64",
1566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "SInt32",
1576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "SInt64",
1586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Fixed32",
1596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Fixed64",
1606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "SFixed32",
1616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "SFixed64",
1626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Bool",
1636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "String",
1646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Bytes",
1656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Enum",
1666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        "Object",
1676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    };
1686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
1706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // FieldId flags for whether the field is single, repeated or packed.
1716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
1726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final int FIELD_COUNT_SHIFT = 40;
1736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_COUNT_MASK = 0x0fL << FIELD_COUNT_SHIFT;
1746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_COUNT_UNKNOWN = 0;
1766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_COUNT_SINGLE = 1L << FIELD_COUNT_SHIFT;
1776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_COUNT_REPEATED = 2L << FIELD_COUNT_SHIFT;
1786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static final long FIELD_COUNT_PACKED = 5L << FIELD_COUNT_SHIFT;
1796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
1816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Our buffer.
1826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
1836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private EncodedBuffer mBuffer;
1846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
186fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Our stream.  If there is one.
187fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
188fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private OutputStream mStream;
189fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
190fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
1916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Current nesting depth of startObject calls.
1926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
1936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private int mDepth;
1946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
1966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * An ID given to objects and returned in the token from startObject
1976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * and stored in the buffer until endObject is called, where the two
1986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * are checked.  Starts at -1 and becomes more negative, so the values
1996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * aren't likely to alias with the size it will be overwritten with,
2006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * which tend to be small, and we will be more likely to catch when
2016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * the caller of endObject uses a stale token that they didn't intend
2026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * to (e.g. copy and paste error).
2036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
2046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private int mNextObjectId = -1;
2056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
2076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * The object token we are expecting in endObject.  If another call to
2086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * startObject happens, this is written to that location, which gives
2096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * us a stack, stored in the space for the as-yet unused size fields.
2106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
2116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private long mExpectedObjectToken;
2126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
2146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Index in mBuffer that we should start copying from on the next
2156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * pass of compaction.
2166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
2176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private int mCopyBegin;
2186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
2206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Whether we've already compacted
2216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
2226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private boolean mCompacted;
2236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
2256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Construct a ProtoOutputStream with the default chunk size.
2266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
2276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public ProtoOutputStream() {
2286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        this(0);
2296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
2306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
2326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Construct a ProtoOutputStream with the given chunk size.
2336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
2346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public ProtoOutputStream(int chunkSize) {
2356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer = new EncodedBuffer(chunkSize);
2366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
2376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
238fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
239fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Construct a ProtoOutputStream that sits on top of an OutputStream.
240fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @more
241fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * The {@link #flush() flush()} method must be called when done writing
242fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * to flush any remanining data, althought data *may* be written at intermediate
243fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * points within the writing as well.
244fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
245fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public ProtoOutputStream(OutputStream stream) {
246fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        this();
247fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        mStream = stream;
248fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
249fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
250fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
251fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Construct a ProtoOutputStream that sits on top of a FileDescriptor.
252fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @more
253fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * The {@link #flush() flush()} method must be called when done writing
254fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * to flush any remanining data, althought data *may* be written at intermediate
255fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * points within the writing as well.
256fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
257fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public ProtoOutputStream(FileDescriptor fd) {
258fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        this(new FileOutputStream(fd));
259fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
260fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
261fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
262fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write a value for the given fieldId.
263fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
264fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Will automatically convert for the following field types, and
265fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * throw an exception for others: double, float, int32, int64, uint32, uint64,
266fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, enum.
267fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
268fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param fieldId The field identifier constant from the generated class.
269fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param val The value.
270fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
271fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void write(long fieldId, double val) {
272fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
273fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = (int)fieldId;
274fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
275fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) {
276fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // double
277fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
278fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeDoubleImpl(id, (double)val);
279fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
280fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
281fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
282fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedDoubleImpl(id, (double)val);
283fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
284fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // float
285fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
286fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFloatImpl(id, (float)val);
287fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
288fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
289fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
290fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFloatImpl(id, (float)val);
291fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
292fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // int32
293fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
294fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeInt32Impl(id, (int)val);
295fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
296fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
297fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
298fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedInt32Impl(id, (int)val);
299fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
300fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // int64
301fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
302fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeInt64Impl(id, (long)val);
303fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
304fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
305fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
306fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedInt64Impl(id, (long)val);
307fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
308fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // uint32
309fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
310fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeUInt32Impl(id, (int)val);
311fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
312fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
313fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
314fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedUInt32Impl(id, (int)val);
315fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
316fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // uint64
317fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
318fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeUInt64Impl(id, (long)val);
319fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
320fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
321fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
322fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedUInt64Impl(id, (long)val);
323fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
324fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sint32
325fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
326fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSInt32Impl(id, (int)val);
327fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
328fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
329fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
330fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSInt32Impl(id, (int)val);
331fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
332fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sint64
333fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
334fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSInt64Impl(id, (long)val);
335fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
336fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
337fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
338fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSInt64Impl(id, (long)val);
339fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
340fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // fixed32
341fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
342fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFixed32Impl(id, (int)val);
343fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
344fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
345fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
346fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFixed32Impl(id, (int)val);
347fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
348fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // fixed64
349fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
350fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFixed64Impl(id, (long)val);
351fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
352fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
353fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
354fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFixed64Impl(id, (long)val);
355fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
356fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sfixed32
357fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
358fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSFixed32Impl(id, (int)val);
359fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
360fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
361fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
362fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSFixed32Impl(id, (int)val);
363fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
364fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sfixed64
365fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
366fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSFixed64Impl(id, (long)val);
367fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
368fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
369fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
370fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSFixed64Impl(id, (long)val);
371fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
372fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // bool
373fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
374fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeBoolImpl(id, val != 0);
375fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
376fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
377fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
378fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedBoolImpl(id, val != 0);
379fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
380fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // enum
381fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
382fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeEnumImpl(id, (int)val);
383fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
384fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
385fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
386fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedEnumImpl(id, (int)val);
387fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
388fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // string, bytes, object not allowed here.
389fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            default: {
390fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                throw new IllegalArgumentException("Attempt to call write(long, double) with "
391fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                        + getFieldIdString(fieldId));
392fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            }
393fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
394fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
395fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
396fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
397fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write a value for the given fieldId.
398fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
399fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Will automatically convert for the following field types, and
400fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * throw an exception for others: double, float, int32, int64, uint32, uint64,
401fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, enum.
402fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
403fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param fieldId The field identifier constant from the generated class.
404fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param val The value.
405fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
406fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void write(long fieldId, float val) {
407fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
408fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = (int)fieldId;
409fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
410fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) {
411fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // double
412fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
413fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeDoubleImpl(id, (double)val);
414fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
415fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
416fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
417fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedDoubleImpl(id, (double)val);
418fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
419fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // float
420fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
421fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFloatImpl(id, (float)val);
422fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
423fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
424fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
425fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFloatImpl(id, (float)val);
426fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
427fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // int32
428fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
429fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeInt32Impl(id, (int)val);
430fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
431fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
432fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
433fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedInt32Impl(id, (int)val);
434fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
435fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // int64
436fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
437fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeInt64Impl(id, (long)val);
438fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
439fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
440fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
441fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedInt64Impl(id, (long)val);
442fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
443fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // uint32
444fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
445fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeUInt32Impl(id, (int)val);
446fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
447fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
448fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
449fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedUInt32Impl(id, (int)val);
450fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
451fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // uint64
452fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
453fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeUInt64Impl(id, (long)val);
454fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
455fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
456fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
457fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedUInt64Impl(id, (long)val);
458fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
459fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sint32
460fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
461fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSInt32Impl(id, (int)val);
462fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
463fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
464fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
465fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSInt32Impl(id, (int)val);
466fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
467fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sint64
468fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
469fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSInt64Impl(id, (long)val);
470fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
471fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
472fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
473fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSInt64Impl(id, (long)val);
474fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
475fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // fixed32
476fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
477fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFixed32Impl(id, (int)val);
478fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
479fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
480fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
481fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFixed32Impl(id, (int)val);
482fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
483fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // fixed64
484fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
485fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFixed64Impl(id, (long)val);
486fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
487fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
488fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
489fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFixed64Impl(id, (long)val);
490fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
491fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sfixed32
492fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
493fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSFixed32Impl(id, (int)val);
494fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
495fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
496fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
497fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSFixed32Impl(id, (int)val);
498fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
499fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sfixed64
500fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
501fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSFixed64Impl(id, (long)val);
502fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
503fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
504fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
505fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSFixed64Impl(id, (long)val);
506fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
507fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // bool
508fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
509fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeBoolImpl(id, val != 0);
510fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
511fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
512fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
513fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedBoolImpl(id, val != 0);
514fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
515fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // enum
516fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
517fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeEnumImpl(id, (int)val);
518fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
519fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
520fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
521fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedEnumImpl(id, (int)val);
522fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
523fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // string, bytes, object not allowed here.
524fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            default: {
525fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                throw new IllegalArgumentException("Attempt to call write(long, float) with "
526fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                        + getFieldIdString(fieldId));
527fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            }
528fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
529fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
530fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
531fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
532fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write a value for the given fieldId.
533fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
534fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Will automatically convert for the following field types, and
535fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * throw an exception for others: double, float, int32, int64, uint32, uint64,
536fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, enum.
537fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
538fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param fieldId The field identifier constant from the generated class.
539fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param val The value.
540fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
541fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void write(long fieldId, int val) {
542fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
543fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = (int)fieldId;
544fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
545fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) {
546fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // double
547fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
548fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeDoubleImpl(id, (double)val);
549fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
550fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
551fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
552fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedDoubleImpl(id, (double)val);
553fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
554fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // float
555fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
556fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFloatImpl(id, (float)val);
557fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
558fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
559fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
560fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFloatImpl(id, (float)val);
561fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
562fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // int32
563fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
564fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeInt32Impl(id, (int)val);
565fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
566fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
567fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
568fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedInt32Impl(id, (int)val);
569fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
570fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // int64
571fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
572fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeInt64Impl(id, (long)val);
573fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
574fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
575fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
576fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedInt64Impl(id, (long)val);
577fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
578fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // uint32
579fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
580fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeUInt32Impl(id, (int)val);
581fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
582fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
583fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
584fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedUInt32Impl(id, (int)val);
585fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
586fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // uint64
587fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
588fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeUInt64Impl(id, (long)val);
589fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
590fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
591fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
592fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedUInt64Impl(id, (long)val);
593fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
594fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sint32
595fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
596fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSInt32Impl(id, (int)val);
597fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
598fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
599fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
600fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSInt32Impl(id, (int)val);
601fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
602fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sint64
603fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
604fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSInt64Impl(id, (long)val);
605fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
606fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
607fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
608fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSInt64Impl(id, (long)val);
609fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
610fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // fixed32
611fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
612fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFixed32Impl(id, (int)val);
613fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
614fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
615fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
616fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFixed32Impl(id, (int)val);
617fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
618fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // fixed64
619fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
620fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFixed64Impl(id, (long)val);
621fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
622fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
623fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
624fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFixed64Impl(id, (long)val);
625fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
626fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sfixed32
627fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
628fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSFixed32Impl(id, (int)val);
629fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
630fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
631fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
632fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSFixed32Impl(id, (int)val);
633fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
634fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sfixed64
635fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
636fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSFixed64Impl(id, (long)val);
637fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
638fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
639fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
640fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSFixed64Impl(id, (long)val);
641fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
642fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // bool
643fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
644fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeBoolImpl(id, val != 0);
645fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
646fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
647fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
648fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedBoolImpl(id, val != 0);
649fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
650fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // enum
651fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
652fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeEnumImpl(id, (int)val);
653fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
654fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
655fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
656fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedEnumImpl(id, (int)val);
657fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
658fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // string, bytes, object not allowed here.
659fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            default: {
660fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                throw new IllegalArgumentException("Attempt to call write(long, int) with "
661fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                        + getFieldIdString(fieldId));
662fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            }
663fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
664fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
665fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
666fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
667fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write a value for the given fieldId.
668fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
669fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Will automatically convert for the following field types, and
670fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * throw an exception for others: double, float, int32, int64, uint32, uint64,
671fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, bool, enum.
672fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
673fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param fieldId The field identifier constant from the generated class.
674fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param val The value.
675fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
676fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void write(long fieldId, long val) {
677fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
678fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = (int)fieldId;
679fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
680fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) {
681fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // double
682fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
683fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeDoubleImpl(id, (double)val);
684fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
685fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
686fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_DOUBLE | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
687fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedDoubleImpl(id, (double)val);
688fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
689fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // float
690fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
691fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFloatImpl(id, (float)val);
692fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
693fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
694fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FLOAT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
695fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFloatImpl(id, (float)val);
696fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
697fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // int32
698fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
699fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeInt32Impl(id, (int)val);
700fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
701fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
702fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
703fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedInt32Impl(id, (int)val);
704fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
705fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // int64
706fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
707fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeInt64Impl(id, (long)val);
708fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
709fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
710fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_INT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
711fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedInt64Impl(id, (long)val);
712fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
713fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // uint32
714fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
715fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeUInt32Impl(id, (int)val);
716fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
717fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
718fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
719fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedUInt32Impl(id, (int)val);
720fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
721fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // uint64
722fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
723fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeUInt64Impl(id, (long)val);
724fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
725fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
726fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_UINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
727fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedUInt64Impl(id, (long)val);
728fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
729fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sint32
730fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
731fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSInt32Impl(id, (int)val);
732fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
733fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
734fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
735fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSInt32Impl(id, (int)val);
736fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
737fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sint64
738fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
739fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSInt64Impl(id, (long)val);
740fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
741fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
742fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SINT64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
743fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSInt64Impl(id, (long)val);
744fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
745fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // fixed32
746fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
747fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFixed32Impl(id, (int)val);
748fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
749fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
750fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
751fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFixed32Impl(id, (int)val);
752fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
753fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // fixed64
754fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
755fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeFixed64Impl(id, (long)val);
756fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
757fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
758fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_FIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
759fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedFixed64Impl(id, (long)val);
760fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
761fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sfixed32
762fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
763fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSFixed32Impl(id, (int)val);
764fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
765fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
766fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED32 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
767fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSFixed32Impl(id, (int)val);
768fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
769fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // sfixed64
770fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
771fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeSFixed64Impl(id, (long)val);
772fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
773fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
774fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_SFIXED64 | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
775fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedSFixed64Impl(id, (long)val);
776fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
777fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // bool
778fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
779fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeBoolImpl(id, val != 0);
780fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
781fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
782fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
783fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedBoolImpl(id, val != 0);
784fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
785fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // enum
786fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
787fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeEnumImpl(id, (int)val);
788fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
789fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
790fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_ENUM | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
791fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedEnumImpl(id, (int)val);
792fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
793fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // string, bytes, object not allowed here.
794fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            default: {
795fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                throw new IllegalArgumentException("Attempt to call write(long, long) with "
796fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                        + getFieldIdString(fieldId));
797fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            }
798fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
799fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
800fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
801fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
802fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write a boolean value for the given fieldId.
803fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
804fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * If the field is not a bool field, an exception will be thrown.
805fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
806fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param fieldId The field identifier constant from the generated class.
807fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param val The value.
808fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
809fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void write(long fieldId, boolean val) {
810fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
811fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = (int)fieldId;
812fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
813fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) {
814fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // bool
815fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
816fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeBoolImpl(id, val);
817fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
818fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
819fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BOOL | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
820fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedBoolImpl(id, val);
821fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
822fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // nothing else allowed
823fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            default: {
824fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                throw new IllegalArgumentException("Attempt to call write(long, boolean) with "
825fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                        + getFieldIdString(fieldId));
826fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            }
827fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
828fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
829fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
830fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
831fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write a string value for the given fieldId.
832fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
833fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * If the field is not a string field, an exception will be thrown.
834fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
835fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param fieldId The field identifier constant from the generated class.
836fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param val The value.
837fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
838fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void write(long fieldId, String val) {
839fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
840fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = (int)fieldId;
841fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
842fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) {
843fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // string
844fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_STRING | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
845fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeStringImpl(id, val);
846fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
847fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_STRING | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
848fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_STRING | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
849fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedStringImpl(id, val);
850fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
851fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // nothing else allowed
852fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            default: {
853fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                throw new IllegalArgumentException("Attempt to call write(long, String) with "
854fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                        + getFieldIdString(fieldId));
855fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            }
856fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
857fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
858fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
859fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
860fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write a byte[] value for the given fieldId.
861fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
862fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * If the field is not a bytes or object field, an exception will be thrown.
863fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     *
864fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param fieldId The field identifier constant from the generated class.
865fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * @param val The value.
866fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
867fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void write(long fieldId, byte[] val) {
868fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
869fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = (int)fieldId;
870fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
871fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        switch ((int)((fieldId & (FIELD_TYPE_MASK | FIELD_COUNT_MASK)) >> FIELD_TYPE_SHIFT)) {
872fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // bytes
873fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BYTES | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
874fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeBytesImpl(id, val);
875fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
876fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BYTES | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
877fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_BYTES | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
878fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedBytesImpl(id, val);
879fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
880fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // Object
881fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_OBJECT | FIELD_COUNT_SINGLE) >> FIELD_TYPE_SHIFT):
882fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeObjectImpl(id, val);
883fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
884fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_OBJECT | FIELD_COUNT_REPEATED) >> FIELD_TYPE_SHIFT):
885fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            case (int)((FIELD_TYPE_OBJECT | FIELD_COUNT_PACKED) >> FIELD_TYPE_SHIFT):
886fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                writeRepeatedObjectImpl(id, val);
887fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                break;
888fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // nothing else allowed
889fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            default: {
890fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                throw new IllegalArgumentException("Attempt to call write(long, byte[]) with "
891fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                        + getFieldIdString(fieldId));
892fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            }
893fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
894fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
895fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
896fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
897fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Start a sub object.
898fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
899fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public long start(long fieldId) {
900fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
901fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = (int)fieldId;
902fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
903fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        if ((fieldId & FIELD_TYPE_MASK) == FIELD_TYPE_OBJECT) {
904fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            final long count = fieldId & FIELD_COUNT_MASK;
905fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            if (count == FIELD_COUNT_SINGLE) {
906fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                return startObjectImpl(id, false);
907fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            } else if (count == FIELD_COUNT_REPEATED || count == FIELD_COUNT_PACKED) {
908fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                return startObjectImpl(id, true);
909fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            }
910fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
911fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        throw new IllegalArgumentException("Attempt to call start(long) with "
912fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                + getFieldIdString(fieldId));
913fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
914fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
915fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
916fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * End the object started by start() that returned token.
917fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
918fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void end(long token) {
919fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        endObjectImpl(token, getRepeatedFromToken(token));
920fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
921fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
9226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
9236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: double
9246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: double
9256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: fixed64
9266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_FIXED64
9276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
9286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
9296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
9306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "double" type field value.
93134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
93234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
9336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
93434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
9356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeDouble(long fieldId, double val) {
9366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
9376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_DOUBLE);
9386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
939fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeDoubleImpl(id, val);
940fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
941fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
942fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeDoubleImpl(int id, double val) {
9436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
9446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_FIXED64);
9456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawFixed64(Double.doubleToLongBits(val));
9466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
9476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
9486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
9496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
9506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "double" type field value.
95134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
95234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
9536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
95434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
9556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedDouble(long fieldId, double val) {
9566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
9576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_DOUBLE);
9586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
959fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedDoubleImpl(id, val);
960fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
961fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
962fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedDoubleImpl(int id, double val) {
9636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_FIXED64);
9646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed64(Double.doubleToLongBits(val));
9656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
9666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
9676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
9686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "double" type field values.
96934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
97034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
9716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
97234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
9736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedDouble(long fieldId, double[] val) {
9746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
9756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_DOUBLE);
9766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
9776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
9786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
9796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, N * 8);
9806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
9816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawFixed64(Double.doubleToLongBits(val[i]));
9826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
9836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
9846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
9856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
9866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
9876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: float
9886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: float
9896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: fixed32
9906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_FIXED32
9916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
9926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
9936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
9946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "float" type field value.
99534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
99634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
9976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
99834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
9996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeFloat(long fieldId, float val) {
10006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
10016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_FLOAT);
10026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1003fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeFloatImpl(id, val);
1004fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1005fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1006fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeFloatImpl(int id, float val) {
10076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
10086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_FIXED32);
10096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawFixed32(Float.floatToIntBits(val));
10106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
10116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
10126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
10136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
10146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "float" type field value.
101534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
101634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
10176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
101834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
10196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedFloat(long fieldId, float val) {
10206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
10216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FLOAT);
10226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1023fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedFloatImpl(id, val);
1024fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1025fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1026fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedFloatImpl(int id, float val) {
10276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_FIXED32);
10286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed32(Float.floatToIntBits(val));
10296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
10306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
10316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
10326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "float" type field value.
103334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
103434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
10356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
103634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
10376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedFloat(long fieldId, float[] val) {
10386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
10396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_FLOAT);
10406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
10416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
10426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
10436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, N * 4);
10446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
10456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawFixed32(Float.floatToIntBits(val[i]));
10466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
10476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
10486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
10496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
10506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
10516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: int32
10526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
10536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // signed/unsigned: signed
10546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: varint
10556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
10566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
10576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
10586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
10596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Writes a java int as an usigned varint.
10606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
10616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * The unadorned int32 type in protobuf is unfortunate because it
10626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * is stored in memory as a signed value, but encodes as unsigned
10636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * varints, which are formally always longs.  So here, we encode
10646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * negative values as 64 bits, which will get the sign-extension,
10656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * and positive values as 32 bits, which saves a marginal amount
10666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * of work in that it processes ints instead of longs.
10676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
10686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private void writeUnsignedVarintFromSignedInt(int val) {
10696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val >= 0) {
10706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawVarint32(val);
10716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else {
10726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawVarint64(val);
10736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
10746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
10756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
10766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
10776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "int32" type field value.
10786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
10796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Note that these are stored in memory as signed values and written as unsigned
10806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * varints, which if negative, are 10 bytes long. If you know the data is likely
10816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * to be negative, use "sint32".
108234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
108334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
10846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
108534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
10866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeInt32(long fieldId, int val) {
10876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
10886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_INT32);
10896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1090fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeInt32Impl(id, val);
1091fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1092fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1093fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeInt32Impl(int id, int val) {
10946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
10956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_VARINT);
10966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeUnsignedVarintFromSignedInt(val);
10976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
10986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
10996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
11006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
11016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "int32" type field value.
11026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
11036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Note that these are stored in memory as signed values and written as unsigned
11046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * varints, which if negative, are 10 bytes long. If you know the data is likely
11056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * to be negative, use "sint32".
110634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
110734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
11086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
110934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
11106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedInt32(long fieldId, int val) {
11116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
11126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_INT32);
11136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1114fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedInt32Impl(id, val);
1115fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1116fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1117fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedInt32Impl(int id, int val) {
11186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_VARINT);
11196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeUnsignedVarintFromSignedInt(val);
11206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
11216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
11226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
11236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "int32" type field value.
11246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
11256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Note that these are stored in memory as signed values and written as unsigned
11266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * varints, which if negative, are 10 bytes long. If you know the data is likely
11276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * to be negative, use "sint32".
112834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
112934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
11306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
113134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
11326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedInt32(long fieldId, int[] val) {
11336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
11346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_INT32);
11356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
11366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
11376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
11386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int size = 0;
11396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
11406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                final int v = val[i];
11416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                size += v >= 0 ? EncodedBuffer.getRawVarint32Size(v) : 10;
11426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
11436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, size);
11446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
11456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                writeUnsignedVarintFromSignedInt(val[i]);
11466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
11476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
11486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
11496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
11506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
11516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: int64
11526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
11536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // signed/unsigned: signed
11546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: varint
11556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
11566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
11576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
11586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
11596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "int64" type field value.
116034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
116134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
11626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
116334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
11646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeInt64(long fieldId, long val) {
11656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
11666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_INT64);
11676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1168fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeInt64Impl(id, val);
1169fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1170fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1171fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeInt64Impl(int id, long val) {
11726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
11736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_VARINT);
11746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawVarint64(val);
11756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
11766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
11776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
11786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
11796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "int64" type field value.
118034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
118134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
11826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
118334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
11846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedInt64(long fieldId, long val) {
11856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
11866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_INT64);
11876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1188fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedInt64Impl(id, val);
1189fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1190fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1191fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedInt64Impl(int id, long val) {
11926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_VARINT);
11936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawVarint64(val);
11946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
11956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
11966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
11976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "int64" type field value.
119834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
119934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
12006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
120134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
12026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedInt64(long fieldId, long[] val) {
12036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
12046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_INT64);
12056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
12066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
12076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
12086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int size = 0;
12096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
12106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                size += EncodedBuffer.getRawVarint64Size(val[i]);
12116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
12126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, size);
12136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
12146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawVarint64(val[i]);
12156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
12166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
12176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
12186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
12196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
12206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: uint32
12216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
12226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // signed/unsigned: unsigned
12236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: varint
12246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
12256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
12266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
12276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
12286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "uint32" type field value.
122934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
123034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
12316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
123234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
12336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeUInt32(long fieldId, int val) {
12346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
12356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_UINT32);
12366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1237fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeUInt32Impl(id, val);
1238fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1239fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1240fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeUInt32Impl(int id, int val) {
12416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
12426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_VARINT);
12436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawVarint32(val);
12446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
12456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
12466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
12476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
12486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "uint32" type field value.
124934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
125034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
12516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
125234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
12536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedUInt32(long fieldId, int val) {
12546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
12556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_UINT32);
12566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1257fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedUInt32Impl(id, val);
1258fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1259fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1260fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedUInt32Impl(int id, int val) {
12616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_VARINT);
12626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawVarint32(val);
12636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
12646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
12656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
12666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "uint32" type field value.
126734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
126834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
12696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
127034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
12716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedUInt32(long fieldId, int[] val) {
12726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
12736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_UINT32);
12746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
12756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
12766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
12776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int size = 0;
12786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
12796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                size += EncodedBuffer.getRawVarint32Size(val[i]);
12806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
12816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, size);
12826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
12836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawVarint32(val[i]);
12846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
12856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
12866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
12876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
12886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
12896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: uint64
12906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
12916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // signed/unsigned: unsigned
12926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: varint
12936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
12946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
12956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
12966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
12976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "uint64" type field value.
129834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
129934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
13006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
130134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
13026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeUInt64(long fieldId, long val) {
13036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
13046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_UINT64);
13056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1306fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeUInt64Impl(id, val);
1307fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1308fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1309fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeUInt64Impl(int id, long val) {
13106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
13116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_VARINT);
13126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawVarint64(val);
13136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
13146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
13156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
13166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
13176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "uint64" type field value.
131834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
131934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
13206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
132134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
13226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedUInt64(long fieldId, long val) {
13236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
13246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_UINT64);
13256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1326fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedUInt64Impl(id, val);
1327fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1328fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1329fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedUInt64Impl(int id, long val) {
13306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_VARINT);
13316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawVarint64(val);
13326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
13336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
13346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
13356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "uint64" type field value.
133634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
133734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
13386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
133934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
13406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedUInt64(long fieldId, long[] val) {
13416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
13426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_UINT64);
13436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
13446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
13456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
13466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int size = 0;
13476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
13486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                size += EncodedBuffer.getRawVarint64Size(val[i]);
13496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
13506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, size);
13516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
13526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawVarint64(val[i]);
13536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
13546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
13556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
13566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
13576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
13586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: sint32
13596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
13606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // signed/unsigned: signed
13616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: zig-zag
13626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
13636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
13646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
13656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
13666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "sint32" type field value.
136734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
136834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
13696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
137034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
13716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeSInt32(long fieldId, int val) {
13726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
13736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_SINT32);
13746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1375fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeSInt32Impl(id, val);
1376fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1377fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1378fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeSInt32Impl(int id, int val) {
13796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
13806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_VARINT);
13816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawZigZag32(val);
13826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
13836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
13846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
13856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
13866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "sint32" type field value.
138734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
138834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
13896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
139034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
13916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedSInt32(long fieldId, int val) {
13926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
13936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SINT32);
13946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1395fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedSInt32Impl(id, val);
1396fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1397fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1398fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedSInt32Impl(int id, int val) {
13996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_VARINT);
14006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawZigZag32(val);
14016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
14026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
14036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
14046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "sint32" type field value.
140534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
140634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
14076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
140834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
14096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedSInt32(long fieldId, int[] val) {
14106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
14116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_SINT32);
14126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
14136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
14146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
14156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int size = 0;
14166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
14176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                size += EncodedBuffer.getRawZigZag32Size(val[i]);
14186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
14196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, size);
14206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
14216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawZigZag32(val[i]);
14226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
14236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
14246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
14256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
14266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
14276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: sint64
14286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
14296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // signed/unsigned: signed
14306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: zig-zag
14316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
14326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
14336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
14346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
14356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "sint64" type field value.
143634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
143734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
14386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
143934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
14406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeSInt64(long fieldId, long val) {
14416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
14426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_SINT64);
14436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1444fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeSInt64Impl(id, val);
1445fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1446fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1447fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeSInt64Impl(int id, long val) {
14486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
14496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_VARINT);
14506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawZigZag64(val);
14516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
14526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
14536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
14546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
14556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "sint64" type field value.
145634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
145734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
14586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
145934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
14606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedSInt64(long fieldId, long val) {
14616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
14626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SINT64);
14636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1464fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedSInt64Impl(id, val);
1465fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1466fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1467fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedSInt64Impl(int id, long val) {
14686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_VARINT);
14696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawZigZag64(val);
14706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
14716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
14726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
14736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "sint64" type field value.
147434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
147534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
14766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
147734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
14786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedSInt64(long fieldId, long[] val) {
14796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
14806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_SINT64);
14816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
14826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
14836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
14846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int size = 0;
14856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
14866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                size += EncodedBuffer.getRawZigZag64Size(val[i]);
14876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
14886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, size);
14896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
14906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawZigZag64(val[i]);
14916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
14926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
14936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
14946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
14956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
14966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: fixed32
14976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
14986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: little endian
14996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_FIXED32
15006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
15016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
15026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
15036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "fixed32" type field value.
150434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
150534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
15066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
150734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
15086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeFixed32(long fieldId, int val) {
15096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
15106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_FIXED32);
15116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1512fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeFixed32Impl(id, val);
1513fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1514fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1515fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeFixed32Impl(int id, int val) {
15166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
15176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_FIXED32);
15186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawFixed32(val);
15196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
15206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
15216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
15226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
15236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "fixed32" type field value.
152434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
152534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
15266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
152734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
15286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedFixed32(long fieldId, int val) {
15296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
15306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FIXED32);
15316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1532fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedFixed32Impl(id, val);
1533fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1534fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1535fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedFixed32Impl(int id, int val) {
15366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_FIXED32);
15376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed32(val);
15386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
15396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
15406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
15416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "fixed32" type field value.
154234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
154334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
15446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
154534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
15466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedFixed32(long fieldId, int[] val) {
15476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
15486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_FIXED32);
15496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
15506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
15516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
15526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, N * 4);
15536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
15546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawFixed32(val[i]);
15556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
15566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
15576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
15586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
15596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
15606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: fixed64
15616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: long
15626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: fixed64
15636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_FIXED64
15646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
15656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
15666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
15676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "fixed64" type field value.
156834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
156934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
15706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
157134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
15726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeFixed64(long fieldId, long val) {
15736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
15746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_FIXED64);
15756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1576fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeFixed64Impl(id, val);
1577fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1578fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1579fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeFixed64Impl(int id, long val) {
15806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
15816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_FIXED64);
15826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawFixed64(val);
15836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
15846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
15856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
15866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
15876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "fixed64" type field value.
158834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
158934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
15906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
159134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
15926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedFixed64(long fieldId, long val) {
15936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
15946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FIXED64);
15956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1596416723dccd72aad0d4218f70b3168e6de37eb10fJoe Onorato        writeRepeatedFixed64Impl(id, val);
1597fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1598fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1599fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedFixed64Impl(int id, long val) {
16006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_FIXED64);
16016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed64(val);
16026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
16036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
16046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
16056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "fixed64" type field value.
160634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
160734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
16086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
160934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
16106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedFixed64(long fieldId, long[] val) {
16116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
16126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_FIXED64);
16136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
16146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
16156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
16166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, N * 8);
16176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
16186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawFixed64(val[i]);
16196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
16206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
16216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
16226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
16236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
16246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: sfixed32
16256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
16266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: little endian
16276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_FIXED32
16286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
16296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
16306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "sfixed32" type field value.
163134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
163234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
16336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
163434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
16356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeSFixed32(long fieldId, int val) {
16366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
16376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_SFIXED32);
16386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1639fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeSFixed32Impl(id, val);
1640fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1641fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1642fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeSFixed32Impl(int id, int val) {
16436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
16446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_FIXED32);
16456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawFixed32(val);
16466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
16476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
16486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
16496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
16506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "sfixed32" type field value.
165134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
165234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
16536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
165434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
16556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedSFixed32(long fieldId, int val) {
16566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
16576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SFIXED32);
16586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1659fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedSFixed32Impl(id, val);
1660fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1661fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1662fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedSFixed32Impl(int id, int val) {
16636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_FIXED32);
16646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed32(val);
16656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
16666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
16676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
16686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "sfixed32" type field value.
166934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
167034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
16716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
167234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
16736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedSFixed32(long fieldId, int[] val) {
16746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
16756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_SFIXED32);
16766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
16776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
16786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
16796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, N * 4);
16806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
16816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawFixed32(val[i]);
16826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
16836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
16846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
16856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
16866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
16876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: sfixed64
16886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: long
16896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: little endian
16906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_FIXED64
16916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
16926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
16936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
16946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "sfixed64" type field value.
169534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
169634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
16976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
169834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
16996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeSFixed64(long fieldId, long val) {
17006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
17016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_SFIXED64);
17026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1703fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeSFixed64Impl(id, val);
1704fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1705fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1706fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeSFixed64Impl(int id, long val) {
17076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
17086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_FIXED64);
17096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawFixed64(val);
17106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
17116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
17126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
17136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
17146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "sfixed64" type field value.
171534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
171634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
17176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
171834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
17196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedSFixed64(long fieldId, long val) {
17206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
17216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SFIXED64);
17226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1723416723dccd72aad0d4218f70b3168e6de37eb10fJoe Onorato        writeRepeatedSFixed64Impl(id, val);
1724fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1725fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1726fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedSFixed64Impl(int id, long val) {
17276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_FIXED64);
17286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed64(val);
17296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
17306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
17316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
17326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "sfixed64" type field value.
173334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
173434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
17356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
173634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
17376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedSFixed64(long fieldId, long[] val) {
17386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
17396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_SFIXED64);
17406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
17416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
17426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
17436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, N * 8);
17446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
17456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawFixed64(val[i]);
17466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
17476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
17486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
17496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
17506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
17516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: bool
17526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: boolean
17536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: varint
17546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
17556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
17566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
17576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
17586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "bool" type field value.
175934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
176034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
17616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
176234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
17636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeBool(long fieldId, boolean val) {
17646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
17656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_BOOL);
17666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1767fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeBoolImpl(id, val);
1768fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1769fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1770fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeBoolImpl(int id, boolean val) {
17716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val) {
17726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_VARINT);
17736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // 0 and 1 are the same as their varint counterparts
17746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawByte((byte)1);
17756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
17766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
17776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
17786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
17796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "bool" type field value.
178034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
178134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
17826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
178334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
17846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedBool(long fieldId, boolean val) {
17856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
17866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_BOOL);
17876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1788416723dccd72aad0d4218f70b3168e6de37eb10fJoe Onorato        writeRepeatedBoolImpl(id, val);
1789fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1790fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1791fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedBoolImpl(int id, boolean val) {
17926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_VARINT);
17936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawByte((byte)(val ? 1 : 0));
17946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
17956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
17966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
17976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "bool" type field value.
179834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
179934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
18006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
180134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
18026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedBool(long fieldId, boolean[] val) {
18036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
18046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_BOOL);
18056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
18066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
18076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
18086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // Write the header
18096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, N);
18106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
18116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // Write the data
18126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
18136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                // 0 and 1 are the same as their varint counterparts
18146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeRawByte((byte)(val[i] ? 1 : 0));
18156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
18166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
18176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
18186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
18196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
18206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: string
18216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: String
18226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: utf-8
18236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_LENGTH_DELIMITED
18246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
18256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
18266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
18276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "string" type field value.
182834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
182934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
18306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
183134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
18326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeString(long fieldId, String val) {
18336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
18346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_STRING);
18356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1836fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeStringImpl(id, val);
1837fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1838fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1839fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeStringImpl(int id, String val) {
18406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != null && val.length() > 0) {
18416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeUtf8String(id, val);
18426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
18436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
18446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
18456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
18466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "string" type field value.
184734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
184834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
18496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
185034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
18516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedString(long fieldId, String val) {
18526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
18536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_STRING);
18546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1855fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedStringImpl(id, val);
1856fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1857fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1858fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedStringImpl(int id, String val) {
18596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val == null || val.length() == 0) {
18606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, 0);
18616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else {
18626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeUtf8String(id, val);
18636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
18646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
18656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
18666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
18676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto "string" type field value.
18686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
18696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private void writeUtf8String(int id, String val) {
18706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // TODO: Is it worth converting by hand in order to not allocate?
18716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        try {
18726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            final byte[] buf = val.getBytes("UTF-8");
18736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, buf.length);
18746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawBuffer(buf);
18756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } catch (UnsupportedEncodingException ex) {
18766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            throw new RuntimeException("not possible");
18776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
18786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
18796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
18806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
18816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: bytes
18826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: byte[]
18836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: varint
18846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
18856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
18866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
18876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
18886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto "bytes" type field value.
188934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
189034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
18916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
189234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
18936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeBytes(long fieldId, byte[] val) {
18946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
18956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_BYTES);
18966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1897fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeBytesImpl(id, val);
1898fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1899fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1900fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeBytesImpl(int id, byte[] val) {
19016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != null && val.length > 0) {
19026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, val.length);
19036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.writeRawBuffer(val);
19046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
19056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
19066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
19076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
19086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto "bytes" type field value.
190934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
191034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
19116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
191234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
19136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedBytes(long fieldId, byte[] val) {
19146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
19156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_BYTES);
19166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1917fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedBytesImpl(id, val);
1918fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1919fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1920fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedBytesImpl(int id, byte[] val) {
19216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeKnownLengthHeader(id, val == null ? 0 : val.length);
19226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawBuffer(val);
19236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
19246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
19256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
19266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // proto3 type: enum
19276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // java type: int
19286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // signed/unsigned: unsigned
19296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // encoding: varint
19306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // wire type: WIRE_TYPE_VARINT
19316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
19326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
19336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
19346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single proto enum type field value.
193534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
193634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
19376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
193834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
19396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeEnum(long fieldId, int val) {
19406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
19416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_ENUM);
19426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1943fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeEnumImpl(id, val);
1944fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1945fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1946fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeEnumImpl(int id, int val) {
19476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (val != 0) {
19486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeTag(id, WIRE_TYPE_VARINT);
19496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeUnsignedVarintFromSignedInt(val);
19506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
19516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
19526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
19536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
19546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a single repeated proto enum type field value.
195534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
195634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
19576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
195834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
19596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeRepeatedEnum(long fieldId, int val) {
19606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
19616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_ENUM);
19626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
1963fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedEnumImpl(id, val);
1964fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
1965fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
1966fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private void writeRepeatedEnumImpl(int id, int val) {
19676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_VARINT);
19686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeUnsignedVarintFromSignedInt(val);
19696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
19706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
19716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
19726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a list of packed proto enum type field value.
197334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
197434531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
19756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
197634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
19776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writePackedEnum(long fieldId, int[] val) {
19786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
19796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_PACKED | FIELD_TYPE_ENUM);
19806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
19816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int N = val != null ? val.length : 0;
19826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (N > 0) {
19836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int size = 0;
19846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
19856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                final int v = val[i];
19866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                size += v >= 0 ? EncodedBuffer.getRawVarint32Size(v) : 10;
19876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
19886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            writeKnownLengthHeader(id, size);
19896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            for (int i=0; i<N; i++) {
19906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                writeUnsignedVarintFromSignedInt(val[i]);
19916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
19926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
19936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
19946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
19956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
19966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Child objects
19976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
19986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
19996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Make a token.
20016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *  Bits 61-63 - tag size (So we can go backwards later if the object had not data)
20026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *                - 3 bits, max value 7, max value needed 5
20036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *  Bit  60    - true if the object is repeated (lets us require endObject or endRepeatedObject)
20046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *  Bits 59-51 - depth (For error checking)
20056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *                - 9 bits, max value 512, when checking, value is masked (if we really
20066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *                  are more than 512 levels deep)
20076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *  Bits 32-50 - objectId (For error checking)
20086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *                - 19 bits, max value 524,288. that's a lot of objects. IDs will wrap
20096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *                  because of the overflow, and only the tokens are compared.
20106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *  Bits  0-31 - offset of the first size field in the buffer.
20116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
20126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // VisibleForTesting
20136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static long makeToken(int tagSize, boolean repeated, int depth, int objectId,
20146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int sizePos) {
20156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return ((0x07L & (long)tagSize) << 61)
20166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                | (repeated ? (1L << 60) : 0)
20176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                | (0x01ffL & (long)depth) << 51
20186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                | (0x07ffffL & (long)objectId) << 32
20196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                | (0x0ffffffffL & (long)sizePos);
20206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Get the encoded tag size from the token.
20246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
20256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static int getTagSizeFromToken(long token) {
20266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return (int)(0x7 & (token >> 61));
20276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Get whether this is a call to startObject (false) or startRepeatedObject (true).
20316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
20326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static boolean getRepeatedFromToken(long token) {
20336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return (0x1 & (token >> 60)) != 0;
20346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Get the nesting depth of startObject calls from the token.
20386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
20396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static int getDepthFromToken(long token) {
20406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return (int)(0x01ff & (token >> 51));
20416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Get the object ID from the token. The object ID is a serial number for the
20456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * startObject calls that have happened on this object.  The values are truncated
20466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * to 9 bits, but that is sufficient for error checking.
20476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
20486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static int getObjectIdFromToken(long token) {
20496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return (int)(0x07ffff & (token >> 32));
20506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Get the location of the childRawSize (the first 32 bit size field) in this object.
20546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
20556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static int getSizePosFromToken(long token) {
20566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return (int)token;
20576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Convert the object ID to the ordinal value -- the n-th call to startObject.
20616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * The object IDs start at -1 and count backwards, so that the value is unlikely
20626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * to alias with an actual size field that had been written.
20636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
20646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static int convertObjectIdToOrdinal(int objectId) {
20656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return (-1 & 0x07ffff) - objectId;
20666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Return a debugging string of a token.
20706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
20716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static String token2String(long token) {
20726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (token == 0L) {
20736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "Token(0)";
20746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else {
20756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "Token(val=0x" + Long.toHexString(token)
20766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + " depth=" + getDepthFromToken(token)
20776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + " object=" + convertObjectIdToOrdinal(getObjectIdFromToken(token))
20786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + " tagSize=" + getTagSizeFromToken(token)
20796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + " sizePos=" + getSizePosFromToken(token)
20806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + ')';
20816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
20826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
20856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Start a child object.
20866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
20876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Returns a token which should be passed to endObject.  Calls to endObject must be
20886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * nested properly.
208934531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
209034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #start() instead.
20916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
209234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
20936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public long startObject(long fieldId) {
20946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
20956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_OBJECT);
20966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
20976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return startObjectImpl(id, false);
20986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
20996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
21016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * End a child object. Pass in the token from the correspoinding startObject call.
210234531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
210334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #end() instead.
21046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
210534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
21066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void endObject(long token) {
21076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
21086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        endObjectImpl(token, false);
21106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
21116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
21136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Start a repeated child object.
21146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
21156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Returns a token which should be passed to endObject.  Calls to endObject must be
21166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * nested properly.
211734531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
211834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #start() instead.
21196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
212034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
21216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public long startRepeatedObject(long fieldId) {
21226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
21236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_OBJECT);
21246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return startObjectImpl(id, true);
21266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
21276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
21296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * End a child object. Pass in the token from the correspoinding startRepeatedObject call.
213034531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
213134531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #end() instead.
21326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
213334531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
21346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void endRepeatedObject(long token) {
21356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        assertNotCompacted();
21366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        endObjectImpl(token, true);
21386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
21396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
21416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Common implementation of startObject and startRepeatedObject.
21426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
21436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private long startObjectImpl(final int id, boolean repeated) {
21446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_LENGTH_DELIMITED);
21456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int sizePos = mBuffer.getWritePos();
21466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mDepth++;
21476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mNextObjectId--;
21486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // Write the previous token, giving us a stack of expected tokens.
21506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // After endObject returns, the first fixed32 becomeschildRawSize (set in endObject)
21516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // and the second one becomes childEncodedSize (set in editEncodedSize).
21526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed32((int)(mExpectedObjectToken >> 32));
21536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed32((int)mExpectedObjectToken);
21546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        long old = mExpectedObjectToken;
21566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mExpectedObjectToken = makeToken(getTagSize(id), repeated, mDepth, mNextObjectId, sizePos);
21586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return mExpectedObjectToken;
21596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
21606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
21626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Common implementation of endObject and endRepeatedObject.
21636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
21646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private void endObjectImpl(long token, boolean repeated) {
21656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // The upper 32 bits of the token is the depth of startObject /
21666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // endObject calls.  We could get aritrarily sophisticated, but
21676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // that's enough to prevent the common error of missing an
21686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // endObject somewhere.
21696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // The lower 32 bits of the token is the offset in the buffer
21706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // at which to write the size.
21716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int depth = getDepthFromToken(token);
21726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final boolean expectedRepeated = getRepeatedFromToken(token);
21736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int sizePos = getSizePosFromToken(token);
21746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final int childRawSize = mBuffer.getWritePos() - sizePos - 8;
21756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (repeated != expectedRepeated) {
21776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            if (repeated) {
21786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                throw new IllegalArgumentException("endRepeatedObject called where endObject should"
21796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        + " have been");
21806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            } else {
21816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                throw new IllegalArgumentException("endObject called where endRepeatedObject should"
21826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        + " have been");
21836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
21846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
21856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // Check that we're getting the token and depth that we are expecting.
21876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if ((mDepth & 0x01ff) != depth || mExpectedObjectToken != token) {
21886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // This text of exception is united tested.  That test also implicity checks
21896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // that we're tracking the objectIds and depths correctly.
21906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            throw new IllegalArgumentException("Mismatched startObject/endObject calls."
21916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + " Current depth " + mDepth
21926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + " token=" + token2String(token)
21936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + " expectedToken=" + token2String(mExpectedObjectToken));
21946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
21956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
21966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // Get the next expected token that we stashed away in the buffer.
21976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mExpectedObjectToken = (((long)mBuffer.getRawFixed32At(sizePos)) << 32)
21986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                | (0x0ffffffffL & (long)mBuffer.getRawFixed32At(sizePos+4));
21996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
22006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mDepth--;
22016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (childRawSize > 0) {
22026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.editRawFixed32(sizePos, -childRawSize);
22036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.editRawFixed32(sizePos+4, -1);
22046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else if (repeated) {
22056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.editRawFixed32(sizePos, 0);
22066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.editRawFixed32(sizePos+4, 0);
22076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else {
22086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // The object has no data.  Don't include it.
22096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.rewindWriteTo(sizePos - getTagSizeFromToken(token));
22106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
22116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
22126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2213fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
2214fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write an object that has already been flattend.
221534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
221634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
2217fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
221834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
2219fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void writeObject(long fieldId, byte[] value) {
2220fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
2221fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_SINGLE | FIELD_TYPE_OBJECT);
2222fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
2223fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeObjectImpl(id, value);
2224fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
2225fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
222634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    void writeObjectImpl(int id, byte[] value) {
2227fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        if (value != null && value.length != 0) {
2228fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            writeKnownLengthHeader(id, value.length);
2229fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            mBuffer.writeRawBuffer(value);
2230fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
2231fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
2232fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
2233fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
2234fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write an object that has already been flattend.
223534531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     *
223634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki     * @deprecated Use #write instead.
2237fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
223834531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    @Deprecated
2239fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void writeRepeatedObject(long fieldId, byte[] value) {
2240fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        assertNotCompacted();
2241fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_OBJECT);
2242fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
2243fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeRepeatedObjectImpl(id, value);
2244fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
2245fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
224634531943605e4d511263c0720850d91bb501f0a2Makoto Onuki    void writeRepeatedObjectImpl(int id, byte[] value) {
2247fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        writeKnownLengthHeader(id, value == null ? 0 : value.length);
2248fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        mBuffer.writeRawBuffer(value);
2249fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
2250fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
22516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
22526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Tags
22536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
22546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
22556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
22566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Combine a fieldId (the field keys in the proto file) and the field flags.
22576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Mostly useful for testing because the generated code contains the fieldId
22586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * constants.
22596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
22606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static long makeFieldId(int id, long fieldFlags) {
22616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return fieldFlags | (((long)id) & 0x0ffffffffL);
22626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
22636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
22646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
22656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Validates that the fieldId providied is of the type and count from expectedType.
22666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
22676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * The type must match exactly to pass this check.
22686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
22696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * The count must match according to this truth table to pass the check:
22706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
22716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *                  expectedFlags
22726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *                  UNKNOWN     SINGLE      REPEATED    PACKED
22736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *    fieldId
22746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *    UNKNOWN       true        false       false       false
22756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *    SINGLE        x           true        false       false
22766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *    REPEATED      x           false       true        false
22776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *    PACKED        x           false       true        true
22786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
22796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * @throws IllegalArgumentException if it is not.
22806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
22816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * @return The raw ID of that field.
22826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
22836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public static int checkFieldId(long fieldId, long expectedFlags) {
22846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final long fieldCount = fieldId & FIELD_COUNT_MASK;
22856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final long fieldType = fieldId & FIELD_TYPE_MASK;
22866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final long expectedCount = expectedFlags & FIELD_COUNT_MASK;
22876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        final long expectedType = expectedFlags & FIELD_TYPE_MASK;
22886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (((int)fieldId) == 0) {
22896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            throw new IllegalArgumentException("Invalid proto field " + (int)fieldId
22906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    + " fieldId=" + Long.toHexString(fieldId));
22916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
22926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (fieldType != expectedType
22936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                || !((fieldCount == expectedCount)
22946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    || (fieldCount == FIELD_COUNT_PACKED
22956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        && expectedCount == FIELD_COUNT_REPEATED))) {
22966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            final String countString = getFieldCountString(fieldCount);
22976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            final String typeString = getFieldTypeString(fieldType);
22986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            if (typeString != null && countString != null) {
22996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                final StringBuilder sb = new StringBuilder();
23006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                if (expectedType == FIELD_TYPE_OBJECT) {
23016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    sb.append("start");
23026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                } else {
23036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    sb.append("write");
23046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                }
23056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(getFieldCountString(expectedCount));
23066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(getFieldTypeString(expectedType));
23076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(" called for field ");
23086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append((int)fieldId);
23096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(" which should be used with ");
23106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                if (fieldType == FIELD_TYPE_OBJECT) {
23116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    sb.append("start");
23126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                } else {
23136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    sb.append("write");
23146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                }
23156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(countString);
23166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(typeString);
23176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                if (fieldCount == FIELD_COUNT_PACKED) {
23186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    sb.append(" or writeRepeated");
23196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    sb.append(typeString);
23206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                }
23216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append('.');
23226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                throw new IllegalArgumentException(sb.toString());
23236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            } else {
23246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                final StringBuilder sb = new StringBuilder();
23256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                if (expectedType == FIELD_TYPE_OBJECT) {
23266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    sb.append("start");
23276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                } else {
23286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    sb.append("write");
23296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                }
23306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(getFieldCountString(expectedCount));
23316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(getFieldTypeString(expectedType));
23326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(" called with an invalid fieldId: 0x");
23336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(Long.toHexString(fieldId));
23346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append(". The proto field ID might be ");
23356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append((int)fieldId);
23366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                sb.append('.');
23376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                throw new IllegalArgumentException(sb.toString());
23386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
23396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
23406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return (int)fieldId;
23416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
23426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
23436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
23446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Get the developer-usable name of a field type.
23456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
23466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private static String getFieldTypeString(long fieldType) {
23476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        int index = ((int)((fieldType & FIELD_TYPE_MASK) >>> FIELD_TYPE_SHIFT)) - 1;
23486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (index >= 0 && index < FIELD_TYPE_NAMES.length) {
23496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return FIELD_TYPE_NAMES[index];
23506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else {
23516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return null;
23526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
23536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
23546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
23556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
23566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Get the developer-usable name of a field count.
23576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
23586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private static String getFieldCountString(long fieldCount) {
23596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (fieldCount == FIELD_COUNT_SINGLE) {
23606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "";
23616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else if (fieldCount == FIELD_COUNT_REPEATED) {
23626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "Repeated";
23636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else if (fieldCount == FIELD_COUNT_PACKED) {
23646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return "Packed";
23656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        } else {
23666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return null;
23676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
23686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
23696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
2370fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
2371fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Get a debug string for a fieldId.
2372fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
2373fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    private String getFieldIdString(long fieldId) {
2374fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final long fieldCount = fieldId & FIELD_COUNT_MASK;
2375fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        String countString = getFieldCountString(fieldCount);
2376fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        if (countString == null) {
2377fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            countString = "fieldCount=" + fieldCount;
2378fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
2379fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
2380fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final long fieldType = fieldId & FIELD_TYPE_MASK;
2381fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        String typeString = getFieldTypeString(fieldType);
2382fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        if (typeString == null) {
2383fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            typeString = "fieldType=" + fieldType;
2384fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
2385fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
2386fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        return fieldCount + " " + typeString + " tag=" + ((int)fieldId)
2387fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato                + " fieldId=0x" + Long.toHexString(fieldId);
2388fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
23896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
23906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
23916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Return how many bytes an encoded field tag will require.
23926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
23936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private static int getTagSize(int id) {
23946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return EncodedBuffer.getRawVarint32Size(id << FIELD_ID_SHIFT);
23956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
23966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
23976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
23986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write a field tage to the stream.
23996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
24006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void writeTag(int id, int wireType) {
24016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawVarint32((id << FIELD_ID_SHIFT) | wireType);
24026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
24036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
24056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Write the header of a WIRE_TYPE_LENGTH_DELIMITED field for one where
24066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * we know the size in advance and do not need to compute and compact.
24076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
24086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private void writeKnownLengthHeader(int id, int size) {
24096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // Write the tag
24106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        writeTag(id, WIRE_TYPE_LENGTH_DELIMITED);
24116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // Size will be compacted later, but we know the size, so write it,
24126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        // once for the rawSize and once for the encodedSize.
24136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed32(size);
24146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.writeRawFixed32(size);
24156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
24166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
24186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    // Getting the buffer and compaction
24196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    //
24206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
24226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Assert that the compact call has not already occured.
24236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
24246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * TODO: Will change when we add the OutputStream version of ProtoOutputStream.
24256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
24266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private void assertNotCompacted() {
24276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (mCompacted) {
24286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            throw new IllegalArgumentException("write called after compact");
24296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
24306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
24316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
24336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Finish the encoding of the data, and return a byte[] with
24346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * the protobuf formatted data.
24356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     *
24366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * After this call, do not call any of the write* functions. The
24376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * behavior is undefined.
24386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
24396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public byte[] getBytes() {
24406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        compactIfNecessary();
24416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return mBuffer.getBytes(mBuffer.getReadableSize());
24436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
24446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
24466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * If the buffer hasn't already had the nested object size fields compacted
24476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * and turned into an actual protobuf format, then do so.
24486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
24496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private void compactIfNecessary() {
24506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (!mCompacted) {
24516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            if (mDepth != 0) {
24526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                throw new IllegalArgumentException("Trying to compact with " + mDepth
24536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        + " missing calls to endObject");
24546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
24556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // The buffer must be compacted.
24576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.startEditing();
24586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            final int readableSize = mBuffer.getReadableSize();
24596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // Cache the sizes of the objects
24616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            editEncodedSize(readableSize);
24626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // Re-write the buffer with the sizes as proper varints instead
24646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // of pairs of uint32s. We know this will always fit in the same
24656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // buffer because the pair of uint32s is exactly 8 bytes long, and
24666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // the single varint size will be no more than 5 bytes long.
24676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.rewindRead();
24686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            compactSizes(readableSize);
24696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // If there is any data left over that wasn't copied yet, copy it.
24716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            if (mCopyBegin < readableSize) {
24726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                mBuffer.writeFromThisBuffer(mCopyBegin, readableSize - mCopyBegin);
24736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
24746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // Set the new readableSize
24766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mBuffer.startEditing();
24776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // It's not valid to write to this object anymore. The write
24796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // pointers are off, and then some of the data would be compacted
24806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // and some not.
24816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            mCompacted = true;
24826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
24836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
24846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
24866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * First compaction pass.  Iterate through the data, and fill in the
24876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * nested object sizes so the next pass can compact them.
24886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
24896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private int editEncodedSize(int rawSize) {
24906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        int objectStart = mBuffer.getReadPos();
24916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        int objectEnd = objectStart + rawSize;
24926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        int encodedSize = 0;
24936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        int tagPos;
24946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        while ((tagPos = mBuffer.getReadPos()) < objectEnd) {
24966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int tag = readRawTag();
24976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            encodedSize += EncodedBuffer.getRawVarint32Size(tag);
24986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
24996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            final int wireType = tag & WIRE_TYPE_MASK;
25006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            switch (wireType) {
25016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_VARINT:
25026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    encodedSize++;
25036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    while ((mBuffer.readRawByte() & 0x80) != 0) {
25046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        encodedSize++;
25056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    }
25066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    break;
25076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_FIXED64:
25086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    encodedSize += 8;
25096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    mBuffer.skipRead(8);
25106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    break;
25116c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_LENGTH_DELIMITED: {
25126c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    // This object is not of a fixed-size type.  So we need to figure
25136c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    // out how big it should be.
25146c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    final int childRawSize = mBuffer.readRawFixed32();
25156c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    final int childEncodedSizePos = mBuffer.getReadPos();
25166c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    int childEncodedSize = mBuffer.readRawFixed32();
25176c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    if (childRawSize >= 0) {
25186c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        // We know the size, just skip ahead.
25196c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        if (childEncodedSize != childRawSize) {
25206c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                            throw new RuntimeException("Pre-computed size where the"
25216c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                                    + " precomputed size and the raw size in the buffer"
25226c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                                    + " don't match! childRawSize=" + childRawSize
25236c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                                    + " childEncodedSize=" + childEncodedSize
25246c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                                    + " childEncodedSizePos=" + childEncodedSizePos);
25256c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        }
25266c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        mBuffer.skipRead(childRawSize);
25276c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    } else {
25286c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        // We need to compute the size.  Recurse.
25296c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        childEncodedSize = editEncodedSize(-childRawSize);
25306c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        mBuffer.editRawFixed32(childEncodedSizePos, childEncodedSize);
25316c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    }
25326c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    encodedSize += EncodedBuffer.getRawVarint32Size(childEncodedSize)
25336c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                            + childEncodedSize;
25346c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    break;
25356c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                }
25366c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_START_GROUP:
25376c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_END_GROUP:
25386c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    throw new RuntimeException("groups not supported at index " + tagPos);
25396c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_FIXED32:
25406c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    encodedSize += 4;
25416c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    mBuffer.skipRead(4);
25426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    break;
25436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                default:
25446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    throw new ProtoParseException("editEncodedSize Bad tag tag=0x"
25456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                            + Integer.toHexString(tag) + " wireType=" + wireType
25466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                            + " -- " + mBuffer.getDebugString());
25476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
25486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
25496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
25506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return encodedSize;
25516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
25526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
25536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
25546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Second compaction pass.  Iterate through the data, and copy the data
25556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * forward in the buffer, converting the pairs of uint32s into a single
25566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * unsigned varint of the size.
25576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
25586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private void compactSizes(int rawSize) {
25596c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        int objectStart = mBuffer.getReadPos();
25606c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        int objectEnd = objectStart + rawSize;
25616c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        int tagPos;
25626c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        while ((tagPos = mBuffer.getReadPos()) < objectEnd) {
25636c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            int tag = readRawTag();
25646c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
25656c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // For all the non-length-delimited field types, just skip over them,
25666c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // and we'll just System.arraycopy it later, either in the case for
25676c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            // WIRE_TYPE_LENGTH_DELIMITED or at the top of the stack in compactIfNecessary().
25686c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            final int wireType = tag & WIRE_TYPE_MASK;
25696c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            switch (wireType) {
25706c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_VARINT:
25716c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    while ((mBuffer.readRawByte() & 0x80) != 0) { }
25726c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    break;
25736c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_FIXED64:
25746c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    mBuffer.skipRead(8);
25756c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    break;
25766c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_LENGTH_DELIMITED: {
25776c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    // Copy everything up to now, including the tag for this field.
25786c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    mBuffer.writeFromThisBuffer(mCopyBegin, mBuffer.getReadPos() - mCopyBegin);
25796c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    // Write the new size.
25806c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    final int childRawSize = mBuffer.readRawFixed32();
25816c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    final int childEncodedSize = mBuffer.readRawFixed32();
25826c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    mBuffer.writeRawVarint32(childEncodedSize);
25836c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    // Next time, start copying from here.
25846c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    mCopyBegin = mBuffer.getReadPos();
25856c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    if (childRawSize >= 0) {
25866c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        // This is raw data, not an object. Skip ahead by the size.
25876c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        // Recurse into the child
25886c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        mBuffer.skipRead(childEncodedSize);
25896c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    } else {
25906c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                        compactSizes(-childRawSize);
25916c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    }
25926c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    break;
25936c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    // TODO: What does regular proto do if the object would be 0 size
25946c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    // (e.g. if it is all default values).
25956c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                }
25966c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_START_GROUP:
25976c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_END_GROUP:
25986c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    throw new RuntimeException("groups not supported at index " + tagPos);
25996c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                case WIRE_TYPE_FIXED32:
26006c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    mBuffer.skipRead(4);
26016c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    break;
26026c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                default:
26036c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                    throw new ProtoParseException("compactSizes Bad tag tag=0x"
26046c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                            + Integer.toHexString(tag) + " wireType=" + wireType
26056c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato                            + " -- " + mBuffer.getDebugString());
26066c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            }
26076c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
26086c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
26096c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
26106c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
2611fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * Write remaining data to the output stream.  If there is no output stream,
2612fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * this function does nothing. Any currently open objects (i.e. ones that
2613fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * have not had endObject called for them will not be written).  Whether this
2614fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * writes objects that are closed if there are remaining open objects is
2615fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * undefined (current implementation does not write it, future ones will).
2616fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     * For now, can either call getBytes() or flush(), but not both.
2617fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato     */
2618fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    public void flush() {
2619fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        if (mStream == null) {
2620fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            return;
2621fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
2622fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        if (mDepth != 0) {
2623fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // TODO: The compacting code isn't ready yet to compact unless we're done.
2624fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // TODO: Fix that.
2625fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            return;
2626fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
2627fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        if (mCompacted) {
2628fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            // If we're compacted, we already wrote it finished.
2629fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            return;
2630fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
2631fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        compactIfNecessary();
2632fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        final byte[] data = mBuffer.getBytes(mBuffer.getReadableSize());
2633fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        try {
2634fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            mStream.write(data);
2635fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            mStream.flush();
2636fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        } catch (IOException ex) {
2637fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato            throw new RuntimeException("Error flushing proto to stream", ex);
2638fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato        }
2639fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    }
2640fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato
2641fb9f736a3c6c2e1c91c69b1abc0456b54215e8efJoe Onorato    /**
26426c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Read a raw tag from the buffer.
26436c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
26446c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    private int readRawTag() {
26456c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        if (mBuffer.getReadPos() == mBuffer.getReadableSize()) {
26466c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato            return 0;
26476c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        }
26486c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        return (int)mBuffer.readRawUnsigned();
26496c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
26506c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato
26516c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    /**
26526c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     * Dump debugging data about the buffers with the given log tag.
26536c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato     */
26546c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    public void dump(String tag) {
26556c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        Log.d(tag, mBuffer.getDebugString());
26566c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato        mBuffer.dumpBuffers(tag);
26576c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato    }
26586c9547d8e1c35d7afa9bc9be11d5ff86ec60db14Joe Onorato}
2659