149 lines
6.1 KiB
Java
149 lines
6.1 KiB
Java
|
package com.google.common.hash;
|
||
|
|
||
|
import com.google.common.primitives.Longs;
|
||
|
import com.google.common.primitives.UnsignedBytes;
|
||
|
import java.lang.reflect.Field;
|
||
|
import java.nio.ByteOrder;
|
||
|
import java.security.AccessController;
|
||
|
import java.security.PrivilegedActionException;
|
||
|
import java.security.PrivilegedExceptionAction;
|
||
|
import sun.misc.Unsafe;
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
final class LittleEndianByteArray {
|
||
|
static final boolean $assertionsDisabled = false;
|
||
|
private static final LittleEndianBytes byteArray;
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
enum JavaLittleEndianBytes implements LittleEndianBytes {
|
||
|
INSTANCE { // from class: com.google.common.hash.LittleEndianByteArray.JavaLittleEndianBytes.1
|
||
|
@Override // com.google.common.hash.LittleEndianByteArray.LittleEndianBytes
|
||
|
public final long getLongLittleEndian(byte[] bArr, int i) {
|
||
|
return Longs.fromBytes(bArr[i + 7], bArr[i + 6], bArr[i + 5], bArr[i + 4], bArr[i + 3], bArr[i + 2], bArr[i + 1], bArr[i]);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.LittleEndianByteArray.LittleEndianBytes
|
||
|
public final void putLongLittleEndian(byte[] bArr, int i, long j) {
|
||
|
long j2 = 255;
|
||
|
for (int i2 = 0; i2 < 8; i2++) {
|
||
|
bArr[i + i2] = (byte) ((j & j2) >> (i2 << 3));
|
||
|
j2 <<= 8;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
interface LittleEndianBytes {
|
||
|
long getLongLittleEndian(byte[] bArr, int i);
|
||
|
|
||
|
void putLongLittleEndian(byte[] bArr, int i, long j);
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: package-private */
|
||
|
public static long load64(byte[] bArr, int i) {
|
||
|
return byteArray.getLongLittleEndian(bArr, i);
|
||
|
}
|
||
|
|
||
|
static long load64Safely(byte[] bArr, int i, int i2) {
|
||
|
long j = 0;
|
||
|
for (int i3 = 0; i3 < Math.min(i2, 8); i3++) {
|
||
|
j |= (bArr[i + i3] & 255) << (i3 << 3);
|
||
|
}
|
||
|
return j;
|
||
|
}
|
||
|
|
||
|
static void store64(byte[] bArr, int i, long j) {
|
||
|
byteArray.putLongLittleEndian(bArr, i, j);
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: package-private */
|
||
|
public static int load32(byte[] bArr, int i) {
|
||
|
return ((bArr[i + 3] & UnsignedBytes.MAX_VALUE) << 24) | (bArr[i] & UnsignedBytes.MAX_VALUE) | ((bArr[i + 1] & UnsignedBytes.MAX_VALUE) << 8) | ((bArr[i + 2] & UnsignedBytes.MAX_VALUE) << 16);
|
||
|
}
|
||
|
|
||
|
static boolean usingUnsafe() {
|
||
|
return byteArray instanceof UnsafeByteArray;
|
||
|
}
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
enum UnsafeByteArray implements LittleEndianBytes {
|
||
|
UNSAFE_LITTLE_ENDIAN { // from class: com.google.common.hash.LittleEndianByteArray.UnsafeByteArray.1
|
||
|
@Override // com.google.common.hash.LittleEndianByteArray.LittleEndianBytes
|
||
|
public final long getLongLittleEndian(byte[] bArr, int i) {
|
||
|
return UnsafeByteArray.theUnsafe.getLong(bArr, i + UnsafeByteArray.BYTE_ARRAY_BASE_OFFSET);
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.LittleEndianByteArray.LittleEndianBytes
|
||
|
public final void putLongLittleEndian(byte[] bArr, int i, long j) {
|
||
|
UnsafeByteArray.theUnsafe.putLong(bArr, i + UnsafeByteArray.BYTE_ARRAY_BASE_OFFSET, j);
|
||
|
}
|
||
|
},
|
||
|
UNSAFE_BIG_ENDIAN { // from class: com.google.common.hash.LittleEndianByteArray.UnsafeByteArray.2
|
||
|
@Override // com.google.common.hash.LittleEndianByteArray.LittleEndianBytes
|
||
|
public final long getLongLittleEndian(byte[] bArr, int i) {
|
||
|
return Long.reverseBytes(UnsafeByteArray.theUnsafe.getLong(bArr, i + UnsafeByteArray.BYTE_ARRAY_BASE_OFFSET));
|
||
|
}
|
||
|
|
||
|
@Override // com.google.common.hash.LittleEndianByteArray.LittleEndianBytes
|
||
|
public final void putLongLittleEndian(byte[] bArr, int i, long j) {
|
||
|
UnsafeByteArray.theUnsafe.putLong(bArr, i + UnsafeByteArray.BYTE_ARRAY_BASE_OFFSET, Long.reverseBytes(j));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
private static final int BYTE_ARRAY_BASE_OFFSET;
|
||
|
private static final Unsafe theUnsafe;
|
||
|
|
||
|
static {
|
||
|
Unsafe unsafe = getUnsafe();
|
||
|
theUnsafe = unsafe;
|
||
|
BYTE_ARRAY_BASE_OFFSET = unsafe.arrayBaseOffset(byte[].class);
|
||
|
if (unsafe.arrayIndexScale(byte[].class) != 1) {
|
||
|
throw new AssertionError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static Unsafe getUnsafe() {
|
||
|
try {
|
||
|
try {
|
||
|
return Unsafe.getUnsafe();
|
||
|
} catch (PrivilegedActionException e) {
|
||
|
throw new RuntimeException("Could not initialize intrinsics", e.getCause());
|
||
|
}
|
||
|
} catch (SecurityException unused) {
|
||
|
return (Unsafe) AccessController.doPrivileged(new PrivilegedExceptionAction<Unsafe>() { // from class: com.google.common.hash.LittleEndianByteArray.UnsafeByteArray.3
|
||
|
@Override // java.security.PrivilegedExceptionAction
|
||
|
public Unsafe run() throws Exception {
|
||
|
for (Field field : Unsafe.class.getDeclaredFields()) {
|
||
|
field.setAccessible(true);
|
||
|
Object obj = field.get(null);
|
||
|
if (Unsafe.class.isInstance(obj)) {
|
||
|
return (Unsafe) Unsafe.class.cast(obj);
|
||
|
}
|
||
|
}
|
||
|
throw new NoSuchFieldError("the Unsafe");
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static {
|
||
|
LittleEndianBytes littleEndianBytes = JavaLittleEndianBytes.INSTANCE;
|
||
|
try {
|
||
|
if ("amd64".equals(System.getProperty("os.arch"))) {
|
||
|
if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
|
||
|
littleEndianBytes = UnsafeByteArray.UNSAFE_LITTLE_ENDIAN;
|
||
|
} else {
|
||
|
littleEndianBytes = UnsafeByteArray.UNSAFE_BIG_ENDIAN;
|
||
|
}
|
||
|
}
|
||
|
} catch (Throwable unused) {
|
||
|
}
|
||
|
byteArray = littleEndianBytes;
|
||
|
}
|
||
|
|
||
|
private LittleEndianByteArray() {
|
||
|
}
|
||
|
}
|