summaryrefslogtreecommitdiff
path: root/src/main/java/sevenUnits/unit
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/sevenUnits/unit')
-rw-r--r--src/main/java/sevenUnits/unit/BaseDimension.java50
-rw-r--r--src/main/java/sevenUnits/unit/BaseUnit.java2
-rw-r--r--src/main/java/sevenUnits/unit/BritishImperial.java2
-rw-r--r--src/main/java/sevenUnits/unit/FunctionalUnit.java1
-rw-r--r--src/main/java/sevenUnits/unit/FunctionalUnitlike.java1
-rw-r--r--src/main/java/sevenUnits/unit/LinearUnit.java1
-rw-r--r--src/main/java/sevenUnits/unit/Metric.java1
-rw-r--r--src/main/java/sevenUnits/unit/MultiUnit.java1
-rw-r--r--src/main/java/sevenUnits/unit/NameSymbol.java280
-rw-r--r--src/main/java/sevenUnits/unit/Nameable.java59
-rw-r--r--src/main/java/sevenUnits/unit/Unit.java2
-rw-r--r--src/main/java/sevenUnits/unit/UnitDatabase.java23
-rw-r--r--src/main/java/sevenUnits/unit/UnitPrefix.java1
-rw-r--r--src/main/java/sevenUnits/unit/UnitValue.java2
-rw-r--r--src/main/java/sevenUnits/unit/Unitlike.java2
-rw-r--r--src/main/java/sevenUnits/unit/UnitlikeValue.java2
16 files changed, 53 insertions, 377 deletions
diff --git a/src/main/java/sevenUnits/unit/BaseDimension.java b/src/main/java/sevenUnits/unit/BaseDimension.java
index d5e98ca..bcd57d9 100644
--- a/src/main/java/sevenUnits/unit/BaseDimension.java
+++ b/src/main/java/sevenUnits/unit/BaseDimension.java
@@ -18,70 +18,58 @@ package sevenUnits.unit;
import java.util.Objects;
+import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.Nameable;
+
/**
* A dimension that defines a {@code BaseUnit}
*
* @author Adrien Hopkins
* @since 2019-10-16
*/
-public final class BaseDimension {
+public final class BaseDimension implements Nameable {
/**
* Gets a {@code BaseDimension} with the provided name and symbol.
*
- * @param name
- * name of dimension
- * @param symbol
- * symbol used for dimension
+ * @param name name of dimension
+ * @param symbol symbol used for dimension
* @return dimension
* @since 2019-10-16
*/
public static BaseDimension valueOf(final String name, final String symbol) {
return new BaseDimension(name, symbol);
}
-
+
/**
* The name of the dimension.
*/
private final String name;
/**
- * The symbol used by the dimension. Symbols should be short, generally one or two characters.
+ * The symbol used by the dimension. Symbols should be short, generally one
+ * or two characters.
*/
private final String symbol;
-
+
/**
* Creates the {@code BaseDimension}.
*
- * @param name
- * name of unit
- * @param symbol
- * symbol of unit
- * @throws NullPointerException
- * if any argument is null
+ * @param name name of unit
+ * @param symbol symbol of unit
+ * @throws NullPointerException if any argument is null
* @since 2019-10-16
*/
private BaseDimension(final String name, final String symbol) {
this.name = Objects.requireNonNull(name, "name must not be null.");
this.symbol = Objects.requireNonNull(symbol, "symbol must not be null.");
}
-
- /**
- * @return name
- * @since 2019-10-16
- */
- public final String getName() {
- return this.name;
- }
-
- /**
- * @return symbol
- * @since 2019-10-16
- */
- public final String getSymbol() {
- return this.symbol;
+
+ @Override
+ public NameSymbol getNameSymbol() {
+ return NameSymbol.of(this.name, this.symbol);
}
-
+
@Override
public String toString() {
- return String.format("%s (%s)", this.getName(), this.getSymbol());
+ return String.format("%s (%s)", this.name, this.symbol);
}
}
diff --git a/src/main/java/sevenUnits/unit/BaseUnit.java b/src/main/java/sevenUnits/unit/BaseUnit.java
index ee2c277..dba7f52 100644
--- a/src/main/java/sevenUnits/unit/BaseUnit.java
+++ b/src/main/java/sevenUnits/unit/BaseUnit.java
@@ -20,6 +20,8 @@ import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
+import sevenUnits.utils.NameSymbol;
+
/**
* A unit that other units are defined by.
* <p>
diff --git a/src/main/java/sevenUnits/unit/BritishImperial.java b/src/main/java/sevenUnits/unit/BritishImperial.java
index 743beeb..c6e65fb 100644
--- a/src/main/java/sevenUnits/unit/BritishImperial.java
+++ b/src/main/java/sevenUnits/unit/BritishImperial.java
@@ -16,6 +16,8 @@
*/
package sevenUnits.unit;
+import sevenUnits.utils.NameSymbol;
+
/**
* A static utility class that contains units in the British Imperial system.
*
diff --git a/src/main/java/sevenUnits/unit/FunctionalUnit.java b/src/main/java/sevenUnits/unit/FunctionalUnit.java
index df457e4..720b0af 100644
--- a/src/main/java/sevenUnits/unit/FunctionalUnit.java
+++ b/src/main/java/sevenUnits/unit/FunctionalUnit.java
@@ -19,6 +19,7 @@ package sevenUnits.unit;
import java.util.Objects;
import java.util.function.DoubleUnaryOperator;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/FunctionalUnitlike.java b/src/main/java/sevenUnits/unit/FunctionalUnitlike.java
index 2ee9e19..d6046c0 100644
--- a/src/main/java/sevenUnits/unit/FunctionalUnitlike.java
+++ b/src/main/java/sevenUnits/unit/FunctionalUnitlike.java
@@ -19,6 +19,7 @@ package sevenUnits.unit;
import java.util.function.DoubleFunction;
import java.util.function.ToDoubleFunction;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/LinearUnit.java b/src/main/java/sevenUnits/unit/LinearUnit.java
index 25c2e2e..deefc9a 100644
--- a/src/main/java/sevenUnits/unit/LinearUnit.java
+++ b/src/main/java/sevenUnits/unit/LinearUnit.java
@@ -19,6 +19,7 @@ package sevenUnits.unit;
import java.util.Objects;
import sevenUnits.utils.DecimalComparison;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
import sevenUnits.utils.UncertainDouble;
diff --git a/src/main/java/sevenUnits/unit/Metric.java b/src/main/java/sevenUnits/unit/Metric.java
index 3c4d291..78e3769 100644
--- a/src/main/java/sevenUnits/unit/Metric.java
+++ b/src/main/java/sevenUnits/unit/Metric.java
@@ -18,6 +18,7 @@ package sevenUnits.unit;
import java.util.Set;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/MultiUnit.java b/src/main/java/sevenUnits/unit/MultiUnit.java
index 83cdb03..bc240e3 100644
--- a/src/main/java/sevenUnits/unit/MultiUnit.java
+++ b/src/main/java/sevenUnits/unit/MultiUnit.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/NameSymbol.java b/src/main/java/sevenUnits/unit/NameSymbol.java
deleted file mode 100644
index 3e26138..0000000
--- a/src/main/java/sevenUnits/unit/NameSymbol.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/**
- * Copyright (C) 2019 Adrien Hopkins
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-package sevenUnits.unit;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * A class that can be used to specify names and a symbol for a unit.
- *
- * @author Adrien Hopkins
- * @since 2019-10-21
- */
-public final class NameSymbol {
- public static final NameSymbol EMPTY = new NameSymbol(Optional.empty(),
- Optional.empty(), new HashSet<>());
-
- /**
- * Creates a {@code NameSymbol}, ensuring that if primaryName is null and
- * otherNames is not empty, one name is moved from otherNames to primaryName
- *
- * Ensure that otherNames is a copy of the inputted argument.
- */
- private static final NameSymbol create(final String name,
- final String symbol, final Set<String> otherNames) {
- final Optional<String> primaryName;
-
- if (name == null && !otherNames.isEmpty()) {
- // get primary name and remove it from savedNames
- final Iterator<String> it = otherNames.iterator();
- assert it.hasNext();
- primaryName = Optional.of(it.next());
- otherNames.remove(primaryName.get());
- } else {
- primaryName = Optional.ofNullable(name);
- }
-
- return new NameSymbol(primaryName, Optional.ofNullable(symbol),
- otherNames);
- }
-
- /**
- * Gets a {@code NameSymbol} with a primary name, a symbol and no other
- * names.
- *
- * @param name name to use
- * @param symbol symbol to use
- * @return NameSymbol instance
- * @since 2019-10-21
- * @throws NullPointerException if name or symbol is null
- */
- public static final NameSymbol of(final String name, final String symbol) {
- return new NameSymbol(Optional.of(name), Optional.of(symbol),
- new HashSet<>());
- }
-
- /**
- * Gets a {@code NameSymbol} with a primary name, a symbol and additional
- * names.
- *
- * @param name name to use
- * @param symbol symbol to use
- * @param otherNames other names to use
- * @return NameSymbol instance
- * @since 2019-10-21
- * @throws NullPointerException if any argument is null
- */
- public static final NameSymbol of(final String name, final String symbol,
- final Set<String> otherNames) {
- return new NameSymbol(Optional.of(name), Optional.of(symbol),
- new HashSet<>(Objects.requireNonNull(otherNames,
- "otherNames must not be null.")));
- }
-
- /**
- * h * Gets a {@code NameSymbol} with a primary name, a symbol and additional
- * names.
- *
- * @param name name to use
- * @param symbol symbol to use
- * @param otherNames other names to use
- * @return NameSymbol instance
- * @since 2019-10-21
- * @throws NullPointerException if any argument is null
- */
- public static final NameSymbol of(final String name, final String symbol,
- final String... otherNames) {
- return new NameSymbol(Optional.of(name), Optional.of(symbol),
- new HashSet<>(Arrays.asList(Objects.requireNonNull(otherNames,
- "otherNames must not be null."))));
- }
-
- /**
- * Gets a {@code NameSymbol} with a primary name, no symbol, and no other
- * names.
- *
- * @param name name to use
- * @return NameSymbol instance
- * @since 2019-10-21
- * @throws NullPointerException if name is null
- */
- public static final NameSymbol ofName(final String name) {
- return new NameSymbol(Optional.of(name), Optional.empty(),
- new HashSet<>());
- }
-
- /**
- * Gets a {@code NameSymbol} with a primary name, a symbol and additional
- * names.
- * <p>
- * If any argument is null, this static factory replaces it with an empty
- * Optional or empty Set.
- * <p>
- * If {@code name} is null and {@code otherNames} is not empty, a primary
- * name will be picked from {@code otherNames}. This name will not appear in
- * getOtherNames().
- *
- * @param name name to use
- * @param symbol symbol to use
- * @param otherNames other names to use
- * @return NameSymbol instance
- * @since 2019-11-26
- */
- public static final NameSymbol ofNullable(final String name,
- final String symbol, final Set<String> otherNames) {
- return NameSymbol.create(name, symbol,
- otherNames == null ? new HashSet<>() : new HashSet<>(otherNames));
- }
-
- /**
- * h * Gets a {@code NameSymbol} with a primary name, a symbol and additional
- * names.
- * <p>
- * If any argument is null, this static factory replaces it with an empty
- * Optional or empty Set.
- * <p>
- * If {@code name} is null and {@code otherNames} is not empty, a primary
- * name will be picked from {@code otherNames}. This name will not appear in
- * getOtherNames().
- *
- * @param name name to use
- * @param symbol symbol to use
- * @param otherNames other names to use
- * @return NameSymbol instance
- * @since 2019-11-26
- */
- public static final NameSymbol ofNullable(final String name,
- final String symbol, final String... otherNames) {
- return create(name, symbol, otherNames == null ? new HashSet<>()
- : new HashSet<>(Arrays.asList(otherNames)));
- }
-
- /**
- * Gets a {@code NameSymbol} with a symbol and no names.
- *
- * @param symbol symbol to use
- * @return NameSymbol instance
- * @since 2019-10-21
- * @throws NullPointerException if symbol is null
- */
- public static final NameSymbol ofSymbol(final String symbol) {
- return new NameSymbol(Optional.empty(), Optional.of(symbol),
- new HashSet<>());
- }
-
- private final Optional<String> primaryName;
- private final Optional<String> symbol;
-
- private final Set<String> otherNames;
-
- /**
- * Creates the {@code NameSymbol}.
- *
- * @param primaryName primary name of unit
- * @param symbol symbol used to represent unit
- * @param otherNames other names and/or spellings, should be a mutable copy
- * of the argument
- * @since 2019-10-21
- */
- private NameSymbol(final Optional<String> primaryName,
- final Optional<String> symbol, final Set<String> otherNames) {
- this.primaryName = primaryName;
- this.symbol = symbol;
- otherNames.remove(null);
- this.otherNames = Collections.unmodifiableSet(otherNames);
-
- if (this.primaryName.isEmpty()) {
- assert this.otherNames.isEmpty();
- }
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (!(obj instanceof NameSymbol))
- return false;
- final NameSymbol other = (NameSymbol) obj;
- if (this.otherNames == null) {
- if (other.otherNames != null)
- return false;
- } else if (!this.otherNames.equals(other.otherNames))
- return false;
- if (this.primaryName == null) {
- if (other.primaryName != null)
- return false;
- } else if (!this.primaryName.equals(other.primaryName))
- return false;
- if (this.symbol == null) {
- if (other.symbol != null)
- return false;
- } else if (!this.symbol.equals(other.symbol))
- return false;
- return true;
- }
-
- /**
- * @return otherNames
- * @since 2019-10-21
- */
- public final Set<String> getOtherNames() {
- return this.otherNames;
- }
-
- /**
- * @return primaryName
- * @since 2019-10-21
- */
- public final Optional<String> getPrimaryName() {
- return this.primaryName;
- }
-
- /**
- * @return symbol
- * @since 2019-10-21
- */
- public final Optional<String> getSymbol() {
- return this.symbol;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result
- + (this.otherNames == null ? 0 : this.otherNames.hashCode());
- result = prime * result
- + (this.primaryName == null ? 0 : this.primaryName.hashCode());
- result = prime * result
- + (this.symbol == null ? 0 : this.symbol.hashCode());
- return result;
- }
-
- /**
- * @return true iff this {@code NameSymbol} contains no names or symbols.
- */
- public final boolean isEmpty() {
- // if primaryName is empty, otherNames must also be empty
- return this.primaryName.isEmpty() && this.symbol.isEmpty();
- }
-} \ No newline at end of file
diff --git a/src/main/java/sevenUnits/unit/Nameable.java b/src/main/java/sevenUnits/unit/Nameable.java
deleted file mode 100644
index ed23687..0000000
--- a/src/main/java/sevenUnits/unit/Nameable.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Copyright (C) 2020 Adrien Hopkins
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-package sevenUnits.unit;
-
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * An object that can hold one or more names, and possibly a symbol. The name
- * and symbol data should be immutable.
- *
- * @since 2020-09-07
- */
-public interface Nameable {
- /**
- * @return a {@code NameSymbol} that contains this object's primary name,
- * symbol and other names
- * @since 2020-09-07
- */
- NameSymbol getNameSymbol();
-
- /**
- * @return set of alternate names
- * @since 2020-09-07
- */
- default Set<String> getOtherNames() {
- return this.getNameSymbol().getOtherNames();
- }
-
- /**
- * @return preferred name of object
- * @since 2020-09-07
- */
- default Optional<String> getPrimaryName() {
- return this.getNameSymbol().getPrimaryName();
- }
-
- /**
- * @return short symbol representing object
- * @since 2020-09-07
- */
- default Optional<String> getSymbol() {
- return this.getNameSymbol().getSymbol();
- }
-}
diff --git a/src/main/java/sevenUnits/unit/Unit.java b/src/main/java/sevenUnits/unit/Unit.java
index 005b6f7..9866e9c 100644
--- a/src/main/java/sevenUnits/unit/Unit.java
+++ b/src/main/java/sevenUnits/unit/Unit.java
@@ -22,6 +22,8 @@ import java.util.Objects;
import java.util.function.DoubleUnaryOperator;
import sevenUnits.utils.DecimalComparison;
+import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.Nameable;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/UnitDatabase.java b/src/main/java/sevenUnits/unit/UnitDatabase.java
index 18ac619..b029539 100644
--- a/src/main/java/sevenUnits/unit/UnitDatabase.java
+++ b/src/main/java/sevenUnits/unit/UnitDatabase.java
@@ -47,6 +47,8 @@ import java.util.regex.Pattern;
import sevenUnits.utils.ConditionalExistenceCollections;
import sevenUnits.utils.DecimalComparison;
import sevenUnits.utils.ExpressionParser;
+import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.NamedObjectProduct;
import sevenUnits.utils.ObjectProduct;
import sevenUnits.utils.UncertainDouble;
@@ -1197,7 +1199,7 @@ public final class UnitDatabase {
* @since 2019-03-14
* @since v0.2.0
*/
- private final Map<String, ObjectProduct<BaseDimension>> dimensions;
+ private final Map<String, NamedObjectProduct<BaseDimension>> dimensions;
/**
* A map mapping strings to units (including prefixes)
@@ -1313,9 +1315,16 @@ public final class UnitDatabase {
*/
public void addDimension(final String name,
final ObjectProduct<BaseDimension> dimension) {
- this.dimensions.put(
- Objects.requireNonNull(name, "name must not be null."),
- Objects.requireNonNull(dimension, "dimension must not be null."));
+ Objects.requireNonNull(name, "name may not be null");
+ Objects.requireNonNull(dimension, "dimension may not be null");
+ if (dimension instanceof NamedObjectProduct) {
+ this.dimensions.put(name,
+ (NamedObjectProduct<BaseDimension>) dimension);
+ } else {
+ final NamedObjectProduct<BaseDimension> namedDimension = dimension
+ .withName(NameSymbol.ofName(name));
+ this.dimensions.put(name, namedDimension);
+ }
}
/**
@@ -1367,7 +1376,7 @@ public final class UnitDatabase {
throw e;
}
- this.addDimension(name, dimension);
+ this.addDimension(name, dimension.withName(NameSymbol.ofName(name)));
}
}
@@ -1463,7 +1472,7 @@ public final class UnitDatabase {
throw e;
}
- this.addUnit(name, unit);
+ this.addUnit(name, unit.withName(NameSymbol.ofName(name)));
}
}
}
@@ -1510,7 +1519,7 @@ public final class UnitDatabase {
* @since 2019-04-13
* @since v0.2.0
*/
- public Map<String, ObjectProduct<BaseDimension>> dimensionMap() {
+ public Map<String, NamedObjectProduct<BaseDimension>> dimensionMap() {
return Collections.unmodifiableMap(this.dimensions);
}
diff --git a/src/main/java/sevenUnits/unit/UnitPrefix.java b/src/main/java/sevenUnits/unit/UnitPrefix.java
index 308f4b0..bf9d1fd 100644
--- a/src/main/java/sevenUnits/unit/UnitPrefix.java
+++ b/src/main/java/sevenUnits/unit/UnitPrefix.java
@@ -21,6 +21,7 @@ import java.util.Optional;
import java.util.Set;
import sevenUnits.utils.DecimalComparison;
+import sevenUnits.utils.NameSymbol;
/**
* A prefix that can be applied to a {@code LinearUnit} to multiply it by some value
diff --git a/src/main/java/sevenUnits/unit/UnitValue.java b/src/main/java/sevenUnits/unit/UnitValue.java
index f6d18f8..339263d 100644
--- a/src/main/java/sevenUnits/unit/UnitValue.java
+++ b/src/main/java/sevenUnits/unit/UnitValue.java
@@ -19,6 +19,8 @@ package sevenUnits.unit;
import java.util.Objects;
import java.util.Optional;
+import sevenUnits.utils.NameSymbol;
+
/**
* A value expressed in a unit.
*
diff --git a/src/main/java/sevenUnits/unit/Unitlike.java b/src/main/java/sevenUnits/unit/Unitlike.java
index d2dcbbb..68de2c2 100644
--- a/src/main/java/sevenUnits/unit/Unitlike.java
+++ b/src/main/java/sevenUnits/unit/Unitlike.java
@@ -22,6 +22,8 @@ import java.util.Objects;
import java.util.function.DoubleFunction;
import java.util.function.ToDoubleFunction;
+import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.Nameable;
import sevenUnits.utils.ObjectProduct;
/**
diff --git a/src/main/java/sevenUnits/unit/UnitlikeValue.java b/src/main/java/sevenUnits/unit/UnitlikeValue.java
index edc13ca..26354b1 100644
--- a/src/main/java/sevenUnits/unit/UnitlikeValue.java
+++ b/src/main/java/sevenUnits/unit/UnitlikeValue.java
@@ -18,6 +18,8 @@ package sevenUnits.unit;
import java.util.Optional;
+import sevenUnits.utils.NameSymbol;
+
/**
*
* @since 2020-09-07