ArrayBack.java

package space.sunqian.common.collect;

import space.sunqian.annotations.Nonnull;

final class ArrayBack {

    static @Nonnull ArrayOperator operator(@Nonnull Class<?> arrayType) throws IllegalArgumentException {
        if (!arrayType.isArray()) {
            throw new IllegalArgumentException("Not an array type: " + arrayType.getTypeName() + ".");
        }
        if (boolean[].class.equals(arrayType)) {
            return BooleanArrayOperator.INST;
        }
        if (byte[].class.equals(arrayType)) {
            return ByteArrayOperator.INST;
        }
        if (short[].class.equals(arrayType)) {
            return ShortArrayOperator.INST;
        }
        if (char[].class.equals(arrayType)) {
            return CharArrayOperator.INST;
        }
        if (int[].class.equals(arrayType)) {
            return IntArrayOperator.INST;
        }
        if (long[].class.equals(arrayType)) {
            return LongArrayOperator.INST;
        }
        if (float[].class.equals(arrayType)) {
            return FloatArrayOperator.INST;
        }
        if (double[].class.equals(arrayType)) {
            return DoubleArrayOperator.INST;
        }
        return ObjectArrayOperator.INST;
    }

    enum BooleanArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((boolean[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((boolean[]) array)[index] = (boolean) value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((boolean[]) array).length;
        }
    }

    enum ByteArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((byte[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((byte[]) array)[index] = (byte) value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((byte[]) array).length;
        }
    }

    enum ShortArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((short[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((short[]) array)[index] = (short) value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((short[]) array).length;
        }
    }

    enum CharArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((char[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((char[]) array)[index] = (char) value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((char[]) array).length;
        }
    }

    enum IntArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((int[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((int[]) array)[index] = (int) value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((int[]) array).length;
        }
    }

    enum LongArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((long[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((long[]) array)[index] = (long) value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((long[]) array).length;
        }
    }

    enum FloatArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((float[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((float[]) array)[index] = (float) value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((float[]) array).length;
        }
    }

    enum DoubleArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((double[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((double[]) array)[index] = (double) value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((double[]) array).length;
        }
    }

    enum ObjectArrayOperator implements ArrayOperator {

        INST;

        @Override
        public Object get(@Nonnull Object array, int index) {
            return ((Object[]) array)[index];
        }

        @Override
        public void set(@Nonnull Object array, int index, Object value) {
            ((Object[]) array)[index] = value;
        }

        @Override
        public int size(@Nonnull Object array) {
            return ((Object[]) array).length;
        }
    }

    private ArrayBack() {
    }
}