All Downloads are FREE. Search and download functionalities are using the official Maven repository.

shz.UnsafeHelp Maven / Gradle / Ivy

package shz;

import sun.misc.Unsafe;

import java.lang.reflect.Field;

@SuppressWarnings("restriction")
public final class UnsafeHelp {
    private UnsafeHelp() {
        throw new IllegalStateException();
    }

    private static final Unsafe unsafe;
    private static final int bbase, bscale;
    private static final int cbase, cscale;
    private static final int dbase, dscale;
    private static final int fbase, fscale;
    private static final int ibase, iscale;
    private static final int jbase, jscale;
    private static final int sbase, sscale;
    private static final int zbase, zscale;
    private static final int lbase, lscale;

    static {
        Field unsafeField = Unsafe.class.getDeclaredFields()[0];
        unsafeField.setAccessible(true);
        try {
            unsafe = (Unsafe) unsafeField.get(null);
        } catch (IllegalArgumentException | IllegalAccessException e) {
            throw new Error(e);
        }
        bbase = unsafe.arrayBaseOffset(byte[].class);
        bscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));

        cbase = unsafe.arrayBaseOffset(char[].class);
        cscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));

        dbase = unsafe.arrayBaseOffset(double[].class);
        dscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));

        fbase = unsafe.arrayBaseOffset(float[].class);
        fscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));

        ibase = unsafe.arrayBaseOffset(int[].class);
        iscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));

        jbase = unsafe.arrayBaseOffset(long[].class);
        jscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));

        sbase = unsafe.arrayBaseOffset(short[].class);
        sscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));

        zbase = unsafe.arrayBaseOffset(boolean[].class);
        zscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));

        lbase = unsafe.arrayBaseOffset(Object[].class);
        lscale = checkIs2Power(unsafe.arrayIndexScale(int[].class));
    }

    private static int checkIs2Power(int scale) {
        if ((scale & (scale - 1)) != 0) throw new Error("data type scale not a power of two");
        return scale;
    }

    public static Unsafe getUnsafe() {
        return unsafe;
    }

    public static long byteOffset(int i, int base, int scale) {
        return ((long) i << (31 - Integer.numberOfLeadingZeros(scale))) + base;
    }

    public static long byteOffset(int i, Class cls) {
        if (cls == Object[].class) return byteOffset(i, lbase, lscale);
        if (cls == byte[].class) return byteOffset(i, bbase, bscale);
        if (cls == char[].class) return byteOffset(i, cbase, cscale);
        if (cls == int[].class) return byteOffset(i, ibase, iscale);
        if (cls == long[].class) return byteOffset(i, jbase, jscale);
        if (cls == boolean[].class) return byteOffset(i, zbase, zscale);
        if (cls == short[].class) return byteOffset(i, sbase, sscale);
        if (cls == double[].class) return byteOffset(i, dbase, dscale);
        if (cls == float[].class) return byteOffset(i, fbase, fscale);
        return byteOffset(i, unsafe.arrayBaseOffset(cls), checkIs2Power(unsafe.arrayIndexScale(cls)));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy