summaryrefslogtreecommitdiff
path: root/src/org/unitConverter/unit/LinearUnit.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/unitConverter/unit/LinearUnit.java')
-rw-r--r--src/org/unitConverter/unit/LinearUnit.java57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/org/unitConverter/unit/LinearUnit.java b/src/org/unitConverter/unit/LinearUnit.java
index ab46f1e..64eff1f 100644
--- a/src/org/unitConverter/unit/LinearUnit.java
+++ b/src/org/unitConverter/unit/LinearUnit.java
@@ -27,7 +27,7 @@ import org.unitConverter.dimension.UnitDimension;
* @since 2018-12-22
* @since v0.1.0
*/
-public final class LinearUnit extends AbstractUnit {
+public final class LinearUnit extends AbstractUnit implements OperatableUnit {
/**
* The value of one of this unit in this unit's base unit
*
@@ -134,6 +134,40 @@ public final class LinearUnit extends AbstractUnit {
return result;
}
+ @Override
+ public LinearUnit negated() {
+ return new LinearUnit(this.getBase(), -this.getConversionFactor());
+ }
+
+ @Override
+ public OperatableUnit plus(final OperatableUnit addend) {
+ Objects.requireNonNull(addend, "addend must not be null.");
+
+ // reject addends that cannot be added to this unit
+ if (!this.getSystem().equals(addend.getSystem()))
+ throw new IllegalArgumentException(
+ String.format("Incompatible units for addition or subtraction \"%s\" and \"%s\".", this, addend));
+ if (!this.getDimension().equals(addend.getDimension()))
+ throw new IllegalArgumentException(
+ String.format("Incompatible units for addition or subtraction \"%s\" and \"%s\".", this, addend));
+
+ // add the units
+ if (addend instanceof BaseUnit)
+ // since addend's dimension is equal to this unit's dimension, and there is only one base unit per
+ // system-dimension, addend must be this unit's base.
+ return new LinearUnit(this.getBase(), this.getConversionFactor() + 1);
+ else if (addend instanceof LinearUnit)
+ return new LinearUnit(this.getBase(),
+ this.getConversionFactor() + ((LinearUnit) addend).getConversionFactor());
+ else
+ return addend.times(this);
+ }
+
+ @Override
+ public LinearUnit reciprocal() {
+ return this.toExponent(-1);
+ }
+
/**
* Multiplies this unit by a scalar.
*
@@ -164,6 +198,26 @@ public final class LinearUnit extends AbstractUnit {
return new LinearUnit(base, this.getConversionFactor() * other.getConversionFactor());
}
+ @Override
+ public OperatableUnit times(final OperatableUnit multiplier) {
+ Objects.requireNonNull(multiplier, "multiplier must not be null.");
+
+ // reject multipliers that cannot be muliplied by this unit
+ if (!this.getSystem().equals(multiplier.getSystem()))
+ throw new IllegalArgumentException(String
+ .format("Incompatible units for multiplication or division \"%s\" and \"%s\".", this, multiplier));
+
+ // multiply the units
+ if (multiplier instanceof BaseUnit) {
+ final BaseUnit newBase = this.getBase().times((BaseUnit) multiplier);
+ return new LinearUnit(newBase, this.getConversionFactor());
+ } else if (multiplier instanceof LinearUnit) {
+ final BaseUnit base = this.getBase().times(multiplier.getBase());
+ return new LinearUnit(base, this.getConversionFactor() * ((LinearUnit) multiplier).getConversionFactor());
+ } else
+ return multiplier.times(this);
+ }
+
/**
* Returns this unit but to an exponent.
*
@@ -173,6 +227,7 @@ public final class LinearUnit extends AbstractUnit {
* @since 2019-01-15
* @since v0.1.0
*/
+ @Override
public LinearUnit toExponent(final int exponent) {
return new LinearUnit(this.getBase().toExponent(exponent), Math.pow(this.conversionFactor, exponent));
}