Rabbit-R1/android (non root)/java/sources/androidx/emoji2/text/flatbuffer/FlexBuffersBuilder.java
2024-05-21 17:08:36 -04:00

529 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: classes2.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) {
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);
return (int) writeString.iValue;
}
this.stack.add(Value.blob(putKey, num.intValue(), 5, widthUInBits(str2.length())));
return num.intValue();
}
Value writeString2 = writeString(putKey, str2);
this.stack.add(writeString2);
return (int) writeString2.iValue;
}
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);
}
/* JADX INFO: Access modifiers changed from: private */
/* loaded from: classes2.dex */
public 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;
}
}
}