532 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			532 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.emoji2.text.flatbuffer;
 | |
| 
 | |
| import androidx.emoji2.text.flatbuffer.FlexBuffers;
 | |
| import java.math.BigInteger;
 | |
| import java.nio.ByteBuffer;
 | |
| import java.nio.charset.StandardCharsets;
 | |
| import java.util.ArrayList;
 | |
| import java.util.Collections;
 | |
| import java.util.Comparator;
 | |
| import java.util.HashMap;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| public class FlexBuffersBuilder {
 | |
|     static final /* synthetic */ boolean $assertionsDisabled = false;
 | |
|     public static final int BUILDER_FLAG_NONE = 0;
 | |
|     public static final int BUILDER_FLAG_SHARE_ALL = 7;
 | |
|     public static final int BUILDER_FLAG_SHARE_KEYS = 1;
 | |
|     public static final int BUILDER_FLAG_SHARE_KEYS_AND_STRINGS = 3;
 | |
|     public static final int BUILDER_FLAG_SHARE_KEY_VECTORS = 4;
 | |
|     public static final int BUILDER_FLAG_SHARE_STRINGS = 2;
 | |
|     private static final int WIDTH_16 = 1;
 | |
|     private static final int WIDTH_32 = 2;
 | |
|     private static final int WIDTH_64 = 3;
 | |
|     private static final int WIDTH_8 = 0;
 | |
|     private final ReadWriteBuf bb;
 | |
|     private boolean finished;
 | |
|     private final int flags;
 | |
|     private Comparator<Value> keyComparator;
 | |
|     private final HashMap<String, Integer> keyPool;
 | |
|     private final ArrayList<Value> stack;
 | |
|     private final HashMap<String, Integer> stringPool;
 | |
| 
 | |
|     public ReadWriteBuf getBuffer() {
 | |
|         return this.bb;
 | |
|     }
 | |
| 
 | |
|     public FlexBuffersBuilder(int i) {
 | |
|         this(new ArrayReadWriteBuf(i), 1);
 | |
|     }
 | |
| 
 | |
|     public FlexBuffersBuilder() {
 | |
|         this(256);
 | |
|     }
 | |
| 
 | |
|     @Deprecated
 | |
|     public FlexBuffersBuilder(ByteBuffer byteBuffer, int i) {
 | |
|         this(new ArrayReadWriteBuf(byteBuffer.array()), i);
 | |
|     }
 | |
| 
 | |
|     public FlexBuffersBuilder(ReadWriteBuf readWriteBuf, int i) {
 | |
|         this.stack = new ArrayList<>();
 | |
|         this.keyPool = new HashMap<>();
 | |
|         this.stringPool = new HashMap<>();
 | |
|         this.finished = false;
 | |
|         this.keyComparator = new Comparator<Value>() { // from class: androidx.emoji2.text.flatbuffer.FlexBuffersBuilder.1
 | |
|             @Override // java.util.Comparator
 | |
|             public int compare(Value value, Value value2) {
 | |
|                 byte b;
 | |
|                 byte b2;
 | |
|                 int i2 = value.key;
 | |
|                 int i3 = value2.key;
 | |
|                 do {
 | |
|                     b = FlexBuffersBuilder.this.bb.get(i2);
 | |
|                     b2 = FlexBuffersBuilder.this.bb.get(i3);
 | |
|                     if (b == 0) {
 | |
|                         return b - b2;
 | |
|                     }
 | |
|                     i2++;
 | |
|                     i3++;
 | |
|                 } while (b == b2);
 | |
|                 return b - b2;
 | |
|             }
 | |
|         };
 | |
|         this.bb = readWriteBuf;
 | |
|         this.flags = i;
 | |
|     }
 | |
| 
 | |
|     public FlexBuffersBuilder(ByteBuffer byteBuffer) {
 | |
|         this(byteBuffer, 1);
 | |
|     }
 | |
| 
 | |
|     public void putBoolean(boolean z) {
 | |
|         putBoolean(null, z);
 | |
|     }
 | |
| 
 | |
|     public void putBoolean(String str, boolean z) {
 | |
|         this.stack.add(Value.bool(putKey(str), z));
 | |
|     }
 | |
| 
 | |
|     private int putKey(String str) {
 | |
|         if (str == null) {
 | |
|             return -1;
 | |
|         }
 | |
|         int writePosition = this.bb.writePosition();
 | |
|         if ((this.flags & 1) != 0) {
 | |
|             Integer num = this.keyPool.get(str);
 | |
|             if (num == null) {
 | |
|                 byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
 | |
|                 this.bb.put(bytes, 0, bytes.length);
 | |
|                 this.bb.put((byte) 0);
 | |
|                 this.keyPool.put(str, Integer.valueOf(writePosition));
 | |
|                 return writePosition;
 | |
|             }
 | |
|             return num.intValue();
 | |
|         }
 | |
|         byte[] bytes2 = str.getBytes(StandardCharsets.UTF_8);
 | |
|         this.bb.put(bytes2, 0, bytes2.length);
 | |
|         this.bb.put((byte) 0);
 | |
|         this.keyPool.put(str, Integer.valueOf(writePosition));
 | |
|         return writePosition;
 | |
|     }
 | |
| 
 | |
|     public void putInt(int i) {
 | |
|         putInt((String) null, i);
 | |
|     }
 | |
| 
 | |
|     public void putInt(String str, int i) {
 | |
|         putInt(str, i);
 | |
|     }
 | |
| 
 | |
|     public void putInt(String str, long j) {
 | |
|         int putKey = putKey(str);
 | |
|         if (-128 <= j && j <= 127) {
 | |
|             this.stack.add(Value.int8(putKey, (int) j));
 | |
|             return;
 | |
|         }
 | |
|         if (-32768 <= j && j <= 32767) {
 | |
|             this.stack.add(Value.int16(putKey, (int) j));
 | |
|         } else if (-2147483648L <= j && j <= 2147483647L) {
 | |
|             this.stack.add(Value.int32(putKey, (int) j));
 | |
|         } else {
 | |
|             this.stack.add(Value.int64(putKey, j));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void putInt(long j) {
 | |
|         putInt((String) null, j);
 | |
|     }
 | |
| 
 | |
|     public void putUInt(int i) {
 | |
|         putUInt(null, i);
 | |
|     }
 | |
| 
 | |
|     public void putUInt(long j) {
 | |
|         putUInt(null, j);
 | |
|     }
 | |
| 
 | |
|     public void putUInt64(BigInteger bigInteger) {
 | |
|         putUInt64(null, bigInteger.longValue());
 | |
|     }
 | |
| 
 | |
|     private void putUInt64(String str, long j) {
 | |
|         this.stack.add(Value.uInt64(putKey(str), j));
 | |
|     }
 | |
| 
 | |
|     private void putUInt(String str, long j) {
 | |
|         Value uInt64;
 | |
|         int putKey = putKey(str);
 | |
|         int widthUInBits = widthUInBits(j);
 | |
|         if (widthUInBits == 0) {
 | |
|             uInt64 = Value.uInt8(putKey, (int) j);
 | |
|         } else if (widthUInBits == 1) {
 | |
|             uInt64 = Value.uInt16(putKey, (int) j);
 | |
|         } else if (widthUInBits == 2) {
 | |
|             uInt64 = Value.uInt32(putKey, (int) j);
 | |
|         } else {
 | |
|             uInt64 = Value.uInt64(putKey, j);
 | |
|         }
 | |
|         this.stack.add(uInt64);
 | |
|     }
 | |
| 
 | |
|     public void putFloat(float f) {
 | |
|         putFloat((String) null, f);
 | |
|     }
 | |
| 
 | |
|     public void putFloat(String str, float f) {
 | |
|         this.stack.add(Value.float32(putKey(str), f));
 | |
|     }
 | |
| 
 | |
|     public void putFloat(double d) {
 | |
|         putFloat((String) null, d);
 | |
|     }
 | |
| 
 | |
|     public void putFloat(String str, double d) {
 | |
|         this.stack.add(Value.float64(putKey(str), d));
 | |
|     }
 | |
| 
 | |
|     public int putString(String str) {
 | |
|         return putString(null, str);
 | |
|     }
 | |
| 
 | |
|     public int putString(String str, String str2) {
 | |
|         long j;
 | |
|         int putKey = putKey(str);
 | |
|         if ((this.flags & 2) != 0) {
 | |
|             Integer num = this.stringPool.get(str2);
 | |
|             if (num == null) {
 | |
|                 Value writeString = writeString(putKey, str2);
 | |
|                 this.stringPool.put(str2, Integer.valueOf((int) writeString.iValue));
 | |
|                 this.stack.add(writeString);
 | |
|                 j = writeString.iValue;
 | |
|             } else {
 | |
|                 this.stack.add(Value.blob(putKey, num.intValue(), 5, widthUInBits(str2.length())));
 | |
|                 return num.intValue();
 | |
|             }
 | |
|         } else {
 | |
|             Value writeString2 = writeString(putKey, str2);
 | |
|             this.stack.add(writeString2);
 | |
|             j = writeString2.iValue;
 | |
|         }
 | |
|         return (int) j;
 | |
|     }
 | |
| 
 | |
|     private Value writeString(int i, String str) {
 | |
|         return writeBlob(i, str.getBytes(StandardCharsets.UTF_8), 5, true);
 | |
|     }
 | |
| 
 | |
|     static int widthUInBits(long j) {
 | |
|         if (j <= FlexBuffers.Unsigned.byteToUnsignedInt((byte) -1)) {
 | |
|             return 0;
 | |
|         }
 | |
|         if (j <= FlexBuffers.Unsigned.shortToUnsignedInt((short) -1)) {
 | |
|             return 1;
 | |
|         }
 | |
|         return j <= FlexBuffers.Unsigned.intToUnsignedLong(-1) ? 2 : 3;
 | |
|     }
 | |
| 
 | |
|     private Value writeBlob(int i, byte[] bArr, int i2, boolean z) {
 | |
|         int widthUInBits = widthUInBits(bArr.length);
 | |
|         writeInt(bArr.length, align(widthUInBits));
 | |
|         int writePosition = this.bb.writePosition();
 | |
|         this.bb.put(bArr, 0, bArr.length);
 | |
|         if (z) {
 | |
|             this.bb.put((byte) 0);
 | |
|         }
 | |
|         return Value.blob(i, writePosition, i2, widthUInBits);
 | |
|     }
 | |
| 
 | |
|     private int align(int i) {
 | |
|         int i2 = 1 << i;
 | |
|         int paddingBytes = Value.paddingBytes(this.bb.writePosition(), i2);
 | |
|         while (true) {
 | |
|             int i3 = paddingBytes - 1;
 | |
|             if (paddingBytes == 0) {
 | |
|                 return i2;
 | |
|             }
 | |
|             this.bb.put((byte) 0);
 | |
|             paddingBytes = i3;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void writeInt(long j, int i) {
 | |
|         if (i == 1) {
 | |
|             this.bb.put((byte) j);
 | |
|             return;
 | |
|         }
 | |
|         if (i == 2) {
 | |
|             this.bb.putShort((short) j);
 | |
|         } else if (i == 4) {
 | |
|             this.bb.putInt((int) j);
 | |
|         } else {
 | |
|             if (i != 8) {
 | |
|                 return;
 | |
|             }
 | |
|             this.bb.putLong(j);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public int putBlob(byte[] bArr) {
 | |
|         return putBlob(null, bArr);
 | |
|     }
 | |
| 
 | |
|     public int putBlob(String str, byte[] bArr) {
 | |
|         Value writeBlob = writeBlob(putKey(str), bArr, 25, false);
 | |
|         this.stack.add(writeBlob);
 | |
|         return (int) writeBlob.iValue;
 | |
|     }
 | |
| 
 | |
|     public int startVector() {
 | |
|         return this.stack.size();
 | |
|     }
 | |
| 
 | |
|     public int endVector(String str, int i, boolean z, boolean z2) {
 | |
|         Value createVector = createVector(putKey(str), i, this.stack.size() - i, z, z2, null);
 | |
|         while (this.stack.size() > i) {
 | |
|             this.stack.remove(r10.size() - 1);
 | |
|         }
 | |
|         this.stack.add(createVector);
 | |
|         return (int) createVector.iValue;
 | |
|     }
 | |
| 
 | |
|     public ByteBuffer finish() {
 | |
|         int align = align(this.stack.get(0).elemWidth(this.bb.writePosition(), 0));
 | |
|         writeAny(this.stack.get(0), align);
 | |
|         this.bb.put(this.stack.get(0).storedPackedType());
 | |
|         this.bb.put((byte) align);
 | |
|         this.finished = true;
 | |
|         return ByteBuffer.wrap(this.bb.data(), 0, this.bb.writePosition());
 | |
|     }
 | |
| 
 | |
|     private Value createVector(int i, int i2, int i3, boolean z, boolean z2, Value value) {
 | |
|         int i4;
 | |
|         int i5;
 | |
|         int i6 = i3;
 | |
|         long j = i6;
 | |
|         int max = Math.max(0, widthUInBits(j));
 | |
|         if (value != null) {
 | |
|             max = Math.max(max, value.elemWidth(this.bb.writePosition(), 0));
 | |
|             i4 = 3;
 | |
|         } else {
 | |
|             i4 = 1;
 | |
|         }
 | |
|         int i7 = 4;
 | |
|         int i8 = max;
 | |
|         for (int i9 = i2; i9 < this.stack.size(); i9++) {
 | |
|             i8 = Math.max(i8, this.stack.get(i9).elemWidth(this.bb.writePosition(), i9 + i4));
 | |
|             if (z && i9 == i2) {
 | |
|                 i7 = this.stack.get(i9).type;
 | |
|                 if (!FlexBuffers.isTypedVectorElementType(i7)) {
 | |
|                     throw new FlexBuffers.FlexBufferException("TypedVector does not support this element type");
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         int i10 = i2;
 | |
|         int align = align(i8);
 | |
|         if (value != null) {
 | |
|             writeOffset(value.iValue, align);
 | |
|             writeInt(1 << value.minBitWidth, align);
 | |
|         }
 | |
|         if (!z2) {
 | |
|             writeInt(j, align);
 | |
|         }
 | |
|         int writePosition = this.bb.writePosition();
 | |
|         for (int i11 = i10; i11 < this.stack.size(); i11++) {
 | |
|             writeAny(this.stack.get(i11), align);
 | |
|         }
 | |
|         if (!z) {
 | |
|             while (i10 < this.stack.size()) {
 | |
|                 this.bb.put(this.stack.get(i10).storedPackedType(i8));
 | |
|                 i10++;
 | |
|             }
 | |
|         }
 | |
|         if (value != null) {
 | |
|             i5 = 9;
 | |
|         } else if (z) {
 | |
|             if (!z2) {
 | |
|                 i6 = 0;
 | |
|             }
 | |
|             i5 = FlexBuffers.toTypedVector(i7, i6);
 | |
|         } else {
 | |
|             i5 = 10;
 | |
|         }
 | |
|         return new Value(i, i5, i8, writePosition);
 | |
|     }
 | |
| 
 | |
|     private void writeOffset(long j, int i) {
 | |
|         writeInt((int) (this.bb.writePosition() - j), i);
 | |
|     }
 | |
| 
 | |
|     private void writeAny(Value value, int i) {
 | |
|         int i2 = value.type;
 | |
|         if (i2 != 0 && i2 != 1 && i2 != 2) {
 | |
|             if (i2 == 3) {
 | |
|                 writeDouble(value.dValue, i);
 | |
|                 return;
 | |
|             } else if (i2 != 26) {
 | |
|                 writeOffset(value.iValue, i);
 | |
|                 return;
 | |
|             }
 | |
|         }
 | |
|         writeInt(value.iValue, i);
 | |
|     }
 | |
| 
 | |
|     private void writeDouble(double d, int i) {
 | |
|         if (i == 4) {
 | |
|             this.bb.putFloat((float) d);
 | |
|         } else if (i == 8) {
 | |
|             this.bb.putDouble(d);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public int startMap() {
 | |
|         return this.stack.size();
 | |
|     }
 | |
| 
 | |
|     public int endMap(String str, int i) {
 | |
|         int putKey = putKey(str);
 | |
|         ArrayList<Value> arrayList = this.stack;
 | |
|         Collections.sort(arrayList.subList(i, arrayList.size()), this.keyComparator);
 | |
|         Value createVector = createVector(putKey, i, this.stack.size() - i, false, false, createKeyVector(i, this.stack.size() - i));
 | |
|         while (this.stack.size() > i) {
 | |
|             this.stack.remove(r0.size() - 1);
 | |
|         }
 | |
|         this.stack.add(createVector);
 | |
|         return (int) createVector.iValue;
 | |
|     }
 | |
| 
 | |
|     private Value createKeyVector(int i, int i2) {
 | |
|         long j = i2;
 | |
|         int max = Math.max(0, widthUInBits(j));
 | |
|         int i3 = i;
 | |
|         while (i3 < this.stack.size()) {
 | |
|             i3++;
 | |
|             max = Math.max(max, Value.elemWidth(4, 0, this.stack.get(i3).key, this.bb.writePosition(), i3));
 | |
|         }
 | |
|         int align = align(max);
 | |
|         writeInt(j, align);
 | |
|         int writePosition = this.bb.writePosition();
 | |
|         while (i < this.stack.size()) {
 | |
|             int i4 = this.stack.get(i).key;
 | |
|             writeOffset(this.stack.get(i).key, align);
 | |
|             i++;
 | |
|         }
 | |
|         return new Value(-1, FlexBuffers.toTypedVector(4, 0), max, writePosition);
 | |
|     }
 | |
| 
 | |
|     private static class Value {
 | |
|         static final /* synthetic */ boolean $assertionsDisabled = false;
 | |
|         final double dValue;
 | |
|         long iValue;
 | |
|         int key;
 | |
|         final int minBitWidth;
 | |
|         final int type;
 | |
| 
 | |
|         private static byte packedType(int i, int i2) {
 | |
|             return (byte) (i | (i2 << 2));
 | |
|         }
 | |
| 
 | |
|         /* JADX INFO: Access modifiers changed from: private */
 | |
|         public static int paddingBytes(int i, int i2) {
 | |
|             return ((~i) + 1) & (i2 - 1);
 | |
|         }
 | |
| 
 | |
|         Value(int i, int i2, int i3, long j) {
 | |
|             this.key = i;
 | |
|             this.type = i2;
 | |
|             this.minBitWidth = i3;
 | |
|             this.iValue = j;
 | |
|             this.dValue = Double.MIN_VALUE;
 | |
|         }
 | |
| 
 | |
|         Value(int i, int i2, int i3, double d) {
 | |
|             this.key = i;
 | |
|             this.type = i2;
 | |
|             this.minBitWidth = i3;
 | |
|             this.dValue = d;
 | |
|             this.iValue = Long.MIN_VALUE;
 | |
|         }
 | |
| 
 | |
|         static Value bool(int i, boolean z) {
 | |
|             return new Value(i, 26, 0, z ? 1L : 0L);
 | |
|         }
 | |
| 
 | |
|         static Value blob(int i, int i2, int i3, int i4) {
 | |
|             return new Value(i, i3, i4, i2);
 | |
|         }
 | |
| 
 | |
|         static Value int8(int i, int i2) {
 | |
|             return new Value(i, 1, 0, i2);
 | |
|         }
 | |
| 
 | |
|         static Value int16(int i, int i2) {
 | |
|             return new Value(i, 1, 1, i2);
 | |
|         }
 | |
| 
 | |
|         static Value int32(int i, int i2) {
 | |
|             return new Value(i, 1, 2, i2);
 | |
|         }
 | |
| 
 | |
|         static Value int64(int i, long j) {
 | |
|             return new Value(i, 1, 3, j);
 | |
|         }
 | |
| 
 | |
|         static Value uInt8(int i, int i2) {
 | |
|             return new Value(i, 2, 0, i2);
 | |
|         }
 | |
| 
 | |
|         static Value uInt16(int i, int i2) {
 | |
|             return new Value(i, 2, 1, i2);
 | |
|         }
 | |
| 
 | |
|         static Value uInt32(int i, int i2) {
 | |
|             return new Value(i, 2, 2, i2);
 | |
|         }
 | |
| 
 | |
|         static Value uInt64(int i, long j) {
 | |
|             return new Value(i, 2, 3, j);
 | |
|         }
 | |
| 
 | |
|         static Value float32(int i, float f) {
 | |
|             return new Value(i, 3, 2, f);
 | |
|         }
 | |
| 
 | |
|         static Value float64(int i, double d) {
 | |
|             return new Value(i, 3, 3, d);
 | |
|         }
 | |
| 
 | |
|         /* JADX INFO: Access modifiers changed from: private */
 | |
|         public byte storedPackedType() {
 | |
|             return storedPackedType(0);
 | |
|         }
 | |
| 
 | |
|         /* JADX INFO: Access modifiers changed from: private */
 | |
|         public byte storedPackedType(int i) {
 | |
|             return packedType(storedWidth(i), this.type);
 | |
|         }
 | |
| 
 | |
|         private int storedWidth(int i) {
 | |
|             return FlexBuffers.isTypeInline(this.type) ? Math.max(this.minBitWidth, i) : this.minBitWidth;
 | |
|         }
 | |
| 
 | |
|         /* JADX INFO: Access modifiers changed from: private */
 | |
|         public int elemWidth(int i, int i2) {
 | |
|             return elemWidth(this.type, this.minBitWidth, this.iValue, i, i2);
 | |
|         }
 | |
| 
 | |
|         /* JADX INFO: Access modifiers changed from: private */
 | |
|         public static int elemWidth(int i, int i2, long j, int i3, int i4) {
 | |
|             if (FlexBuffers.isTypeInline(i)) {
 | |
|                 return i2;
 | |
|             }
 | |
|             for (int i5 = 1; i5 <= 32; i5 *= 2) {
 | |
|                 int widthUInBits = FlexBuffersBuilder.widthUInBits((int) (((paddingBytes(i3, i5) + i3) + (i4 * i5)) - j));
 | |
|                 if ((1 << widthUInBits) == i5) {
 | |
|                     return widthUInBits;
 | |
|                 }
 | |
|             }
 | |
|             return 3;
 | |
|         }
 | |
|     }
 | |
| }
 |