summaryrefslogtreecommitdiff
path: root/src/main/java/sevenUnits/unit/LinearUnit.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/sevenUnits/unit/LinearUnit.java')
-rw-r--r--src/main/java/sevenUnits/unit/LinearUnit.java143
1 files changed, 70 insertions, 73 deletions
diff --git a/src/main/java/sevenUnits/unit/LinearUnit.java b/src/main/java/sevenUnits/unit/LinearUnit.java
index 7191196..85f6dd9 100644
--- a/src/main/java/sevenUnits/unit/LinearUnit.java
+++ b/src/main/java/sevenUnits/unit/LinearUnit.java
@@ -26,7 +26,7 @@ import sevenUnits.utils.UncertainDouble;
/**
* A unit that can be expressed as a product of its base and a number. For
* example, kilometres, inches and pounds.
- *
+ *
* @author Adrien Hopkins
* @since 2019-10-16
* @since v0.3.0
@@ -35,7 +35,7 @@ public final class LinearUnit extends Unit {
/**
* Gets a {@code LinearUnit} from a unit and a value. For example, converts
* '59 °F' to a linear unit with the value of '288.15 K'
- *
+ *
* @param unit unit to convert
* @param value value to convert
* @return value expressed as a {@code LinearUnit}
@@ -48,11 +48,11 @@ public final class LinearUnit extends Unit {
Objects.requireNonNull(unit, "unit must not be null.").getBase(),
unit.convertToBase(value), NameSymbol.EMPTY);
}
-
+
/**
* Gets a {@code LinearUnit} from a unit and a value. For example, converts
* '59 °F' to a linear unit with the value of '288.15 K'
- *
+ *
* @param unit unit to convert
* @param value value to convert
* @param ns name(s) and symbol of unit
@@ -67,7 +67,7 @@ public final class LinearUnit extends Unit {
Objects.requireNonNull(unit, "unit must not be null.").getBase(),
unit.convertToBase(value), ns);
}
-
+
/**
* @param unit unit to get base version of
* @return the base unit associated with {@code unit}, as a
@@ -78,12 +78,12 @@ public final class LinearUnit extends Unit {
public static LinearUnit getBase(final Unit unit) {
return new LinearUnit(unit.getBase(), 1, NameSymbol.EMPTY);
}
-
+
/**
* Gets a {@code LinearUnit} from a unit base and a conversion factor. In
* other words, gets the product of {@code unitBase} and
* {@code conversionFactor}, expressed as a {@code LinearUnit}.
- *
+ *
* @param unitBase unit base to multiply by
* @param conversionFactor number to multiply base by
* @return product of base and conversion factor
@@ -95,12 +95,12 @@ public final class LinearUnit extends Unit {
final double conversionFactor) {
return new LinearUnit(unitBase, conversionFactor, NameSymbol.EMPTY);
}
-
+
/**
* Gets a {@code LinearUnit} from a unit base and a conversion factor. In
* other words, gets the product of {@code unitBase} and
* {@code conversionFactor}, expressed as a {@code LinearUnit}.
- *
+ *
* @param unitBase unit base to multiply by
* @param conversionFactor number to multiply base by
* @param ns name(s) and symbol of unit
@@ -113,22 +113,22 @@ public final class LinearUnit extends Unit {
final double conversionFactor, final NameSymbol ns) {
return new LinearUnit(unitBase, conversionFactor, ns);
}
-
+
/**
* The value of this unit as represented in its base form. Mathematically,
- *
+ *
* <pre>
* this = conversionFactor * getBase()
* </pre>
- *
+ *
* @since 2019-10-16
* @since v0.3.0
*/
private final double conversionFactor;
-
+
/**
* Creates the {@code LinearUnit}.
- *
+ *
* @param unitBase base of linear unit
* @param conversionFactor conversion factor between base and unit
* @since 2019-10-16
@@ -139,21 +139,21 @@ public final class LinearUnit extends Unit {
super(unitBase, ns);
this.conversionFactor = conversionFactor;
}
-
+
/**
* {@inheritDoc}
- *
+ *
* Converts by dividing by {@code conversionFactor}
*/
@Override
protected double convertFromBase(final double value) {
return value / this.getConversionFactor();
}
-
+
/**
* Converts an {@code UncertainDouble} value expressed in this unit to an
* {@code UncertainValue} value expressed in {@code other}.
- *
+ *
* @param other unit to convert to
* @param value value to convert
* @return converted value
@@ -170,35 +170,34 @@ public final class LinearUnit extends Unit {
if (this.canConvertTo(other))
return value.timesExact(
this.getConversionFactor() / other.getConversionFactor());
- else
- throw new IllegalArgumentException(
- String.format("Cannot convert from %s to %s.", this, other));
-
+ throw new IllegalArgumentException(
+ String.format("Cannot convert from %s to %s.", this, other));
+
}
-
+
/**
* {@inheritDoc}
- *
+ *
* Converts by multiplying by {@code conversionFactor}
*/
@Override
protected double convertToBase(final double value) {
return value * this.getConversionFactor();
}
-
+
/**
* Converts an {@code UncertainDouble} to the base unit.
- *
+ *
* @since 2020-09-07
* @since v0.3.0
*/
UncertainDouble convertToBase(final UncertainDouble value) {
return value.timesExact(this.getConversionFactor());
}
-
+
/**
* Divides this unit by a scalar.
- *
+ *
* @param divisor scalar to divide by
* @return quotient
* @since 2018-12-23
@@ -207,10 +206,10 @@ public final class LinearUnit extends Unit {
public LinearUnit dividedBy(final double divisor) {
return valueOf(this.getBase(), this.getConversionFactor() / divisor);
}
-
+
/**
* Returns the quotient of this unit and another.
- *
+ *
* @param divisor unit to divide by
* @return quotient of two units
* @throws NullPointerException if {@code divisor} is null
@@ -219,24 +218,23 @@ public final class LinearUnit extends Unit {
*/
public LinearUnit dividedBy(final LinearUnit divisor) {
Objects.requireNonNull(divisor, "other must not be null");
-
+
// divide the units
- final ObjectProduct<BaseUnit> base = this.getBase()
- .dividedBy(divisor.getBase());
+ final var base = this.getBase().dividedBy(divisor.getBase());
return valueOf(base,
this.getConversionFactor() / divisor.getConversionFactor());
}
-
+
/**
* {@inheritDoc}
- *
+ *
* Uses the base and conversion factor of units to test for equality.
*/
@Override
public boolean equals(final Object obj) {
if (!(obj instanceof LinearUnit))
return false;
- final LinearUnit other = (LinearUnit) obj;
+ final var other = (LinearUnit) obj;
return Objects.equals(this.getBase(), other.getBase())
&& Double.compare(this.getConversionFactor(),
other.getConversionFactor()) == 0;
@@ -244,18 +242,18 @@ public final class LinearUnit extends Unit {
/**
* @param other unit to test equality with
- * @return true iff this unit and other are equal,
- * ignoring small differences caused by floating-point error.
- *
- * @apiNote This method is not transitive,
- * so it cannot be used as an equals method.
+ * @return true iff this unit and other are equal, ignoring small differences
+ * caused by floating-point error.
+ *
+ * @apiNote This method is not transitive, so it cannot be used as an equals
+ * method.
*/
public boolean equalsApproximately(final LinearUnit other) {
return Objects.equals(this.getBase(), other.getBase())
&& DecimalComparison.equals(this.getConversionFactor(),
other.getConversionFactor());
}
-
+
/**
* @return conversion factor
* @since 2019-10-16
@@ -264,10 +262,10 @@ public final class LinearUnit extends Unit {
public double getConversionFactor() {
return this.conversionFactor;
}
-
+
/**
* {@inheritDoc}
- *
+ *
* Uses the base and conversion factor to compute a hash code.
*/
@Override
@@ -275,7 +273,7 @@ public final class LinearUnit extends Unit {
return 31 * this.getBase().hashCode()
+ Double.hashCode(this.getConversionFactor());
}
-
+
/**
* @return whether this unit is equivalent to a {@code BaseUnit} (i.e. there
* is a {@code BaseUnit b} where
@@ -286,7 +284,7 @@ public final class LinearUnit extends Unit {
public boolean isBase() {
return this.isCoherent() && this.getBase().isSingleObject();
}
-
+
/**
* @return whether this unit is coherent (i.e. has conversion factor 1)
* @since 2019-10-16
@@ -295,7 +293,7 @@ public final class LinearUnit extends Unit {
public boolean isCoherent() {
return this.getConversionFactor() == 1;
}
-
+
/**
* Returns the difference of this unit and another.
* <p>
@@ -304,7 +302,7 @@ public final class LinearUnit extends Unit {
* does not meet this condition, an {@code IllegalArgumentException} will be
* thrown.
* </p>
- *
+ *
* @param subtrahend unit to subtract
* @return difference of units
* @throws IllegalArgumentException if {@code subtrahend} is not compatible
@@ -315,18 +313,18 @@ public final class LinearUnit extends Unit {
*/
public LinearUnit minus(final LinearUnit subtrahend) {
Objects.requireNonNull(subtrahend, "addend must not be null.");
-
+
// reject subtrahends that cannot be added to this unit
if (!this.getBase().equals(subtrahend.getBase()))
throw new IllegalArgumentException(String.format(
"Incompatible units for subtraction \"%s\" and \"%s\".", this,
subtrahend));
-
+
// subtract the units
return valueOf(this.getBase(),
this.getConversionFactor() - subtrahend.getConversionFactor());
}
-
+
/**
* Returns the sum of this unit and another.
* <p>
@@ -335,7 +333,7 @@ public final class LinearUnit extends Unit {
* does not meet this condition, an {@code IllegalArgumentException} will be
* thrown.
* </p>
- *
+ *
* @param addend unit to add
* @return sum of units
* @throws IllegalArgumentException if {@code addend} is not compatible for
@@ -346,21 +344,21 @@ public final class LinearUnit extends Unit {
*/
public LinearUnit plus(final LinearUnit addend) {
Objects.requireNonNull(addend, "addend must not be null.");
-
+
// reject addends that cannot be added to this unit
if (!this.getBase().equals(addend.getBase()))
throw new IllegalArgumentException(String.format(
"Incompatible units for addition \"%s\" and \"%s\".", this,
addend));
-
+
// add the units
return valueOf(this.getBase(),
this.getConversionFactor() + addend.getConversionFactor());
}
-
+
/**
* Multiplies this unit by a scalar.
- *
+ *
* @param multiplier scalar to multiply by
* @return product
* @since 2018-12-23
@@ -369,10 +367,10 @@ public final class LinearUnit extends Unit {
public LinearUnit times(final double multiplier) {
return valueOf(this.getBase(), this.getConversionFactor() * multiplier);
}
-
+
/**
* Returns the product of this unit and another.
- *
+ *
* @param multiplier unit to multiply by
* @return product of two units
* @throws NullPointerException if {@code multiplier} is null
@@ -381,24 +379,23 @@ public final class LinearUnit extends Unit {
*/
public LinearUnit times(final LinearUnit multiplier) {
Objects.requireNonNull(multiplier, "other must not be null");
-
+
// multiply the units
- final ObjectProduct<BaseUnit> base = this.getBase()
- .times(multiplier.getBase());
+ final var base = this.getBase().times(multiplier.getBase());
return valueOf(base,
this.getConversionFactor() * multiplier.getConversionFactor());
}
-
+
@Override
public String toDefinitionString() {
return Double.toString(this.conversionFactor)
+ (this.getBase().equals(ObjectProduct.empty()) ? ""
: " " + this.getBase().toString(BaseUnit::getShortName));
}
-
+
/**
* Returns this unit but to an exponent.
- *
+ *
* @param exponent exponent to exponentiate unit to
* @return exponentiated unit
* @since 2019-01-15
@@ -408,11 +405,11 @@ public final class LinearUnit extends Unit {
return valueOf(this.getBase().toExponent(exponent),
Math.pow(this.conversionFactor, exponent));
}
-
+
/**
* Returns this unit to an exponent, rounding the resulting dimensions to the
* nearest integer.
- *
+ *
* @param exponent exponent to raise unit to
* @return result of rounded exponentation
* @since 2024-08-22
@@ -423,12 +420,12 @@ public final class LinearUnit extends Unit {
return valueOf(this.getBase().toExponentRounded(exponent),
Math.pow(this.conversionFactor, exponent));
}
-
+
@Override
public LinearUnit withName(final NameSymbol ns) {
return valueOf(this.getBase(), this.getConversionFactor(), ns);
}
-
+
/**
* Returns the result of applying {@code prefix} to this unit.
* <p>
@@ -438,7 +435,7 @@ public final class LinearUnit extends Unit {
* have a symbol. <br>
* This method ignores alternate names of both this unit and the provided
* prefix.
- *
+ *
* @param prefix prefix to apply
* @return unit with prefix
* @since 2019-03-18
@@ -446,8 +443,8 @@ public final class LinearUnit extends Unit {
* @throws NullPointerException if prefix is null
*/
public LinearUnit withPrefix(final UnitPrefix prefix) {
- final LinearUnit unit = this.times(prefix.getMultiplier());
-
+ final var unit = this.times(prefix.getMultiplier());
+
// create new name and symbol, if possible
final String name;
if (this.getPrimaryName().isPresent()
@@ -456,14 +453,14 @@ public final class LinearUnit extends Unit {
} else {
name = null;
}
-
+
final String symbol;
if (this.getSymbol().isPresent() && prefix.getSymbol().isPresent()) {
symbol = prefix.getSymbol().get() + this.getSymbol().get();
} else {
symbol = null;
}
-
+
return unit.withName(NameSymbol.ofNullable(name, symbol));
}
}