164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Protocol Buffers - Google's data interchange format
264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Copyright 2013 Google Inc.  All rights reserved.
364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// http://code.google.com/p/protobuf/
464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Redistribution and use in source and binary forms, with or without
664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// modification, are permitted provided that the following conditions are
764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// met:
864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Redistributions of source code must retain the above copyright
1064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// notice, this list of conditions and the following disclaimer.
1164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Redistributions in binary form must reproduce the above
1264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// copyright notice, this list of conditions and the following disclaimer
1364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// in the documentation and/or other materials provided with the
1464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// distribution.
1564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Neither the name of Google Inc. nor the names of its
1664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// contributors may be used to endorse or promote products derived from
1764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// this software without specific prior written permission.
1864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
1964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcipackage com.google.protobuf.nano;
3264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciimport java.io.IOException;
3464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci/**
3664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * This class is used internally by the Protocol Buffer library and generated
3764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * message implementations.  It is public only because those generated messages
3864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * do not reside in the {@code protobuf} package.  Others should not use this
3964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * class directly.
4064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci *
4164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * This class contains constants and helper functions useful for dealing with
4264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * the Protocol Buffer wire format.
4364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci *
4464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci * @author kenton@google.com Kenton Varda
4564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci */
4664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcipublic final class WireFormatNano {
4764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  // Do not allow instantiation.
4864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  private WireFormatNano() {}
4964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
5064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static final int WIRETYPE_VARINT           = 0;
5164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static final int WIRETYPE_FIXED64          = 1;
5264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static final int WIRETYPE_LENGTH_DELIMITED = 2;
5364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static final int WIRETYPE_START_GROUP      = 3;
5464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static final int WIRETYPE_END_GROUP        = 4;
5564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static final int WIRETYPE_FIXED32          = 5;
5664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
5764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static final int TAG_TYPE_BITS = 3;
5864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static final int TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1;
5964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
6064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  /** Given a tag value, determines the wire type (the lower 3 bits). */
6164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static int getTagWireType(final int tag) {
6264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    return tag & TAG_TYPE_MASK;
6364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
6464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
6564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  /** Given a tag value, determines the field number (the upper 29 bits). */
6664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static int getTagFieldNumber(final int tag) {
6764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    return tag >>> TAG_TYPE_BITS;
6864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
6964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
7064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  /** Makes a tag value given a field number and wire type. */
7164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  static int makeTag(final int fieldNumber, final int wireType) {
7264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    return (fieldNumber << TAG_TYPE_BITS) | wireType;
7364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
7464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
7564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final int EMPTY_INT_ARRAY[] = {};
7664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final long EMPTY_LONG_ARRAY[] = {};
7764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final float EMPTY_FLOAT_ARRAY[] = {};
7864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final double EMPTY_DOUBLE_ARRAY[] = {};
7964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final boolean EMPTY_BOOLEAN_ARRAY[] = {};
8064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final String EMPTY_STRING_ARRAY[] = {};
8164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final byte[] EMPTY_BYTES_ARRAY[] = {};
8264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final byte[] EMPTY_BYTES = {};
8364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
8464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  /**
850e055f079f53b07de3705838a7b4742ce56839f8Brian Duff   * Parses an unknown field. This implementation skips the field.
860e055f079f53b07de3705838a7b4742ce56839f8Brian Duff   *
870e055f079f53b07de3705838a7b4742ce56839f8Brian Duff   * <p>Generated messages will call this for unknown fields if the store_unknown_fields
880e055f079f53b07de3705838a7b4742ce56839f8Brian Duff   * option is off.
890e055f079f53b07de3705838a7b4742ce56839f8Brian Duff   *
900e055f079f53b07de3705838a7b4742ce56839f8Brian Duff   * @return {@literal true} unless the tag is an end-group tag.
9164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   */
9264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static boolean parseUnknownField(
9364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      final CodedInputByteBufferNano input,
9464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      final int tag) throws IOException {
9564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    return input.skipField(tag);
9664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
9764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
9864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  /**
9964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * Computes the array length of a repeated field. We assume that in the common case repeated
10064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * fields are contiguously serialized but we still correctly handle interspersed values of a
10164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * repeated field (but with extra allocations).
10264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   *
10364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * Rewinds to current input position before returning.
10464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   *
10564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * @param input stream input, pointing to the byte after the first tag
10664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * @param tag repeated field tag just read
10764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * @return length of array
10864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   * @throws IOException
10964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci   */
11064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  public static final int getRepeatedFieldArrayLength(
11164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      final CodedInputByteBufferNano input,
11264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      final int tag) throws IOException {
11364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int arrayLength = 1;
11464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    int startPos = input.getPosition();
11564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    input.skipField(tag);
11664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    while (input.getBytesUntilLimit() > 0) {
11764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      int thisTag = input.readTag();
11864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      if (thisTag != tag) {
11964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci        break;
12064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      }
12164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      input.skipField(tag);
12264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci      arrayLength++;
12364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    }
12464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    input.rewindToPosition(startPos);
12564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    return arrayLength;
12664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
1270e055f079f53b07de3705838a7b4742ce56839f8Brian Duff
12864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
129