Ranides Atterwim há 4 anos atrás
pai
commit
225b650451

+ 315 - 0
assira.core/src/main/java/net/ranides/assira/math/MutableNumber.java

@@ -0,0 +1,315 @@
+package net.ranides.assira.math;
+
+import java.math.BigInteger;
+
+public abstract class MutableNumber extends Number {
+
+    public abstract void set(Number value);
+
+    public abstract void increment();
+
+    public abstract void decrement();
+
+    public abstract void add(Number value);
+
+    public abstract void subtract(Number value);
+
+    public abstract void divide(Number value);
+
+    public abstract void multiply(Number value);
+
+    public abstract void pow(Number value);
+
+    public abstract void negate();
+
+    public abstract void abs();
+
+    public static MutableInt of(int value) {
+        return new MutableInt(value);
+    }
+
+    public static MutableLong of(long value) {
+        return new MutableLong(value);
+    }
+
+    public static MutableDouble of(double value) {
+        return new MutableDouble(value);
+    }
+
+    public static class MutableInt extends MutableNumber implements Comparable<MutableInt> {
+
+        private static final long serialVersionUID = 2L;
+
+        private int value;
+
+        public MutableInt(int value) {
+            this.value = value;
+        }
+
+        @Override
+        public int intValue() {
+            return value;
+        }
+
+        @Override
+        public long longValue() {
+            return value;
+        }
+
+        @Override
+        public float floatValue() {
+            return value;
+        }
+
+        @Override
+        public double doubleValue() {
+            return value;
+        }
+
+        @Override
+        public int compareTo(MutableInt value) {
+            return Integer.compare(this.value, value.value);
+        }
+
+        @Override
+        public void set(Number value) {
+            this.value = value.intValue();
+        }
+
+        public void set(int value) {
+            this.value = value;
+        }
+
+        @Override
+        public void increment() {
+            this.value++;
+        }
+
+        @Override
+        public void decrement() {
+            this.value--;
+        }
+
+
+        @Override
+        public void add(Number value) {
+            this.value += value.intValue();
+        }
+
+        @Override
+        public void subtract(Number value) {
+            this.value -= value.intValue();
+        }
+
+        @Override
+        public void divide(Number value) {
+            this.value /= value.intValue();
+        }
+
+        @Override
+        public void multiply(Number value) {
+            this.value *= value.intValue();
+        }
+
+        @Override
+        public void pow(Number value) {
+            this.value = BigInteger.valueOf(this.value).pow(value.intValue()).intValue();
+        }
+
+        @Override
+        public void negate() {
+            this.value = -this.value;
+        }
+
+        @Override
+        public void abs() {
+            this.value = Math.abs(this.value);
+        }
+
+    }
+
+    public static class MutableLong extends MutableNumber implements Comparable<MutableLong> {
+
+        private static final long serialVersionUID = 2L;
+
+        private long value;
+
+        public MutableLong(long value) {
+            this.value = value;
+        }
+
+        @Override
+        public int intValue() {
+            return (int)value;
+        }
+
+        @Override
+        public long longValue() {
+            return value;
+        }
+
+        @Override
+        public float floatValue() {
+            return value;
+        }
+
+        @Override
+        public double doubleValue() {
+            return value;
+        }
+
+        @Override
+        public int compareTo(MutableLong value) {
+            return Long.compare(this.value, value.value);
+        }
+
+        @Override
+        public void set(Number value) {
+            this.value = value.longValue();
+        }
+
+        public void set(long value) {
+            this.value = value;
+        }
+
+        @Override
+        public void increment() {
+            this.value++;
+        }
+
+        @Override
+        public void decrement() {
+            this.value--;
+        }
+
+
+        @Override
+        public void add(Number value) {
+            this.value += value.longValue();
+        }
+
+        @Override
+        public void subtract(Number value) {
+            this.value -= value.longValue();
+        }
+
+        @Override
+        public void divide(Number value) {
+            this.value /= value.longValue();
+        }
+
+        @Override
+        public void multiply(Number value) {
+            this.value *= value.longValue();
+        }
+
+        @Override
+        public void pow(Number value) {
+            this.value = BigInteger.valueOf(this.value).pow(value.intValue()).longValue();
+        }
+
+        @Override
+        public void negate() {
+            this.value = -this.value;
+        }
+
+        @Override
+        public void abs() {
+            this.value = Math.abs(this.value);
+        }
+
+    }
+
+    public static class MutableDouble extends MutableNumber implements Comparable<MutableDouble> {
+
+        private static final long serialVersionUID = 2L;
+
+        private double value;
+
+        public MutableDouble(double value) {
+            this.value = value;
+        }
+
+        @Override
+        public int intValue() {
+            return (int)value;
+        }
+
+        @Override
+        public long longValue() {
+            return (long)value;
+        }
+
+        @Override
+        public float floatValue() {
+            return (float)value;
+        }
+
+        @Override
+        public double doubleValue() {
+            return value;
+        }
+
+        @Override
+        public int compareTo(MutableDouble value) {
+            return Double.compare(this.value, value.value);
+        }
+
+        @Override
+        public void set(Number value) {
+            this.value = value.doubleValue();
+        }
+
+        public void set(double value) {
+            this.value = value;
+        }
+
+        @Override
+        public void increment() {
+            this.value++;
+        }
+
+        @Override
+        public void decrement() {
+            this.value--;
+        }
+
+
+        @Override
+        public void add(Number value) {
+            this.value += value.doubleValue();
+        }
+
+        @Override
+        public void subtract(Number value) {
+            this.value -= value.doubleValue();
+        }
+
+        @Override
+        public void divide(Number value) {
+            this.value /= value.doubleValue();
+        }
+
+        @Override
+        public void multiply(Number value) {
+            this.value *= value.doubleValue();
+        }
+
+        @Override
+        public void pow(Number value) {
+            this.value = Math.pow(this.value, value.doubleValue());
+        }
+
+        @Override
+        public void negate() {
+            this.value = -this.value;
+        }
+
+        @Override
+        public void abs() {
+            this.value = Math.abs(this.value);
+        }
+
+    }
+
+}