1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format 2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc. All rights reserved. 3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/ 4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without 6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are 7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met: 8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions of source code must retain the above copyright 10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer. 11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions in binary form must reproduce the above 12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer 13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the 14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution. 15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Neither the name of Google Inc. nor the names of its 16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from 17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission. 18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerpackage com.google.protobuf; 32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.io.IOException; 34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.lang.reflect.Method; 35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.nio.ByteBuffer; 36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.nio.charset.Charset; 37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.AbstractList; 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.AbstractMap; 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.AbstractSet; 40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.Arrays; 41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.Iterator; 42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.List; 43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.Map; 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.RandomAccess; 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport java.util.Set; 46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/** 48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * The classes contained within are used internally by the Protocol Buffer 49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * library and generated message implementations. They are public only because 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * those generated messages do not reside in the {@code protobuf} package. 51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Others should not use this class directly. 52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @author kenton@google.com (Kenton Varda) 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerpublic final class Internal { 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private Internal() {} 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static final Charset UTF_8 = Charset.forName("UTF-8"); 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); 61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper called by generated code to construct default values for string 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * fields. 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p> 66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * The protocol compiler does not actually contain a UTF-8 decoder -- it 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * just pushes UTF-8-encoded text around without touching it. The one place 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * where this presents a problem is when generating Java string literals. 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Unicode characters in the string literal would normally need to be encoded 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * using a Unicode escape sequence, which would require decoding them. 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * To get around this, protoc instead embeds the UTF-8 bytes into the 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * generated code and leaves it to the runtime library to decode them. 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p> 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * It gets worse, though. If protoc just generated a byte array, like: 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * new byte[] {0x12, 0x34, 0x56, 0x78} 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Java actually generates *code* which allocates an array and then fills 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * in each value. This is much less efficient than just embedding the bytes 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * directly into the bytecode. To get around this, we need another 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * work-around. String literals are embedded directly, so protoc actually 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * generates a string literal corresponding to the bytes. The easiest way 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * to do this is to use the ISO-8859-1 character set, which corresponds to 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * the first 256 characters of the Unicode range. Protoc can then use 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * good old CEscape to generate the string. 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p> 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * So we have a string literal which represents a set of bytes which 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * represents another string. This function -- stringDefaultValue -- 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * converts from the generated string to the string we actually want. The 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * generated code calls this automatically. 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static String stringDefaultValue(String bytes) { 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return new String(bytes.getBytes(ISO_8859_1), UTF_8); 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper called by generated code to construct default values for bytes 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * fields. 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p> 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * This is a lot like {@link #stringDefaultValue}, but for bytes fields. 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * In this case we only need the second of the two hacks -- allowing us to 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * embed raw bytes as a string literal with ISO-8859-1 encoding. 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static ByteString bytesDefaultValue(String bytes) { 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return ByteString.copyFrom(bytes.getBytes(ISO_8859_1)); 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper called by generated code to construct default values for bytes 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * fields. 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p> 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * This is like {@link #bytesDefaultValue}, but returns a byte array. 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static byte[] byteArrayDefaultValue(String bytes) { 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return bytes.getBytes(ISO_8859_1); 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper called by generated code to construct default values for bytes 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * fields. 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p> 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * This is like {@link #bytesDefaultValue}, but returns a ByteBuffer. 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static ByteBuffer byteBufferDefaultValue(String bytes) { 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return ByteBuffer.wrap(byteArrayDefaultValue(bytes)); 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Create a new ByteBuffer and copy all the content of {@code source} 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * ByteBuffer to the new ByteBuffer. The new ByteBuffer's limit and 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * capacity will be source.capacity(), and its position will be 0. 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Note that the state of {@code source} ByteBuffer won't be changed. 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static ByteBuffer copyByteBuffer(ByteBuffer source) { 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Make a duplicate of the source ByteBuffer and read data from the 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // duplicate. This is to avoid affecting the source ByteBuffer's state. 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ByteBuffer temp = source.duplicate(); 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // We want to copy all the data in the source ByteBuffer, not just the 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // remaining bytes. 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer temp.clear(); 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ByteBuffer result = ByteBuffer.allocate(temp.capacity()); 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer result.put(temp); 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer result.clear(); 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return result; 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper called by generated code to determine if a byte array is a valid 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * UTF-8 encoded string such that the original bytes can be converted to 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * a String object and then back to a byte array round tripping the bytes 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * without loss. More precisely, returns {@code true} whenever: 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <pre> {@code 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Arrays.equals(byteString.toByteArray(), 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * new String(byteString.toByteArray(), "UTF-8").getBytes("UTF-8")) 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * }</pre> 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p>This method rejects "overlong" byte sequences, as well as 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 3-byte sequences that would map to a surrogate character, in 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * accordance with the restricted definition of UTF-8 introduced in 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Unicode 3.1. Note that the UTF-8 decoder included in Oracle's 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * JDK has been modified to also reject "overlong" byte sequences, 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * but currently (2011) still accepts 3-byte surrogate character 160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * byte sequences. 161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p>See the Unicode Standard,<br> 163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Table 3-6. <em>UTF-8 Bit Distribution</em>,<br> 164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Table 3-7. <em>Well Formed UTF-8 Byte Sequences</em>. 165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p>As of 2011-02, this method simply returns the result of {@link 167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * ByteString#isValidUtf8()}. Calling that method directly is preferred. 168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @param byteString the string to check 170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @return whether the byte array is round trippable 171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static boolean isValidUtf8(ByteString byteString) { 173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return byteString.isValidUtf8(); 174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #isValidUtf8(ByteString)} but for byte arrays. 178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static boolean isValidUtf8(byte[] byteArray) { 180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return Utf8.isValidUtf8(byteArray); 181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method to get the UTF-8 bytes of a string. 185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static byte[] toByteArray(String value) { 187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value.getBytes(UTF_8); 188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method to convert a byte array to a string using UTF-8 encoding. 192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static String toStringUtf8(byte[] bytes) { 194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return new String(bytes, UTF_8); 195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Interface for an enum value or value descriptor, to be used in FieldSet. 199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * The lite library stores enum values directly in FieldSets but the full 200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * library stores EnumValueDescriptors in order to better support reflection. 201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public interface EnumLite { 203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int getNumber(); 204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Interface for an object which maps integers to {@link EnumLite}s. 208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * {@link Descriptors.EnumDescriptor} implements this interface by mapping 209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * numbers to {@link Descriptors.EnumValueDescriptor}s. Additionally, 210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * every generated enum type has a static method internalGetValueMap() which 211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * returns an implementation of this type that maps numbers to enum values. 212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public interface EnumLiteMap<T extends EnumLite> { 214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer T findValueByNumber(int number); 215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#hashCode()} for longs. 219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @see Long#hashCode() 220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static int hashLong(long n) { 222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return (int) (n ^ (n >>> 32)); 223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#hashCode()} for 227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * booleans. 228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * @see Boolean#hashCode() 229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static int hashBoolean(boolean b) { 231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return b ? 1231 : 1237; 232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#hashCode()} for enums. 236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p> 237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * This is needed because {@link java.lang.Enum#hashCode()} is final, but we 238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * need to use the field number as the hash code to ensure compatibility 239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * between statically and dynamically generated enum objects. 240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static int hashEnum(EnumLite e) { 242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return e.getNumber(); 243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#hashCode()} for 247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * enum lists. 248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static int hashEnumList(List<? extends EnumLite> list) { 250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int hash = 1; 251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (EnumLite e : list) { 252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer hash = 31 * hash + hashEnum(e); 253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return hash; 255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#equals(Object)} for bytes field. 259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static boolean equals(List<byte[]> a, List<byte[]> b) { 261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (a.size() != b.size()) return false; 262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < a.size(); ++i) { 263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!Arrays.equals(a.get(i), b.get(i))) { 264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return false; 265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return true; 268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#hashCode()} for bytes field. 272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static int hashCode(List<byte[]> list) { 274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int hash = 1; 275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (byte[] bytes : list) { 276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer hash = 31 * hash + hashCode(bytes); 277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return hash; 279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#hashCode()} for bytes field. 283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static int hashCode(byte[] bytes) { 285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // The hash code for a byte array should be the same as the hash code for a 286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ByteString with the same content. This is to ensure that the generated 287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // hashCode() method will return the same value as the pure reflection 288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // based hashCode() method. 289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return Internal.hashCode(bytes, 0, bytes.length); 290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link LiteralByteString#hashCode()}. 294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static int hashCode(byte[] bytes, int offset, int length) { 296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // The hash code for a byte array should be the same as the hash code for a 297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ByteString with the same content. This is to ensure that the generated 298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // hashCode() method will return the same value as the pure reflection 299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // based hashCode() method. 300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int h = Internal.partialHash(length, bytes, offset, length); 301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return h == 0 ? 1 : h; 302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for continuously hashing bytes. 306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static int partialHash(int h, byte[] bytes, int offset, int length) { 308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = offset; i < offset + length; i++) { 309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer h = h * 31 + bytes[i]; 310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return h; 312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#equals(Object)} for bytes 316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * field. 317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static boolean equalsByteBuffer(ByteBuffer a, ByteBuffer b) { 319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (a.capacity() != b.capacity()) { 320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return false; 321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ByteBuffer.equals() will only compare the remaining bytes, but we want to 323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // compare all the content. 324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return a.duplicate().clear().equals(b.duplicate().clear()); 325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#equals(Object)} for bytes 329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * field. 330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static boolean equalsByteBuffer( 332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer List<ByteBuffer> a, List<ByteBuffer> b) { 333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (a.size() != b.size()) { 334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return false; 335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (int i = 0; i < a.size(); ++i) { 337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!equalsByteBuffer(a.get(i), b.get(i))) { 338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return false; 339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return true; 342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#hashCode()} for bytes 346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * field. 347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static int hashCodeByteBuffer(List<ByteBuffer> list) { 349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int hash = 1; 350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer for (ByteBuffer bytes : list) { 351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer hash = 31 * hash + hashCodeByteBuffer(bytes); 352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return hash; 354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private static final int DEFAULT_BUFFER_SIZE = 4096; 357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Helper method for implementing {@link Message#hashCode()} for bytes 360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * field. 361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static int hashCodeByteBuffer(ByteBuffer bytes) { 363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (bytes.hasArray()) { 364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Fast path. 365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int h = partialHash(bytes.capacity(), bytes.array(), bytes.arrayOffset(), bytes.capacity()); 366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return h == 0 ? 1 : h; 367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Read the data into a temporary byte array before calculating the 369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // hash value. 370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer final int bufferSize = bytes.capacity() > DEFAULT_BUFFER_SIZE 371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ? DEFAULT_BUFFER_SIZE : bytes.capacity(); 372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer final byte[] buffer = new byte[bufferSize]; 373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer final ByteBuffer duplicated = bytes.duplicate(); 374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer duplicated.clear(); 375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int h = bytes.capacity(); 376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer while (duplicated.remaining() > 0) { 377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer final int length = duplicated.remaining() <= bufferSize ? 378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer duplicated.remaining() : bufferSize; 379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer duplicated.get(buffer, 0, length); 380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer h = partialHash(h, buffer, 0, length); 381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return h == 0 ? 1 : h; 383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SuppressWarnings("unchecked") 387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static <T extends MessageLite> T getDefaultInstance(Class<T> clazz) { 388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer try { 389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Method method = clazz.getMethod("getDefaultInstance"); 390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return (T) method.invoke(method); 391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } catch (Exception e) { 392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer throw new RuntimeException( 393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "Failed to get default instance for " + clazz, e); 394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * An empty byte array constant used in generated code. 399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; 401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * An empty byte array constant used in generated code. 404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static final ByteBuffer EMPTY_BYTE_BUFFER = 406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ByteBuffer.wrap(EMPTY_BYTE_ARRAY); 407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** An empty coded input stream constant used in generated code. */ 409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static final CodedInputStream EMPTY_CODED_INPUT_STREAM = 410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer CodedInputStream.newInstance(EMPTY_BYTE_ARRAY); 411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Provides an immutable view of {@code List<T>} around a {@code List<F>}. 415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * 416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Protobuf internal. Used in protobuf generated code only. 417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static class ListAdapter<F, T> extends AbstractList<T> { 419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Convert individual elements of the List from F to T. 421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public interface Converter<F, T> { 423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer T convert(F from); 424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private final List<F> fromList; 427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private final Converter<F, T> converter; 428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public ListAdapter(List<F> fromList, Converter<F, T> converter) { 430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer this.fromList = fromList; 431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer this.converter = converter; 432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public T get(int index) { 436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return converter.convert(fromList.get(index)); 437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public int size() { 441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return fromList.size(); 442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Wrap around a {@code Map<K, RealValue>} and provide a {@code Map<K, V>} 447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * interface. 448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static class MapAdapter<K, V, RealValue> extends AbstractMap<K, V> { 450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * An interface used to convert between two types. 452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public interface Converter<A, B> { 454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer B doForward(A object); 455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer A doBackward(B object); 456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static <T extends EnumLite> Converter<Integer, T> newEnumConverter( 459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer final EnumLiteMap<T> enumMap, final T unrecognizedValue) { 460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return new Converter<Integer, T>() { 461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public T doForward(Integer value) { 463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer T result = enumMap.findValueByNumber(value); 464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return result == null ? unrecognizedValue : result; 465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public Integer doBackward(T value) { 469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value.getNumber(); 470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer }; 472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private final Map<K, RealValue> realMap; 475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private final Converter<RealValue, V> valueConverter; 476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public MapAdapter(Map<K, RealValue> realMap, 478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Converter<RealValue, V> valueConverter) { 479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer this.realMap = realMap; 480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer this.valueConverter = valueConverter; 481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SuppressWarnings("unchecked") 484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public V get(Object key) { 486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RealValue result = realMap.get(key); 487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (result == null) { 488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return null; 489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return valueConverter.doForward(result); 491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public V put(K key, V value) { 495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RealValue oldValue = realMap.put(key, valueConverter.doBackward(value)); 496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (oldValue == null) { 497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return null; 498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return valueConverter.doForward(oldValue); 500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public Set<java.util.Map.Entry<K, V>> entrySet() { 504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return new SetAdapter(realMap.entrySet()); 505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private class SetAdapter extends AbstractSet<Map.Entry<K, V>> { 508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private final Set<Map.Entry<K, RealValue>> realSet; 509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public SetAdapter(Set<Map.Entry<K, RealValue>> realSet) { 510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer this.realSet = realSet; 511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public Iterator<java.util.Map.Entry<K, V>> iterator() { 515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return new IteratorAdapter(realSet.iterator()); 516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public int size() { 520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return realSet.size(); 521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private class IteratorAdapter implements Iterator<Map.Entry<K, V>> { 525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private final Iterator<Map.Entry<K, RealValue>> realIterator; 526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public IteratorAdapter( 528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Iterator<Map.Entry<K, RealValue>> realIterator) { 529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer this.realIterator = realIterator; 530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public boolean hasNext() { 534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return realIterator.hasNext(); 535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public java.util.Map.Entry<K, V> next() { 539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return new EntryAdapter(realIterator.next()); 540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void remove() { 544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer realIterator.remove(); 545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private class EntryAdapter implements Map.Entry<K, V> { 549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private final Map.Entry<K, RealValue> realEntry; 550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public EntryAdapter(Map.Entry<K, RealValue> realEntry) { 552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer this.realEntry = realEntry; 553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public K getKey() { 557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return realEntry.getKey(); 558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public V getValue() { 562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return valueConverter.doForward(realEntry.getValue()); 563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public V setValue(V value) { 567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer RealValue oldValue = realEntry.setValue( 568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer valueConverter.doBackward(value)); 569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (oldValue == null) { 570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return null; 571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return valueConverter.doForward(oldValue); 573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Extends {@link List} to add the capability to make the list immutable and inspect if it is 579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * modifiable. 580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * <p> 581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * All implementations must support efficient random access. 582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static interface ProtobufList<E> extends List<E>, RandomAccess { 584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Makes this list immutable. All subsequent modifications will throw an 587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * {@link UnsupportedOperationException}. 588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void makeImmutable(); 590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns whether this list can be modified via the publicly accessible {@link List} methods. 593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer boolean isModifiable(); 595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns a mutable clone of this list with the specified capacity. 598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ProtobufList<E> mutableCopyWithCapacity(int capacity); 600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * A {@link java.util.List} implementation that avoids boxing the elements into Integers if 604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * possible. Does not support null elements. 605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static interface IntList extends ProtobufList<Integer> { 607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #get(int)} but more efficient in that it doesn't box the returned value. 610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int getInt(int index); 612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #add(Integer)} but more efficient in that it doesn't box the element. 615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void addInt(int element); 617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #set(int, Integer)} but more efficient in that it doesn't box the element. 620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int setInt(int index, int element); 622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns a mutable clone of this list with the specified capacity. 625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer IntList mutableCopyWithCapacity(int capacity); 628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * A {@link java.util.List} implementation that avoids boxing the elements into Booleans if 632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * possible. Does not support null elements. 633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static interface BooleanList extends ProtobufList<Boolean> { 635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #get(int)} but more efficient in that it doesn't box the returned value. 638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer boolean getBoolean(int index); 640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #add(Boolean)} but more efficient in that it doesn't box the element. 643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void addBoolean(boolean element); 645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #set(int, Boolean)} but more efficient in that it doesn't box the element. 648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer boolean setBoolean(int index, boolean element); 650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns a mutable clone of this list with the specified capacity. 653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer BooleanList mutableCopyWithCapacity(int capacity); 656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * A {@link java.util.List} implementation that avoids boxing the elements into Longs if 660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * possible. Does not support null elements. 661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static interface LongList extends ProtobufList<Long> { 663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #get(int)} but more efficient in that it doesn't box the returned value. 666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer long getLong(int index); 668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #add(Long)} but more efficient in that it doesn't box the element. 671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void addLong(long element); 673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #set(int, Long)} but more efficient in that it doesn't box the element. 676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer long setLong(int index, long element); 678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns a mutable clone of this list with the specified capacity. 681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer LongList mutableCopyWithCapacity(int capacity); 684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * A {@link java.util.List} implementation that avoids boxing the elements into Doubles if 688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * possible. Does not support null elements. 689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static interface DoubleList extends ProtobufList<Double> { 691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #get(int)} but more efficient in that it doesn't box the returned value. 694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double getDouble(int index); 696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #add(Double)} but more efficient in that it doesn't box the element. 699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void addDouble(double element); 701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #set(int, Double)} but more efficient in that it doesn't box the element. 704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer double setDouble(int index, double element); 706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns a mutable clone of this list with the specified capacity. 709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer DoubleList mutableCopyWithCapacity(int capacity); 712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * A {@link java.util.List} implementation that avoids boxing the elements into Floats if 716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * possible. Does not support null elements. 717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public static interface FloatList extends ProtobufList<Float> { 719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #get(int)} but more efficient in that it doesn't box the returned value. 722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer float getFloat(int index); 724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #add(Float)} but more efficient in that it doesn't box the element. 727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer void addFloat(float element); 729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Like {@link #set(int, Float)} but more efficient in that it doesn't box the element. 732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer float setFloat(int index, float element); 734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer /** 736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer * Returns a mutable clone of this list with the specified capacity. 737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer */ 738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @Override 739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FloatList mutableCopyWithCapacity(int capacity); 740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 742