VarBack.java

package space.sunqian.common.base.value;

import space.sunqian.annotations.Nonnull;
import space.sunqian.common.Fs;

final class VarBack {

    static <T> @Nonnull Var<T> of(T value) {
        return new VarImpl<>(value);
    }

    static @Nonnull BooleanVar of(boolean value) {
        return new BooleanVarImpl(value);
    }

    static @Nonnull ByteVar of(byte value) {
        return new ByteVarImpl(value);
    }

    static @Nonnull ShortVar of(short value) {
        return new ShortVarImpl(value);
    }

    static @Nonnull CharVar of(char value) {
        return new CharVarImpl(value);
    }

    static @Nonnull IntVar of(int value) {
        return new IntVarImpl(value);
    }

    static @Nonnull LongVar of(long value) {
        return new LongVarImpl(value);
    }

    static @Nonnull FloatVar of(float value) {
        return new FloatVarImpl(value);
    }

    static @Nonnull DoubleVar of(double value) {
        return new DoubleVarImpl(value);
    }

    private static final class VarImpl<T> implements Var<T> {

        private Object value;

        private VarImpl(T value) {
            this.value = value;
        }

        @Override
        public T get() {
            return Fs.as(value);
        }

        @Override
        public @Nonnull Var<T> set(T value) {
            this.value = value;
            return this;
        }
    }

    private static final class BooleanVarImpl implements BooleanVar {

        private boolean value;

        private BooleanVarImpl(boolean value) {
            this.value = value;
        }

        @Override
        public boolean get() {
            return value;
        }

        @Override
        public @Nonnull BooleanVar set(boolean value) {
            this.value = value;
            return this;
        }

        @Override
        public @Nonnull BooleanVar toggle() {
            value = !value;
            return this;
        }

        @Override
        public boolean toggleAndGet() {
            value = !value;
            return value;
        }

        @Override
        public boolean getAndToggle() {
            return !toggleAndGet();
        }
    }

    private static final class ByteVarImpl implements ByteVar {

        private byte value;

        private ByteVarImpl(byte value) {
            this.value = value;
        }

        @Override
        public byte get() {
            return value;
        }

        @Override
        public @Nonnull ByteVar set(byte value) {
            this.value = value;
            return this;
        }

        @Override
        public byte incrementAndGet() {
            return ++value;
        }

        @Override
        public byte getAndIncrement() {
            return value++;
        }

        @Override
        public @Nonnull ByteVar add(int value) {
            this.value += (byte) value;
            return this;
        }
    }

    private static final class ShortVarImpl implements ShortVar {

        private short value;

        private ShortVarImpl(short value) {
            this.value = value;
        }

        @Override
        public short get() {
            return value;
        }

        @Override
        public @Nonnull ShortVar set(short value) {
            this.value = value;
            return this;
        }

        @Override
        public short incrementAndGet() {
            return ++value;
        }

        @Override
        public short getAndIncrement() {
            return value++;
        }

        @Override
        public @Nonnull ShortVar add(int value) {
            this.value += (short) value;
            return this;
        }
    }

    private static final class CharVarImpl implements CharVar {

        private char value;

        private CharVarImpl(char value) {
            this.value = value;
        }

        @Override
        public char get() {
            return value;
        }

        @Override
        public @Nonnull CharVar set(char value) {
            this.value = value;
            return this;
        }

        @Override
        public @Nonnull CharVar add(int value) {
            this.value += (char) value;
            return this;
        }

        @Override
        public char incrementAndGet() {
            return ++value;
        }

        @Override
        public char getAndIncrement() {
            return value++;
        }
    }

    private static final class IntVarImpl implements IntVar {

        private int value;

        private IntVarImpl(int value) {
            this.value = value;
        }

        @Override
        public int get() {
            return value;
        }

        @Override
        public @Nonnull IntVar set(int value) {
            this.value = value;
            return this;
        }

        @Override
        public int incrementAndGet() {
            return ++value;
        }

        @Override
        public int getAndIncrement() {
            return value++;
        }

        @Override
        public @Nonnull IntVar add(int value) {
            this.value += value;
            return this;
        }
    }

    private static final class LongVarImpl implements LongVar {

        private long value;

        private LongVarImpl(long value) {
            this.value = value;
        }

        @Override
        public long get() {
            return value;
        }

        @Override
        public @Nonnull LongVar set(long value) {
            this.value = value;
            return this;
        }

        @Override
        public long incrementAndGet() {
            return ++value;
        }

        @Override
        public long getAndIncrement() {
            return value++;
        }

        @Override
        public @Nonnull LongVar add(long value) {
            this.value += value;
            return this;
        }
    }

    private static final class FloatVarImpl implements FloatVar {

        private float value;

        private FloatVarImpl(float value) {
            this.value = value;
        }

        @Override
        public float get() {
            return value;
        }

        @Override
        public @Nonnull FloatVar set(float value) {
            this.value = value;
            return this;
        }

        @Override
        public @Nonnull FloatVar add(float value) {
            this.value += value;
            return this;
        }
    }

    private static final class DoubleVarImpl implements DoubleVar {

        private double value;

        private DoubleVarImpl(double value) {
            this.value = value;
        }

        @Override
        public double get() {
            return value;
        }

        @Override
        public @Nonnull DoubleVar set(double value) {
            this.value = value;
            return this;
        }

        @Override
        public @Nonnull DoubleVar add(double value) {
            this.value += value;
            return this;
        }
    }

    private VarBack() {
    }
}